当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 3 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : Emacs菜单中文化翻译原理&项目寻求维护者
帖子发表于 : 2013-04-06 22:38 
头像

注册: 2007-12-17 21:41
帖子: 783
送出感谢: 67
接收感谢: 23
Emacs菜单中文化翻译原理&项目寻求维护者
by Careone, 2013-04-05

参考地址: viewtopic.php?f=17&t=212467
贴子主题: Emacs中文菜单汉化包deb下载(不必修改 ~/.emacs文件就能显示中文界面)
附件:
文件注释: 包含:
1* 本贴内容;
2* emacs-locale-dev成品开发包(deb/tar.gz格式各1份);
3* emacs-locale-dev半成品开发包(无法正常运行,期待bash/lisp编程高手协助代码待改良)

emacs-locale-todo.20130406.zip [261.71 KiB]
被下载 37 次

* 工作原理:
** 1 检查命令行参数是否有效,是否有相应的el源码文件,是否有对应语言的翻译脚本
可执行;

** 2 分别翻译 ~/emacs-xx.x/lisp/*/*.el 为Linux 和 Windows版本;
Linux:翻译后的 .el 文件保存位置(以简体中文 zh_CN 为例):
~/emacs-locale/usr/share/emacs/XX.X/site-lisp/zh_CN/lisp/*/*.el
(变量定义:
XX.X=$EVER, 即完整版本号
zh_CN=$ELANG, 即语言)

