【问题标题】:l20n.js - how to access localization sub-entities from javascriptl20n.js - 如何从 javascript 访问本地化子实体
【发布时间】:2013-08-14 09:16:59
【问题描述】:

在这个例子中,我可以看到如何访问 LOL 资源中的变量

<brandName {
  nominative: "Firefox",
  genitive: "Firefoksa",
  dative: "Firefoksowi",
  accusative: "Firefoksa",
  instrumental: "Firefoksem",
  locative: "Firefoksie"
}>

<about "O {{ brandName.locative }}">

不过,我也希望能够在 javascript 中做类似的事情,例如:

document.l10.get('brandName.nominative');

但这对我不起作用。我调试了一下,但我觉得我在浪费时间,而且可能已经有一种简单的方法可以做到这一点。有吗?

【问题讨论】:

    标签: javascript localization l20n


    【解决方案1】:

    这在 L20n 中是不可能的,因为作为开发人员,您无法确定 nominative 将在所有语言中定义。继续阅读以找出原因。

    在英语中,您的示例可能看起来像这样:

    <brandName "Firefox">
    <about "About {{ brandName }}">
    

    这次没有任何.nominative 可以询问!

    L20n 完全是关于不对称的。英语字符串的一个变体可能对应于德语的 4 个变体、波兰语的 7 个变体和匈牙利语的 16 个变体。开发者和 L20n 之间有一个社会契约:如果开发者要求一个名为 brandName 的实体的值,L20n 将返回一个可以在 UI 中使用的字符串。为获取该字符串所做的所有工作对开发人员都是隐藏的,并且可能会因本地化程序构建的语言和逻辑而有所不同。

    根据您想要实现的目标,您可能会发现以下两个结构很有帮助:

    • default values 可用于指示如果您不要求任何特定键,则返回默认键。在您问题的示例中,您可以通过在其旁边放置一个星号将 nominative 定义为默认值,如下所示:

      <brandName {
       *nominative: "Firefox",
        genitive: "Firefoksa",
        dative: "Firefoksowi",
        accusative: "Firefoksa",
        instrumental: "Firefoksem",
        locative: "Firefoksie"
      }>
      <about "O {{ brandName.locative }}">
      

      当您现在尝试在 JavaScript 中检索 brandName 的翻译时,您将获得 nominative 键的值“Firefox”:

      document.l10.get('brandName');
      // "Firefox"
      
    • attributes 可以添加到实体中以存储元数据,如下所示:

      <brandName "Firefox"
       accesskey: "F"
      >
      

      请注意,属性与字典值不同。在上面的例子中,brandName 的值是一个简单的字符串“Firefox”。 brandName 实体有一个额外的属性accesskey,其值为“F”。您可以使用getEntity 访问属性:

      document.l10.getEntity('brandName');    
      // { value: "Firefox", attributes: { accesskey: "F" } }
      

    【讨论】:

    • 斯塔斯,感谢您的帮助。回复:这次没有任何 .nominative 要求!使用默认值似乎是一个很好的例子,在这种情况下是唯一的值。也许我应该使用属性?例如:。这似乎我将能够通过 javascript 访问。
    • 我不确定这是否是最佳解决方案。我建议不要以您提到的方式对复数进行硬编码。某些语言可能使用两种或三种不同的复数形式(例如波兰语:“2 Firefoksy”、“5 Firefoksów”)。您想到的用例是什么?也许还有另一种方法可以实现您想要实现的目标?
    • @Staś,有没有办法从 HTML 中访问实体属性,而不是使用 JS。例如&lt;span data-l10n-id="brandName::accesskey"&gt;&lt;/span&gt;
    • 公共实体属性映射到 HTML 属性,因此如果 brandName 实体定义了具有 data-l10n-id="brandName" 的元素将获得一个新的 accesskey 属性。您是否有对此行为不满意的特定用例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2012-03-12
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多