Java 本地化最佳实践

2022-09-02 22:09:35

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

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

我非常感谢所有能与我分享经验的人。

附言:如果您碰巧知道任何关于这个主题的非常好的网站或书籍,我会很高兴听到它们。当然,我已经做了一些谷歌搜索,并阅读了一些关于本地化的文章,但还没有令人振奋。


答案 1

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

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

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

广告3)。我已经看到了几种本地化数据库的方法,但最好的(不仅是我的观点,也是IEEE成员)是使用适当的区域设置在客户端存储资源密钥并重新创建数据。当然,这适用于预安装的数据,如果您让用户输入数据,则会出现其他问题...没有银弹,人们需要考虑在他/她的背景下最有效的方法。我倾向于包括一个外键列来标识语言,但这实际上取决于将要存储的数据类型。

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

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


答案 2

1)我通常将所有内容保存在一个文件中,并使用表示属性使用位置的名称。例如,我以“视图”和“菜单”等内容为前缀

  • view.add_request.标题
  • 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措辞),但我可能倾向于使用一个包含所有本地化字符串和区域设置的表(只是为了保持简单)。我不确定你在提到UI时问什么,但我建议你确保你使用的任何字符集都允许你想要支持的所有语言。确保你读过Joel Spolsky的文章,标题为:绝对最小每个软件开发人员绝对,肯定必须了解Unicode和字符集(没有借口!


推荐