将所有l10n值存储在本地化bundle中

时间:2015-07-16 18:17:16

标签: localization firefox-addon firefox-addon-sdk l10n.js

我正在构建一个FF扩展,我为自己处理一些xhtml以支持子表单加载,所以我必须识别定义了l10n属性的元素并将它们添加到字符串值中。因为l10n不能从主代码共享到内容脚本(因为不是简单的JSON对象),所以我通过获取加载的键值并定义了一个"本地化的数组包来管理这种情况&#34 ;,像这样:

lStrings = ["step_title", ........ ];
for (var i = 0; i < lStrings.length; i++) {
    bundle[lStrings[i]] = this.locale(lStrings[i]);
} 

问题是,我必须在这里写.properties文件中的每个条目......那么,你知道如何访问这个键值吗?我已经尝试使用.toString .toLocalString并检查对象,但无法找到对象能够返回所有密钥集合的方式。

你有更好的改进想法吗?

1 个答案:

答案 0 :(得分:1)

    var yourStringBundle = Services.strings.createBundle('chrome://blah@jetpack/content/bootstrap.properties?' + Math.random()); /* Randomize URI to work around bug 719376 */

var props = yourStringBundle.getSimpleEnumeration();
// MDN says getSimpleEnumeration returns nsIPropertyElement // https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIStringBundle#getSimpleEnumeration%28%29

while (props.hasMoreElements()) {
  var prop = props.getNext();
  // doing console.log(prop) says its an XPCWrappedObject but we see QueryInterface (QI), so let's try QI'ing to nsiPropertyElement

  var propEl = prop.QueryInterface(Ci.nsIPropertyElement);
  // doing console.log(propEl) shows the object has some fields that interest us

  var key = propEl.key;
  var str = propEl.value;

  console.info(key, str); // there you go
}

查看有关学习的评论。不错的问题。我从回复中学到了更多关于QI的知识。