Java本地化最佳实践

Car*_*los 18 java swing localization

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

  1. 我应该如何将UI的本地化字符串分发到属性文件中?在我的应用程序中有几个视图,每个视图都有几个面板.我应该为每个面板或视图的每种语言设置一个本地化文件,还是应该将一种语言的所有翻译保留在同一个文件中?我目前倾向于每个视图和语言一个文件,但我不确定如何处理出现在许多地方的某些特定于域的术语.在几个文件上进行相同的翻译听起来不太好.
  2. 服务器抛出一些异常,其中包含应向用户显示的消息.我可以从会话中获取所选的区域设置并在服务器上处理本地化,但我觉得将所有本地化文件保留在客户端会更优雅.我一直在考虑只从服务器发送一个本地化密钥,其中包含某种占位符以获取特定于错误的信息,这些信息将与异常一起发送.然后,客户端可以基于本地化密钥构造消息,并用错误特定信息替换占位符.这听起来像是处理它的好方法,还是有其他选择?通常,我的异常消息包含一些针对每种情况而更改的附加信息.例如," 用户名为Khilon的用户已经存在",在这种情况下,属性文件中的字符串将类似于" 用户名为{0}的用户已存在 ".
  3. The localization of the data is the area that is the most unclear to me. As I'm not sure if it will be ever required, I have so far not planned it very much. The database part sounds straightforward enough, you basically just need an additional table for the strings and a column to tell for which locale the string is. Though I'm not sure if it would be best to have a localization table for each data table (eg Product and Product_names), or could I use one table for localization strings for all the data tables. The really tricky part is how to handle the UI, as to some degree it would be required for an user to enter text for an object in multiple languages. In practice this could mean for example, that a worker in Finland would give the object a name in Finnish and English, and then a worker in another country could translate it to her own language. If any of you has done something similar, I'd be happy to hear how you did it.

I'm very grateful to everybody who can share their experiences with me.

P.S. If you happen to know any exceptionally good websites or books on the subject, I would be happy to hear of them. I have of course done some googling and read some articles about localization, but nothing mind blowing yet.

Paw*_*yda 13

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

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

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

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

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

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