我正在开发一种使用多种语言的应用程序。我们不使用像'i18n'这样的包,而是-因为字符串文字的数量不是很大-使用这样的系统:
// constants
const GREETING = 'greeting'
// es.js -- a language object
const aLanguageObject = {[GREETING] : '¿Cómo estás?'}
// helper function
const getText(selector) = currentLanguageObject[selector]
// usage file
const greetingPhrase = getText(GREETING);
其中currentLanguageObject
是es.js
,en.js
等之一,也就是说,已经定义的languageObject
之一(我们根据{{1}选择}值)
我们希望能够使用标记的模板文字将值插值到保存为常量的这些模板文字中。
我试图像这样使带标签的模板文字在我们的系统中工作:
process.env
但numberConfirmString为// en.js
const aLanguageObject = {[CONFIRM_NUMBER] : `is the number ${0} correct?`}
and then use tagged templates like this
const theNumber = 12;
const myTag = (strings, numberExp) => `${strings[0]}${theNumber}${strings[1]}`;
const numberConfirmString = myTag`${getText(CONFIRM_NUMBER)})`;
。
有没有办法“填写”保存为常量的模板文字?任何帮助,不胜感激!
答案 0 :(得分:1)
语法:
const obj = {[key] = value}
应该是:
const obj = {[key]: value}
否则,会出现SyntaxError。
除此之外,我认为这样的方法应该起作用:
function generaTemplate (strings, ...keys) {
return function(data) {
let temp = strings.slice();
keys.forEach((key, i) => {
temp[i] = temp[i] + data[key];
});
return temp.join('');
}
}
const userTpl = user => generaTemplate`<article>
<p>Name: ${'name'}</p>
<p>Age: ${'age'}</p>
</article>`(user);
const users = [{
name: 'Eric',
age: '10'
}, {
name: 'Rob',
age: '20'
}];
const usersList = users.reduce((acc, user) => {
return acc + userTpl(user);
}, '');
console.log(usersList);
它返回以下内容:
<article>
<p>Name: Eric</p>
<p>Age: 10</p>
</article><article>
<p>Name: Rob</p>
<p>Age: 20</p>
</article>
您也可以使用:
const welcome = param => `Hello, ${param}`;
console.log(welcome('world'));
输出:
你好,世界