翻译的最佳实践

我正在使用JSP编写一个网站。 我希望网站有多种语言版本,所以我为我计划支持的每种语言创建了一个HashMap ,并通过map.get("identifier")找到了文本map.get("identifier")当然还有一些其他代码)。

我遇到的问题是我之前通过使用format函数解决的问题(类似于许多语言中的printf ),但这是另一种语言。

具体问题是像User performed action文本可能会Action was performed by user以另一种语言User performed action (即术语可能会出现故障)。

在过去,我做过类似#translate("Welcome to the site, %s!", {"Username"}) ,然后使用语言的formatfunction将%s替换为用户名。 我可以简单地使用String#replace但是我不能做像#translate("Welcome to the site, %s! You last visited on %s!", {"username", "last visit"})这样的事情#translate("Welcome to the site, %s! You last visited on %s!", {"username", "last visit"})就像我一样我想。

很抱歉,如果这是一个不好的解释 – 只需在PHP之类的内容中查找printf

在Java中复制这样的东西的最佳方法是什么? 谢谢您的帮助。

不要重新发明。 使用JSTL fmt taglib 。 它也支持参数化消息。

    

也可以看看:

  • 如何国际化Java Web应用程序? – 一个迷你教程

我一直坚持这个问题,我发现最好的方法是像所有人(或几乎每个人)一样使用资源包。 您可以使用fmt taglib或spring消息。

我尝试使用gettext解决方案,但它包含一些先前的步骤(xgettext,msgmerge,msgfmt),这使得这太复杂了,对于webapp来说不太好(在我看来)。

我将使用spring消息,你可以看到一个例子:

http://viralpatel.net/blogs/2010/07/spring-3-mvc-internationalization-i18n-localization-tutorial-example.html

使用属性文件具有不同的语言

 en_US.properties fr_CA.properties 

并在那些属性文件中,让你的文字像那样

 user.performed.action=User performed an action 

然后如BalusC所说,使用JSTL。