Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在基于模块的JavaScript体系结构中,语言翻译定义放在哪里?_Javascript_Ecmascript 6_Translation - Fatal编程技术网

在基于模块的JavaScript体系结构中,语言翻译定义放在哪里?

在基于模块的JavaScript体系结构中,语言翻译定义放在哪里?,javascript,ecmascript-6,translation,Javascript,Ecmascript 6,Translation,目前我有这样的结构 id: data[i].id, headers: ["Även åsnor", "försöker på engelska"], columns: { userName: data[i].firstName + " " + data[i].lastName, finishOn: data[i].finishOn !== null ? data[i].finishOn : "pågår..." } 我希望上面的结构可以像这样重新建模 id: d

目前我有这样的结构

id: data[i].id,
headers: ["Även åsnor", "försöker på engelska"],
columns: {
  userName: data[i].firstName + " " + data[i].lastName,
  finishOn: data[i].finishOn !== null 
    ? data[i].finishOn 
    : "pågår..."
  }
我希望上面的结构可以像这样重新建模

id: data[i].id,
headers: [Lang.userName, Lang.completedOn],
columns: {
  userName: data[i].firstName + " " + data[i].lastName,
  finishOn: data[i].finishOn !== null 
    ? data[i].finishOn 
    : Lang.holdYourPonnies
  }
然后,我可以将所有语言字段放在一个单独的模块中,并将它们保留在那里。我从来没有在JavaScript中这样做过,我对此感到担忧

  • 对于导入它的每个模块,我是否需要一个单独的语言模块
  • 或者我应该有一个单一的语言模块并多次导入它,每个需要语言的模块导入一次
  • 或者有没有办法将其导入根模块,并使其对树中的每个人都可用

您可以将语言定义作为对象从JS模块导出或保存在JSON文件中。语法基本相同:

{
  "FOO": "foo"
}

export default {
  "FOO": "foo"
}
但模板文本可以用于JS文件中的多行字符串,这大大提高了可读性

大多数情况下,在某些时候,对变量的支持是必要的。通常需要一个简单的模板引擎。为了简单和性能,此处也可以使用模板文字:

export default {
  FOO: "foo",
  BAR: `multiline
        bar`,
  BAZ: (val) => `template baz: ${val}`
}
这可以通过简化的本地化API有效地处理:

import en from './en';
import se from './se';

export class L10n {
  constructor() {
    this.lang = 'en';
    this.definitions = { en, se };
  }

  switch(lang) {
    this.lang = lang;
  }

  get(token, ...templateVars) {
    const val = this.definitions[this.lang][token];

    if (typeof val === 'function')
      return val(...templateVars);
    else
      return val;
  }
}

export default new L10n;
并且可以这样使用:

l10n.get('FOO');
l10n.get('BAZ', 'baz value');

哦,这看起来是成熟的职业水平。令人惊叹的!我会等一两天让其他人做出贡献(也许其他人可以在实际情况中提供更多的见解)。但这肯定是+1的努力。如果我忘记接受,几天后提醒我,好吗?还有-你为什么选择彩虹所有颜色中的SE?!(没错,我来自斯德哥尔摩——只是好奇而已。运气好吗?)当然,我会提醒你的。这就是i18n/l10n通常由框架处理的方式。你也可以查一下。但就你所问的,毫无意义的ES6解决方案就是这么简单。是的,你可以说这是一个幸运的机会,我通常通过发音符号来区分斯堪的纳维亚语。嗯,好主意。如果你看到奥哈,你可以肯定这是可耻的。如果你看到的是Ä而不是Æ或Ö而不是Ø,你可以排除丹麦人和挪威人。另外,如果你看到Verrylloongwoorrds一行有一堆重复的字符,那肯定是芬兰语。疯狂的语言。很棒的女人。但你可能已经知道了对。有一些困难的时间区分丹麦,瑞典和挪威语的词组没有暗示的字母表,我想应该考虑学习他们,而不是在这一点上,哈。