本地化传统产品?

时间:2014-12-19 22:59:37

标签: java localization translation legacy

相对简单的问题。我需要翻译/本地化旧的Java应用程序。

我们的公司,新的应用程序使用Java中的.properties文件来本地化他们的字符串,这个概念非常类似于C#中的.resx文件(我们也有使用它的产品)。

问题是这是我们开始考虑本地化之前的遗留产品。它充满了硬编码字符串以及各种形式的硬编码字符串连接/格式化。

据我所知,我有一项非常艰巨的任务,即将所有字符串和格式化为产品中的.properties文件,然后在代码中引用它们。

我个人在做这项工作时没有什么大问题,但我想确保我没有遗漏任何东西。

所以我有几个一般性的问题。

  • 是否有更快的方式将我的产品转换为使用 .properties个文件?我可以写一个脚本 这将使30-40%的工作自动化......

  • 有没有"陷阱"我应该担心具体转换遗产 产品(我不是在寻找一般的本地化"陷阱"我 可以谷歌,但这个场景特定的任何东西)?

  • 最后,我有什么完全不同的策略 本土化?这就是我们翻译现有产品的方式, 但因为这是一个遗留产品(并且在议程上) 重写)这基本上是丢掉的代码,我可以做任何我想做的事情。包括刚才 找到最便宜最脏的方式,虽然我是 显然倾向于正确地完成工作。

任何想法,人们?

作为指导,我会说尝试将答案集中在所提出的问题上,但是在评论中欢迎提供任何信息贡献或问题。

1 个答案:

答案 0 :(得分:1)

不,没有更快的方法。你必须逐行完成代码。

有很多问题,因为国际化不仅仅是字符串常量。

您可能已经知道需要对数字格式和日期格式进行本地化,但是您需要通过串联或StringBuilder.append调用来查找嵌入到字符串中的数字和日期。您还需要注意隐式toString()调用,例如当Number或Date作为Swing模型值提供时(例如,从TableModel.getValueAt方法返回Number),或者JSP或JSF EL表达式直接引用这样的值而不是格式化它。

同样,请注意直接向用户显示的枚举常量,隐式调用它们的toString()方法。

通过字符串连接创建句子不仅是因为数字,日期和枚举的格式化,而且因为其他语言可能具有不同的句子结构排序。这种字符串连接应该用本地化的MessageFormats替换。

需要对键击进行本地化,包括所有助记符(如果它是桌面应用程序,则为加速器)。

布局是一个问题。应用程序采用从左到右方向的位置是您想要解决的问题;即使您只是计划本地化其他从左到右的语言,您可能知道推迟良好的i18n实践会在以后遇到麻烦。

如果您的应用是Swing应用,那么您需要将LEFT / WEST和RIGHT / EAST布局约束转换为LINE_START和LINE_END。如果你的应用程序是一个Web应用程序,你需要考虑边距左,边距右,填充左,填充权限,边框左边界和右边边界(以及可能还有很多其他的我'我忘了)进入lang特定的CSS块。

Swing应用也需要在构建每个窗口后调用applyComponentOrientation,通常在调用pack()之前。

一些程序员喜欢将UI的一部分存储在数据库中。我不是在谈论用户内容(你不应该对其进行本地化);我正在谈论标签文本,窗口标题,布局约束等。我个人非常不喜欢这种做法,但人们会这样做。如果你的应用程序正在这样做,我想数据库表需要一个语言环境列,或者需要完全删除在数据库中存储UI的做法。

要回答你的最后一个问题,如果有更好的策略而不是单步执行代码,我从未听说过它们。当然,您可以在代码中搜索双引号字符。我想这个选择取决于你的上司希望应用程序看起来多么专业和优雅。

我学到的一件事就是丢弃代码通常不是。如果重写最终试图从遗留版本中挽救大量代码,那就不要感到惊讶。