我对常用短语使用JSON文件,因此不必键入它们,也许将来可以翻译它们。例如,在我的主要代码中,我想说You don't have the permission to use ${command_name}
。可以很好地将其硬编码到我的.js文件中,但最终我希望将其保存在JSON文件中,该文件不允许插入任何变量。
有人知道我的问题的解决方案吗?
编辑:感谢您的建议。我猜string.replace是我最好的选择。希望有一些内置功能可以将JSON字符串中的变量转换为该JS文件中声明的变量。
答案 0 :(得分:1)
您不能像在Javascript“代码”中那样对待JSON文件中的模板字符串文本。你自己说的但是:您可以为此使用模板引擎-或仅使用简单的String.replace()
。
模板引擎示例:https://github.com/janl/mustache.js
使用小胡子(例如),您的代码将如下所示
var trans = {
command_name: "dump"
};
var output = Mustache.render("You don't have the permission to use {{command_name}}", trans);
使用简单的String.replace()
:
var str = "You don't have the permission to use %command_name%";
console.log(str.replace('%command_name%', 'dump'));
答案 1 :(得分:1)
您可以简单地使用占位符。以下函数用用户定义的值替换占位符:
const messages = {
msgName: 'Foo is :foo: and bar is :bar:!'
}
function _(key, placeholders) {
return messages[key].replace(/:(\w+):/g, function(__, item) {
return placeholders[item] || item;
});
}
用法:
_('msgName', { foo: 'one', bar: 'two' })
// "Foo is one and bar is two!"
这只是一个例子。您可以按照自己的方式更改占位符样式和函数行为!
答案 2 :(得分:0)
您可以使用config npm模块并根据您的环境分离JSON文件。
答案 3 :(得分:0)
./ name.json
{
command: "this is the output of 'command'"
}
./ Node.js
cost names = require('./name.json');
console.log('name === ', name.command);
// name === this is the output of 'command'
答案 4 :(得分:0)
所以主要的挑战是当其中一些参数可设置参数时,使用字符串常量来分离文件,对吧?
JSON格式本身对字符串(数字,布尔值,列表和哈希图)进行操作,对替换和参数一无所知。
由于模板字符串会立即插入,因此您也无法使用you don't have permission to do ${actionName}
之类的模板字符串。
那你能做什么?
编写自己的解析器,该解析器从JSON文件中获取配置数据,解析字符串,找到对变量的引用,并将其替换为值。简单的例子:
const varPattern = / \ $ {([^ {}] +)} / g; 函数replaceVarWithValue(templateStr,params){ 返回templateStr.replace(varPattern,(fullMatch,varName)=> params [varName] || fullMatch); }
,或者您可以使用任何针对本地化的npm软件包,例如i18n,这样它将为您处理模板
答案 5 :(得分:0)
基本上,您可以实现函数parse
,给定文本和字典,该函数可以代替每个字典键的出现:
const parse = (template, textMap) => {
let output = template
for (let [id, text] of Object.entries(textMap)) {
output = output.replace(new RegExp(`\\$\{${id}}`, 'mg'), text)
}
return output
}
const textMap = {
commandName: 'grep',
foo: 'hello',
bar: 'world'
}
const parsed = parse('command "${commandName}" said "${foo} ${bar}"', textMap)
console.log(parsed)
顺便说一句,我建议您使用一些现有的字符串模板引擎,例如string-template,以避免重新发明轮子。