Java本地化最佳实践

时间:2010-09-02 18:15:46

标签: java swing localization

我有一个带有服务器和Swing客户端的Java应用程序。现在我需要本地化用户界面,并且可能还需要一些特定于区域设置的数据。具体而言,我想听听你的意见。

  1. 我应该如何将UI的本地化字符串分发到属性文件中?在我的应用程序中有几个视图,每个视图都有几个面板。我应该为每个面板或视图的每种语言设置一个本地化文件,还是应该将一种语言的所有翻译保留在同一个文件中?我目前倾向于每个视图和语言一个文件,但我不知道如何处理在许多地方出现的某些特定于域的术语。对几个文件进行相同的翻译听起来不太好。
  2. 服务器抛出一些异常,其中包含应向用户显示的消息。我可以从会话中获取所选的区域设置并在服务器上处理本地化,但我觉得将所有本地化文件保留在客户端会更优雅。我一直在考虑只从服务器发送一个本地化密钥,其中包含某种占位符以获取特定于错误的信息,这些信息将与异常一起发送。然后,客户端可以基于本地化密钥构造消息,并用错误特定信息替换占位符。这听起来像是处理它的好方法,还是有其他选择?通常,我的异常消息包含一些针对每种情况而更改的附加信息。例如,“用户名为Khilon的用户已经存在”,在这种情况下,属性文件中的字符串将类似于“用户名为{0}的用户” EM>”。
  3. 数据的本地化是我最不清楚的领域。由于我不确定是否需要,我到目前为止还没有计划得太多。数据库部分听起来很简单,你基本上只需要一个额外的字符串表和一个列来告诉字符串是哪个语言环境。虽然我不确定每个数据表(例如Product和Product_names)是否最好有一个本地化表,或者我可以使用一个表来表示所有数据表的本地化字符串。真正棘手的部分是如何处理UI,因为在某种程度上,用户需要为多种语言的对象输入文本。在实践中,这可能意味着,例如,芬兰的一名工人会给该对象一个芬兰语和英语的名称,然后另一个国家的工人可以将其翻译成她自己的语言。如果你们中的任何人做过类似的事情,我会很高兴听到你们这样做了。
  4. 我非常感谢所有能与我分享经验的人。

    P.S。如果您碰巧知道有关该主题的任何特别好的网站或书籍,我会很高兴听到他们。我当然做了一些谷歌搜索并阅读了一些关于本地化的文章,但没什么好事的。

2 个答案:

答案 0 :(得分:13)

实际上,你所说的是国际化(i18n),而不是本地化(L10n)。 根据我的经验,你走的是正确的道路。

ad 1)。每个视图和区域设置一个属性文件(不是必需的语言,因为您可能希望根据国家/地区对某些语言使用不同的翻译,即使用英语和美国英语的不同字符串,因此使用不同的语言环境)是正确的方法。由于应用程序趋于发展,当您只想修改一个视图时,它可以节省大量资金(因为翻译人员甚至会收取他们不会触摸的内容 - 他们必须实际找到需要更新的字符串/新翻译)。如果你正确使用翻译记忆库工具也会更容易(文件末尾的新字符串)。

ad 2)。最好的想法是仅从服务器或其他进程发送资源密钥;其他方法可能是使用分隔符附加资源键和可能的数据(即数值),因此可以重新创建消息并将其重新格式化为本地语言。

ad 3)。我已经看到了几种本地化数据库的方法,但最好的(不仅是我的意见,还有IEEE成员)是存储资源键并使用适当的语言环境在客户端重新创建数据。当然这适用于预先安装的数据,如果你让用户输入数据,其他问题就会出现......没有银弹,需要考虑什么在他/她的环境中最有效。我倾向于包含一个识别语言的外键列,但它实际上取决于将要存储的数据类型。

不幸的是i18n并没有在此结束,请记住正确格式化日期和数字,以便使用您的程序的人可以理解它们。而且,如果您碰巧有一些字符串列表,排序顺序也应该依赖于语言环境(它称为整理)。 太阳曾经(现在我们心爱的甲骨文)拥有相当不错的i18n路径,你可以在这里找到:http://download.oracle.com/javase/tutorial/i18n/index.html

如果你想阅读有关i18n和L10n主题的好书,这将为你节省多年的学习这些主题(虽然没有必要教会你如何编程),微软出版社有一本很好的书:“开发国际软件“ - http://www.amazon.com/Developing-International-Software-Dr/dp/0735615837。它仍然相关,虽然很老。

答案 1 :(得分:2)

1)我通常将所有内容保存在一个文件中,并使用表示属性使用位置的名称。例如,我的前缀是“view”和“menu”

  • view.add_request.title
  • view.add_request.contact_information.sectionheader
  • view.add_request.contact_information.first_name.label
  • view.add_request.contact_information.last_name.label
  • menu.admin.user_management.add_user.label
  • menu.admin.user_management.add_role.label

2)是的,传递密钥使事情变得更简单,使服务器代码更容易测试。它还避免了必须将区域设置信息传递给服务器以使其决定客户端的语言。它是一个厚客户端,所以让它处理本地化。

3)我之前没有本地化数据(通常只是标签和静态UI verbage),但我可能倾向于使用一个包含所有本地化字符串和语言环境的表来开始(只是为了保持简单) 。我不确定您在参考用户界面时所询问的内容,但我建议您确保您使用的任何字符集都允许您想要支持的所有语言。请务必阅读Joel Spolsky撰写的文章:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)