Windows:翻译后的 .el 文件保存位置(以简体中文 zh_CN 为例):
~/emacs-locale/windows/emacs-XX.X/site-lisp/zh_CN/lisp/*/*.el
(变量定义:
XX.X=$EVER, 即完整版本号
zh_CN=$ELANG, 即语言)

** 3 翻译脚本的位置及语法
*** 脚本保存在以下目录(以简体中文 zh_CN 为例):
/usr/local/share/careone/emacs-locale-dev/zh_CN/bin/
(变量定义:
/usr/local/share/careone/emacs-locale-dev = $EMACS_LOCALE_DEV_PATH
希望在下一版本中调整变量名称及路径为 $DEVDIR = /usr/local/share/emacs-locale-dev

zh_CN = $ELANG
)

目录下对应的翻译脚本示例:
sed.menu-bar.sh (作用:翻译lisp/menu-bar.el 文件)
sed.org_org.sh (作用:翻译lisp/org/org.el 文件)
...

*** 翻译脚本的语法:
目前脚本语法写得比较死,示例如下:
./sed.menu-bar.sh -t zh_CN 24.3
代表把 Emacs 24.3 翻译为 zh_CN (即简体中文)

希望有bash 编程高手能出面改良代码,实现同时对多种语言,多个版本的同步翻译。期望
中的语法如下:
./sed.menu-bar.sh -v 24.3 -l zh_CN
./sed.menu-bar.sh -v 24.3 -l zh_CN zh_TW
./sed.menu-bar.sh -v 24.3 22.3 -l zh_CN zh_TW
./sed.menu-bar.sh -l zh_CN zh_TW -v 24.3 22.3

说明:
-v 参数代表Emacs版本,-l 参数(字母l,不是数字1)代表翻译语言;

编程思路:
用两个数组来保存语言和版本两组变量,如A_ELANG 保存语言数组;A_EVER保
存版本数组,然后用 for 或者其它循环来依次执行最基本的单一语言单一版本翻译;

循环原则:
以下面的命令行为例:
./sed.menu-bar.sh -l zh_CN zh_TW -v 22.3 24.3
应先运行
./sed.menu-bar.sh -l zh_CN -v 22.3 24.3

再运行
./sed.menu-bar.sh -l zh_TW -v 22.3 24.3
(因为翻译为不同版本时,调用的是同一翻译脚本;如果翻译为不同语言,调用的是不同
的翻译脚本。这样可以减少频繁的读取翻译脚本文件,提升效率);

** 4 一个复合脚本来调用多个基本翻译脚本
目前我是这样实现的:
创建了以下脚本:
/usr/local/bin/emacs-transor

*** 脚本内容示例如下:

#! /bin/sh
#1 翻译部分
/usr/local/share/careone/emacs-locale-dev/zh_CN/bin/sed.menu-bar.sh -t zh_CN 24.3
/usr/local/share/careone/emacs-locale-dev/zh_CN/bin/sed.org_org.sh -t zh_CN 24.3
...
# 2 提取主版本号并创建自加载文件到指定位置
#参考命令行: sed.menu-bar.sh -t zh_CN 24.3
# $0 $1 $2 $3
MVER=$(echo "scale=0; $3 / 1" | bc)
## 如果全部的 .../sed.*.sh 翻译脚本完成工作,创建以下文件(以Emacs 24.3 为例)
~/emacs-locale/etc/emacs24/site-start.d/86zh_CN.el

#(变量定义:
#24 = $MVER
#zh_CN = $ELANG )

## 脚本示例结束

*** 脚本已知风险(待改进):
1 如果用户是自行下载编译的非正式版的 Emacs, 如 Emacs 24.2.99 之类,版本号中出
现2个小数点,上面的 MVER 用 bc 来计算时会出错(带1个小数点的可以识别为数字,但
是带2个小数点的会被识别为字符串,也就无法用 bc 进行数学运算);

2 不适用于 XEmacs(需要额外进行处理).
如 XEmacs 21.4.29, 主版本号为 21.4;
XEmacs 22.5.22,主版本号为22.5

** 5 /etc/emacsXX/site-start.d/86zh_CN.el 的内容
内容示例如下(共4行):

(load "zh_CN/custom/mule")
(load "zh_CN/custom/codings-24")
(load "zh_CN/custom/setting-24")
(load "zh_CN/custom/font-24")

*** 上面第1行的作用:
手动加载
/usr/share/emacs/site-lisp/zh_CN/custom/mule.el 文件。
mule.el 文件的内容示例如下(作用:手动加载翻译过的菜单界面文件,实现翻译效果):

(load "zh_CN/lisp/menu-bar")
(load "zh_CN/lisp/org/org")
...

*** 其它几行的作用:
第2行:加入文字编码识别顺序,用于更好地支持中文;
第3行:加入常用设置,如显示行号,列号;
第4行:设置显示字体(保留功能,暂未启用);
与这几行相关的 .el 文件都保存在这个目录:
/usr/share/emacs/site-lisp/zh_CN/custom/
(备注:还使用了另一个用户可选自定义配置文件的目录:
/usr/share/emacs/site-lisp/zh_CN/locale/
主要用于支持输入类似下面的命令
/usr/local/bin/emacs-locale -u zh_CN 24
来实现快速设置为本地化语言菜单。

*** 说明:
某些 .el 不需要在 mule.el 中写入load 指令,在调用时会自动读取翻译过的 .el 文件。
如 lisp/dired.el, lisp/org/org.el

*** 已知风险:
如果同时存在多个语言版本的翻译文件,如同时存在简体中文和繁体中文的 dired.el 翻
译文件,如下所示:
/usr/share/emacs/24.3/site-lisp/zh_CN/lisp/dired.el
/usr/share/emacs/24.3/site-lisp/zh_TW/lisp/dired.el

那么在调用 dired 功能时,可能会不确定地出现简体或繁体中文菜单的 dired ,造成界
面语言混乱;

解决思路:
也许可以通过读取 env 环境变量中 LOCALE 的值来读取指定语言的翻译文件;

** 6 所有版本,所有语言翻译完成后,复制必要的README,CHANGELOG等其它文件;
*** 复制源(from):
/usr/local/share/careone/emacs-locale-dev/src/develop/control
/usr/local/share/careone/emacs-locale-dev/src/zh_CN/control
/usr/local/share/careone/emacs-locale-dev/src/README
/usr/local/share/careone/emacs-locale-dev/src/ChangeLog
...

*** 复制到(to):
~/emacs-locale/usr/local/share/careone/emacs-locale/zh_CN/src/develop/control
~/emacs-locale/usr/local/share/careone/emacs-locale/zh_CN/src/control
~/emacs-locale/usr/local/share/careone/emacs-locale/zh_CN/src/README
~/emacs-locale/usr/local/share/careone/emacs-locale/zh_CN/src/ChangeLog

说明:
复制源中的src/zh_CN/control,以及复制到的 src/control 是 emacs-locale-zh-cn 的
deb 打包配置文件;
而 src/develop/control 则是开发包 emacs-locale-dev 的打包配置文件;

** 7 针对 Emacs for Windows 的额外的 reg 注册表文件
这些 reg 注册表文件不影响 Emacs 菜单语言翻译效果,作用是添加 .el 文件的自动关
联,以及可以用 Emacs 打开任意文件。
参考的 Emacs for Windows 目录位置及可执行文件为:
d:\emacs-xx.x\bin\runemacs.exe

*** 复制源(from):
/usr/local/share/careone/emacs-locale-dev/windows/reg/emacs-24.3.reg
/usr/local/share/careone/emacs-locale-dev/windows/reg/emacs-22.3.reg
/usr/local/share/careone/emacs-locale-dev/windows/reg/emacs-unreg.reg
...

*** 复制到(to):
~/emacs-locale/windows/reg/emacs-24.3.reg
~/emacs-locale/windows/reg/emacs-22.3.reg
~/emacs-locale/windows/reg/emacs-unreg.reg
...

** 8 自己写的小扩展(ui-menu.el) 从英文菜单直接切换到简体中文菜单
写得较粗糙,暂时只支持从英文切换到简体中文。
真心希望有熟悉 lisp 的朋友,能把这个扩展改良,写得更正规些,能支持更多语言。
文件源位置如下:
/usr/local/share/careone/emacs-locale-dev/usr/share/emacs/contrib/ui-menu.el

翻译时会复制到以下位置:
~/emacs-locale/usr/share/emacsXX/site-lisp/zh_CN/languages/ui-menu.el

希望以后 ui-menu.el 正规化后,能收录到 Emacs 官方内置扩展,能设定一个独立的目
录,如
/usr/share/emacsXX/lisp/interface/ui-menu.el
也算是给它一个完美的归宿。

*** 说明:
因为从 Emacs 22.3 版本起,对分隔符的代码进行了调整,因此
复制后的
~/emacs-locale/usr/share/emacs/22.2/site-lisp/zh_CN/languages/ui-menu.el
~/emacs-locale/usr/share/emacs/22.3/site-lisp/zh_CN/languages/ui-menu.el
实际内容是用 sed 语句进行了必要的替换处理的,因此文件内容并不相同,是存在新旧
两种版本的。旧版本适用于22.2 及之前的旧版本,新版本适用于22.3 及后续版本。

** 9 关于Emacs 菜单国际化中的一些问题
因为Emacs 内置扩展的作者并不是使用英语作为母语,在保留他们的姓名时,有时会出现
使用非英文字符的情况,那么这时这个 .el 文件 就会被识别为非ASCII 纯英文文本,直
接翻译成简体中文(或者其它语言)时,很可能出现编码混乱,造成某些字符串无法翻译
或翻译无效

*** 例1 如某些版本的 lisp/calendar/lunar.el ,字符串“巴海派日期”的原始字符
串非英文,因此在翻译这个文件时,应先根据系统识别出的文字编码,通过 iconv 命令转
换为utf8编码,再在文件头中强制写上 "-*- coding: utf-8 -*-"这几个符号,强制指定
本文件为utf8编码,然后再进行翻译就正常了;

*** 例2 如 Emacs 23.4, lisp/net/eudc.el
第7行,作者名称非英文字符。直接翻译会导致翻译后的文件无效。
解决方案:
先用 iconv 转换为 utf8编码,再在文件头加上 "-*- coding: utf-8 -*-"
再翻译就能正常工作了。

*** 展望
希望有能和 Emacs 官方说得上话的朋友,给官方提个建议:把官方所有内置emacs扩展,
都在文件头写上 coding: utf-8 来锁定文件编码,方便 Emacs 的国际化推广。

** 10 结束语
个人从2009年开始寻求 Emacs 的翻译和菜单中文化,最开始是采用前辈 叶文彬提供的
english-menu.el + chinese-menu.el + mule-menu.el 方案。
这一方案有以下几点不足:
1 不适用于 Emacs for Windows , 会出现菜单整体乱码;
2 Emacs 版本变更时,上面提到的3个文件的代码要同步更新,工作量大;

后来自己查了一些资料,反复测试,终于找到了现行方案。
因个人工作原因及个人精力有限,现将解决思路和目前进展写成此文,希望熟悉bash
编程,熟悉 Emacs lisp 的朋友,能接手这一项目,并能形成一个有活力的 emacs-locale
团队,持续地,长久地把这个项目维持下去。

另外,有意协助本项目的,不论你对bash熟不熟,或是对 Emacs lisp熟不熟,只要
有兴趣,愿意投入精力,即使现在不会,经过一段时间的了解,也会得到很大的很获。
我一直相信这样一句话:心在,路就在!

愿各位 Emacs 爱好者,共同努力!

** 附1: XEmacs 21.4.22, 22.5.29 for Windows的简体中文翻译方法,
我已在本论坛写了
相关的贴子,有兴趣的朋友也关注一下。(说明:经实测,这一方案对 XEmacs 21.4.22
for Ubuntu 10.04 无效,即无法实现中文菜单,但以上2个版本在Windows下都能正常显示
中文菜单(翻译要点:一定要把翻译后的文件编码转为Windows下的gb2312或unicode,用
utf-8编码反而会在Windows下出现乱码菜单无法使用)。

** 附2:已有的emacs-locale-dev翻译开发包和emacs-locale-zh-cn简体中文语言包
*** 成品(旧版本): emacs-locale-zh-cn.deb
简体中文语言包,适用于 emacs 22.3 - 24.3
下载地址:

*** 成品(旧版本): emacs-locale-dev.deb
开发包,适用于 emacs 22.3 -24.3
下载地址:

*** 半成品(较新): emacs-locale-dev.deb
开发包,适用于 Emacs 所有版本(代码仍处在开发中,暂无法正常工作,需要bash高手
改良脚本)
下载地址:

*** 代码优化说明:
建议先查看旧版本成品 emacs-locale-dev中的 bin/sed.*.sh 翻译脚本,再
在新版本的半成品中进行代码优化。

------------------------------------------------------
by Careone, 2013-04-05


_________________
* 日本人说:就算我们不拜靖国神社,韩国人也不会买我们的东西;
就算我们拜靖国神社,中国人照样买我们的东西。

* 历史不相信眼泪。能挡住狼的不是篱笆,而是棍子和猎枪。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/


页首
 用户资料  
 
2 楼 
 文章标题 : Re: Emacs菜单中文化翻译原理&项目寻求维护者
帖子发表于 : 2013-05-16 9:40 

注册: 2013-05-14 19:12
帖子: 3
系统: ubuntu 13.04
送出感谢: 0 次
接收感谢: 0 次
我还是老老实实用vim吧 ,随便消灭0回复


页首
 用户资料  
 
3 楼 
 文章标题 : Re: Emacs菜单中文化翻译原理&项目寻求维护者
帖子发表于 : 2013-05-16 12:26 
头像

注册: 2007-08-07 18:14
帖子: 234
送出感谢: 4
接收感谢: 3
能学会用emacs,认识那些英文菜单应该没什么压力吧...


_________________
什么是历史?历史是魔术师箱子里那只变来变去的小白鸽;
什么是真相,真相只是观众最愿意看到的硬币的那一面。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 3 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译