Java 本地化最佳实践

标签 java swing localization

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

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

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

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

最佳答案

其实你说的是Internationalization(i18n),不是Localization(L10n)。 根据我的经验,您走在正确的道路上。

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

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

广告 3)。我见过几种本地化数据库的方法,但最好的(这不仅是我的意见,也是 IEEE 成员的意见)是存储资源 key 并使用适当的语言环境在客户端重新创建数据。当然这适用于预装数据,如果你让用户输入数据,就会出现其他问题......没有 Elixir ,一个人需要考虑什么最适合他/她的情况。我倾向于包含一个外键列来标识语言,但这实际上取决于将要存储的数据类型。

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

如果你想阅读关于 i18n 和 L10n 主题的好书,那将节省你学习这些主题的多年时间(虽然没有必要会教你如何编程),Microsoft Press 有一本好书:“Developing国际软件"- http://www.amazon.com/Developing-International-Software-Dr/dp/0735615837 .它仍然有意义,尽管已经很老了。

关于Java 本地化最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3629945/

相关文章:

java - 如何从 Eclipse 运行 Javah

java - JButton setIcon 更新错误

Java Swing定时器如何使用

ASP.NET 元 :resourcekey

java - 使用或不使用 Spring Beans 有什么区别?

java - 如何转换数据

Java:基于时间的线程锁定

java - KeyAdapter 在 JPanel 类中不起作用,但在 JFrame 类中起作用

.net - 有没有办法在.NET 中自动生成对应的resx 文件进行字符串本地化?

c# - 为枚举提供本地化的最佳方式是什么?