【问题标题】:Create a Lua like JavaScript I18n internationalization创建类似 JavaScript I18n 国际化的 Lua
【发布时间】:2016-12-27 02:49:18
【问题描述】:

在我们的Freifunk project gluon 中,我们在 Lua 代码中使用 i18n GNU gettext 国际化(例如对于包gluon-config-mode-hostname),我们在子文件夹i18n 中创建单独的文件。我想使用这个.po 文件将它们添加到我们的状态页面javascript代码中: https://github.com/rubo77/gluon/tree/status-i18n/package/gluon-status-page/i18n

那些包含由msginit 程序创建的翻译。

如何为基于 javascript 的状态页面(不带 jQuery)使用相同的 i18n 文件来翻译这些字符串?

【问题讨论】:

  • ajax 文件,在双空之后取行,用一个简单的.split() (可能还有一个 trim() 或 slice() 来清理)解析每个键:值对。一旦你收集了所有这些,你可以将它们传递给你的 update() 函数。
  • 你能补充一些例子吗?

标签: javascript lua internationalization gettext


【解决方案1】:

这是一种肮脏但冗长的完成方式。这是你要找的吗?

let url = "https://raw.githubusercontent.com/rubo77/gluon/status-i18n/package/gluon-status-page/i18n/de.po"

fetch(url)
  .then((res) => {
    return res.body.getReader();
  })
  .then((reader) => {
    return reader.read();
  })
  .then((stream) => {
    let decoder = new TextDecoder();
    let body = decoder.decode(stream.value || new Uint8Array);
    return body
  })
  .then((body) => {
    let text = body.replace(/\\n/g, '');
    let lines = text.split('\n');

    console.log(text)
  
    let arr = []
    let obj = {}
  
    for (let i = 0; i < lines.length; i++) {

      // key:value pairs
      if (lines[i].indexOf(':') !== -1) {
        let line = lines[i].replace(/"/g, '');
        let pair = line.split(':');
        if (pair.length) {
          obj[pair[0]] = pair[1].trim();
        }
      }


      // msgid
      if (lines[i].indexOf('msgid') !== -1) {
        let msgobj = {};
        let msgid = lines[i].split(' "')[1].replace(/\"/g, '');
        msgobj.msgid = msgid;

        // msgstr
        if (lines[i+1].indexOf('msgstr') !== -1) {
          let msgstr = lines[i+1].split(' "')[1].replace(/\"/g, '');
          msgobj.msgstr = msgstr;
        }

        arr.push(msgobj);
      
      }

    }
  
    arr.push(obj)

  
  document.getElementById('output-source')
    .innerHTML = body
  
  document.getElementById('output-js')
    .innerHTML = JSON.stringify(arr, null, 2);
});
.output {
  background-color: #fafafa;
  border: 1px solid #e1e1e1;
}
<pre id="output-source" class="output"></pre>
<pre id="output-js" class="output"></pre>

注意:以上示例可能仅适用于 Chrome。这是一个JSBin,应该可以在 FF 中使用。

【讨论】:

  • 这看起来很棒。虽然 safari 不支持 TextDecoder() ......我会在今天晚些时候尝试
  • 如果您已经在项目中使用 jquery,您可以只使用 AJAX 并完全放弃 fetch/readableStream/decode。将第一部分替换为:jsbin.com/necihe/2/edit?js,console
  • 我无法在 Firefox 50 中完成这项工作。您能提供一个运行示例吗?我还用我们想要使用的正确翻译 .po 文件更新了我的问题。我在控制台中得到的错误:TypeError: res.body is undefined。这是我尝试过的示例 html 文件:github.com/rubo77/gluon/blob/status-i18n/package/…
  • 但是脚本的其余部分似乎可以工作,我将文件的读取更改为一些较旧的 javascript 函数:github.com/rubo77/gluon/compare/6334f201ce...f338df6dc9
  • 我将 i+1 添加到 msgstr 因为它总是在下一行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2017-06-09
相关资源
最近更新 更多