【问题标题】:internationalization in JSP/Spring with nested keysJSP/Spring 中使用嵌套键的国际化
【发布时间】:2012-05-26 06:29:29
【问题描述】:

寻找一种允许嵌套键的干净的国际化方法。

例如消息 = 请检查您的引导是否有工具。
现在,引导一词在 s/w 的 100 多个字符串中使用,当我去客户端 X 时,他说用主干更改引导。所以想创建具有嵌入在值中的键的语言文件,例如

message = 请检查您的 {boot} 以获取工具。
引导 = 主干

这将是一个 SaaS 应用程序,我们将允许用户通过 Web 界面更改字符串。

【问题讨论】:

    标签: java spring internationalization


    【解决方案1】:

    我不确定这是个好主意:

    • 您如何知道哪些单词或单词序列在实际发生变化之前容易发生变化?
    • 如果客户 X 想从句子中删除“请”怎么办?
    • 您打算如何处理复数形式、不同的语法规则、单词之间的体裁差异等(所有这些在几种不同的语言中)?

    恕我直言,要么您的系统过于简单,但在 2% 的情况下符合要求,要么它会非常复杂,使用和配置是一场噩梦,而且您会因为发生的问题而失去时间和可读性无论如何很少,可以通过临时搜索/替换来修复。

    如果简单的方法适合您,我只需要特殊标记来识别标记(例如@boot@),并在构建应用程序期间进行替换,例如使用 Ant 的 replace task

    【讨论】:

    • 这是一项要求,复数、语法等都可以照常处理。在我上一家公司的学校软件中,所有客户都使用英语,但命名法略有不同,例如在某些学校中,等级被称为班级,我们不希望在 100 个字符串中更改它并造成维护问题。
    • 我同意 JB Nizet 的观点,我不确定这是个好主意。您可以生成将在构建期间在应用程序中使用的最终属性。因此,您将拥有一个带有通用标记的属性文件,这些标记将在属性构建中被替换,使用 Maven 或 ant。
    • 这将是一个 SaaS 应用程序,我们将允许用户通过 Web 界面更改字符串,因此更喜欢一些打包的解决方案,但会考虑它,感谢您的帮助。
    【解决方案2】:

    您想要做的是串联 - 第二个最常见的国际化缺陷。换句话说,不要那样做。最好复制这 100 个字符串 - 使用有效的工具(如支持正则表达式的文本编辑器)相当容易,而不是连接字符串。

    详细解释原因:

    1. 许多(如果不是大多数)语言都有Inflection 的概念,即您要连接的单词可能需要翻译成几个不同的 strong> 形式。

    2. 翻译通常取决于上下文。如果这个词必须完全按原样翻译(只是形式发生变化),那么……上下文本身就没有必要了。这不是一个理论,请考虑以下示例。
      我们在资源中有一个字符串,例如“{0} 已切换 {1}”,它被解析为“[some program] | [some function] has been mapped [on] | [off]”。问题是,当我们想要将它正确翻译成波兰语时(只是一个例子,在许多其他语言中都会发生),它应该根据它是程序还是函数而有所不同。仅仅因为程序是阳性的(“Program [jakiś program] został [włączony] | [wyłączony]”)而功能是阴性的(“Funkcja [jakaś funkcja] został* a* [włączon*a*] | [wyłączon*a*]")。
      不仅词的形式需要改变,而且整个上下文(见添加的词)!
      串联是不可行的。你们中的一些人可能会说“磁盘占用空间怎么样?”。嗯,现在空间很便宜,这只是对与错的情况。仅仅为了节省几千字节而连接单词是错误,并且会导致严重的本地化问题。

    3. 有时,屈折变化不是问题,但您需要根据上下文将 moodsay 从指示性更改为命令性。这导致了不同的翻译。

    如果您确实需要使用消息格式,我建议您仅将其用于数字、货币和日期(请记住有效的区域格式!)。

    【讨论】:

    • 实际上我想避免连接,因为任何嵌套的键都只是语言文件的一部分。也将像在所有框架中一样处理变形、情绪和上下文。我只需要处理简单的情况,其中相同语言中的几个单词具有非常常见的同义词,我们不想为每个客户端创建具有 100 个字符串的 lang 文件,例如具有三个条目的客户端文件 class=grade;班级=成绩;教师=教育者比包含 100 个字符串的文件更容易创建/管理。
    • 如果您正在寻找创建词库,ResourceBundles 绝对不是这样做的好地方。现在,据我了解,您想将某些单词替换为其他单词,以便您可以使用该同义词来乘以句子,对吗?如果是这种情况,我的观点仍然有效,因为整个句子需要根据上述内容和我忘记添加到列表中的 gender 进行不同的翻译。没有办法这样造句,如果这些句子需要翻译,对不起。
    • 不完全是同义词,而是不同客户使用的不同命名法,我将继续使用框架中使用的性别。我需要处理一个学校使用单词类和另一个年级的简单场景。我希望此更改独立于代码并且易于维护。班级和等级的大写将作为框架中的标准处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多