我已经获得了使用2.3 servlet规范将i18n引入J2EE Web应用程序的(相当艰巨的)任务。该应用程序非常庞大,已经积极开发了8年多。
因此,我想第一次把事情做好,这样我就可以限制我需要在JSP,JavaScript文件,servlet和其他任何地方乱写的时间,用消息包中的值替换硬编码的字符串。 / p>
这里没有使用框架。我怎样才能支持i18n。请注意,我希望每个视图都有一个JSP,它可以从(a)属性文件加载文本,而不是为每个支持的语言环境加载不同的JSP。
我想我的主要问题是我是否可以在'后端'中的某处设置区域设置(即在登录时从用户配置文件中读取区域设置并在会话中存储值)然后期望JSP页面能够正确加载来自正确属性文件的指定字符串(即,当语言环境为法语时,来自messages_fr.properties),而不是添加逻辑以在每个JSP中查找正确的语言环境。
我有什么想法可以解决这个问题吗?
答案 0 :(得分:19)
答案 1 :(得分:1)
您可以使用带标记的JSTL标准标记库来完成此操作。获取JSTL规范的副本,阅读i8N章节,讨论一般文本+日期,时间,货币。写得非常清楚,并向您展示如何使用标签完成所有操作。您还可以通过编程方式设置Locale等内容
答案 2 :(得分:1)
你不(并且不应该)每个语言环境需要一个单独的JSP文件。艰巨的任务是弄清楚不是i18n-ed并将它们移动到每个语言环境的文件,比如messages_en.properties,messages_fr.properties等等。
根据您的逻辑,可以在多个位置进行区域设置计算。我们支持存储在数据库中的用户区域设置以及浏览器区域设置。进入您的应用程序的每个请求都将有一个“Accept-Language”标题,指示您的浏览器配置的语言是什么,具有首选项,即首先是日语,然后是英语。如果是这种情况,应用程序应该读取messages_ja.properties以及不在该文件中的密钥,回退到messages_en.properties。对于存储在数据库中的用户区域设置,情况也是如此。请注意,标准只是在浏览器中切换语言并期望内容为i18n-ed。 (我们最初开始在数据库中存储区域设置,然后从浏览器移动到支持区域设置)。此外,由于翻译人员错过了将英语(主语言文件)中的键和值复制到其他语言,因此您将需要默认值,因此您需要默认使用英语来获取其他文件中没有的值。
我还发现mygengo在向其他知道特定语言的人提供翻译工作时非常有用,它为我们节省了大量时间。