Eclipse 如何国际化java源代码?
编辑:我完全重写了这个问题,因为在前两个版本中我似乎不够清楚感谢您目前提出的建议。 我想国际化一个教程项目的源代码(请注意,不是运行时应用程序)。下面是一个示例(Java): 英文版,然后法文版是:Eclipse 如何国际化java源代码?,eclipse,internationalization,antlr,abstract-syntax-tree,Eclipse,Internationalization,Antlr,Abstract Syntax Tree,编辑:我完全重写了这个问题,因为在前两个版本中我似乎不够清楚感谢您目前提出的建议。 我想国际化一个教程项目的源代码(请注意,不是运行时应用程序)。下面是一个示例(Java): 英文版,然后法文版是: /** Un commentaire */ public String faitQuelqueChose() { System.out.println("Quelque chose a été fait avec succès."); } 等等。然后在某个地方有一个类似属性文件的东西,可以使用
/** Un commentaire */
public String faitQuelqueChose() {
System.out.println("Quelque chose a été fait avec succès.");
}
等等。然后在某个地方有一个类似属性文件的东西,可以使用常用工具编辑这些翻译,例如:
com.foo.class.comment1=A comment
com.foo.class.method1=doSomething
com.foo.class.string1=Something was done successfully
其他语文:
com.foo.class.comment1=Un commentaire
com.foo.class.method1=faitQuelqueChose
com.foo.class.string1=Quelque chose a été fait avec succès.
我正试图找到最简单、最有效、最不引人注目的方法,用最少的人工繁重的工作来完成这项工作(当然不是翻译实际的文本)。最好在Eclipse下工作。例如,原始代码将用英语编写,然后外部化(到属性,最好保持原始源代码不变),翻译(人工),然后重新生成(作为单独的源文件/项目)
我发现了一些线索(亚历克斯建议的除外):
- ,一个语言分析器/生成器。似乎有一种支持
- 使用(抽象语法树)和我猜构建某种插件
我只是很惊讶,现在还没有一个工具可以做到这一点。使用.properties文件,比如:
Locale locale = new Locale(language, country);
ResourceBundle captions= ResourceBundle.getBundle("Messages",locale);
这样,Java根据当前本地(从操作系统或Java语言环境设置中获取)选择Messages.properties文件
该文件应位于类路径上,称为Messages.properties(默认值),或Messages_de.properties(德语)等
有关完整教程,请参见以下内容:
就源代码而言,我强烈建议继续使用英语。像getUnternehmen()这样的方法名对普通开发人员来说比普通英文的更糟糕。
如果您需要让外国开发人员熟悉您的代码,请用他们的语言编写适当的开发人员文档
如果您想同时使用英语和其他语言的Javadoc,请参见此。对于打印/记录的字符串,java具有一些国际化功能,即ResourceBundle。有一个关于这个的教程 Eclipse也具有这种功能(“外部化字符串”,我记得) 对于函数名,我不认为存在任何问题,因为这将要求您在许多版本上维护代码源
关于我将使用唯一的字符串作为方法名(或任何您希望被本地化版本替换的内容)
public String m37hod_1() {
System.out.println(m355a6e_1);
}
然后我会为每种语言定义一个propertyfile,如下所示:
m37hod_1=doSomething
m355a6e_1="Something was done successfully"
然后我会编写一个小程序,解析源文件并替换字符串。所以eclipse之外的一切都是这样
或者我也会使用ant任务和PropertyFile,而不是独立的翻译程序。
诸如此类:
<replace
file="${src}/*.*"
value="defaultvalue"
propertyFile="${language}.properties">
<replacefilter
token="m37hod_1"
property="m37hod_1"/>
<replacefilter
token="m355a6e_1"
property="m355a6e_1"/>
</replace>
使用其中一种方法,您不必在教程中解释任何有关本地化的内容(除非您愿意),但可以专注于真正的主题。一种方法是用一种语言完成代码,然后翻译成其他语言 您可以使用Eclipse来帮助您
- 标识符:在大纲视图(窗口>显示视图>大纲)中,选择每个项目,然后重构>重命名(Alt+Shift+R)。这将负责重命名使用的标识符
- 注释:使用搜索>文件查找“/*”或“/”的所有实例。单击每个实例并修改
- 字符串:
- 使用Source>Externalize字符串查找所有文字字符串
- 搜索>文件中的“Messages.getString()”
- 单击每个结果并修改
- 在每个文件上,“编辑>查找/替换”,将“/\$NON-NLS-.*\$”替换为空字符串
您需要的是一个大规模的代码更改引擎 ANTLR无法做到这一点;AST是必要的,但还不够。请参阅我的文章。如果Eclipse包提供一些对名称和类型解析的支持,Eclipse的“AST”可能会更好;否则您将永远无法找到如何替换每个“doSomething”(可能是重载的或本地的),除非您愿意完全相同地替换它们(您可能无法这样做,因为有些符号引用Java库元素) DMS可以将Java解析为AST(包括注释捕获),以任意方式遍历AST,分析/更改AST,并将修改后的AST导出为有效的源代码(包括注释) 基本上,您希望枚举所有注释、字符串和标识符声明,将它们导出到外部“数据库”以映射(手动?通过Google Translate?)为等效项。在每种情况下,您不仅要注意感兴趣的项,还要注意其精确位置(源文件、行、甚至列)因为在原始文本中拼写相同的项目在修改后的文本中可能需要不同的拼写 如果使用AST,字符串的枚举非常容易;只需爬树并查找包含字符串文本的树节点(ANTLR和Eclipse当然也可以做到这一点) 如果解析器捕获了注释,那么注释的枚举也很简单。DMS捕获了注释。我不太确定ANTLR的Java语法是否捕获了注释,或者EclipseAST引擎是否捕获了注释;我怀疑它们都有能力 声明(类、方法、字段、局部变量)的枚举相对简单;需要担心的情况更多(例如,包含基类扩展的匿名类)。您可以编写一个过程来遍历AST并匹配树结构,但DMS开始发挥作用的地方是:您可以编写与要匹配的源代码类似的表面语法模式。例如:
<replace
file="${src}/*.*"
value="defaultvalue"
propertyFile="${language}.properties">
<replacefilter
token="m37hod_1"
property="m37hod_1"/>
<replacefilter
token="m355a6e_1"
property="m355a6e_1"/>
</replace>
pattern local_for_loop_index(i: IDENTIFIER, t: type, e: expression, e2: expression, e3:expression): for_loop_header
= "for (\t \i = \e,\e2,\e3)"
/** ${lang['doSomething.comment']} */
public String ${lang['doSomething.methodName']}() {
System.out.println("${lang['doSomething.message']}");
}
doSomething.comment=A comment
doSomething.methodName=doSomething
doSomething.message=Something was done successfully