我正在尝试完成练习,而不是单击。
这是一个问题:你能用JS(或Coffescript或任何实际有意义的语言)写一个方法getTranslation(lang,path) - >以下列方式工作的字符串: 你有这个全局对象:
strings = {
home: {
intro: {
en: 'Welcome',
fr: 'Bienvenue'
},
content: {
explanation: {
en: 'This is an interesting exercise',
fr: 'C\'est un exercice intéressant',
de: 'Es ist eine interesante Übung'
},
contact: 'Contact',
goodbye: {
en: 'Goodbye',
fr: 'Au revoir',
es: 'Adios'
}
}
}
}
和
getTranslation('home.intro', 'fr') // => 'Bienvenue'
getTranslation('home.content.contact', 'fr') // => 'Contact'
getTranslation('home.intro', 'es') // => 'Welcome'
getTranslation('home.content.goodbye') // => 'Goodbye'
getTranslation('unvalid.path','en') // => ''
所以第一个参数是一个字符串,用于描述通过点分隔的键的路径(假设没有键中的点),第二个参数是语言,如果没有提供或不存在,则回退到'en'(我们还假设在每个分支的末尾,“en”键存在,或者它是一个单独的字符串,如home.content.contact)。
这是我到目前为止我的答案,但我知道我做错了,因为没有回来。
function getTranslation (path, lang) {
lang = lang || "en";
var strings = {
home: {
intro: {
en: 'Welcome',
fr: 'Bienvenue'
},
content: {
explanation: {
en: 'This is an interesting exercise',
fr: 'C\'est un exercice intéressant',
de: 'Es ist eine interesante Übung'
},
contact: 'Contact',
goodbye: {
en: 'Goodbye',
fr: 'Au revoir',
es: 'Adios'
}
}
}
if (path == 'home.content.contact') {
return strings.path;
} else if (path == 'unvalid.path') {
return '';
} else {
return strings.path.lang;
}
}
getTranslation('home.intro', 'fr'); // => 'Bienvenue'
getTranslation('home.content.contact', 'fr'); // => 'Contact'
getTranslation('home.intro', 'es'); // => 'Welcome'
getTranslation('home.content.goodbye'); // => 'Goodbye'
getTranslation('unvalid.path','en'); // => ''
感谢愿意提供帮助的任何人。
答案 0 :(得分:2)
不确定它是否是最佳解决方案,但它能满足您的所有需求。
function getTranslation(path, lang) {
lang = lang || "en";
strings = {
home: {
intro: {
en: 'Welcome',
fr: 'Bienvenue'
},
content: {
explanation: {
en: 'This is an interesting exercise',
fr: 'C\'est un exercice intéressant',
de: 'Es ist eine interesante Übung'
},
contact: 'Contact',
goodbye: {
en: 'Goodbye',
fr: 'Au revoir',
es: 'Adios'
}
}
}
}
path = path.split(".");
var result = strings;
for(var i in path){
result = result[path[i]];
if(result == undefined){
return '';
}
}
return (result[lang]==undefined)?"":result[lang];
}
答案 1 :(得分:0)
function getTranslation (path, lang) {
lang = lang || "en";
var strings = {
home: {
intro: {
en: 'Welcome',
fr: 'Bienvenue'
},
content: {
explanation: {
en: 'This is an interesting exercise',
fr: 'C\'est un exercice intéressant',
de: 'Es ist eine interesante Übung'
},
contact: 'Contact',
goodbye: {
en: 'Goodbye',
fr: 'Au revoir',
es: 'Adios'
}
}
}
};
var string = eval('strings.' + path);
return string[lang];
}
不是这个解决方案的粉丝,因为我避免了逃避,但它解决了你的问题。试试你的函数调用。
答案 2 :(得分:0)
return strings.path;
不会返回任何内容,因为字符串对象上没有“path”属性。
你想:
return strings[path];
...但只有当您的媒体资源处于对象中的第一个级别时,此功能才有效。例如......
strings['home'];
会给你和像
这样的对象{intro: {
en: 'Welcome',
fr: 'Bienvenue'
}}
但是,尝试按名称访问嵌套属性(如下所示)将返回undefined:
strings['home.intro']
因此,您需要.
split路径字符串,循环生成的数组,并逐个获取每个属性。
我会把实施留给你,因为你提到它是一个练习,但如果你遇到困难,可以随时提问。
答案 3 :(得分:0)
我认为你遇到的部分困难是你有一些想要运行的JavaScript代码,但是它被困在一个字符串中。
我相信当你说
return strings.path.lang
您希望执行此操作(假设path = 'home.intro'
和lang = 'fr'
:
return strings.home.intro.fr
不是这个:
return strings.'home.intro'.'fr'
您可以使用eval
将path
评估为所需的代码,但eval
会导致安全漏洞。
我会通过在path
字符上拆分.
字符串来解决此问题。
这是我写的一个快速功能:
function getTranslation (path, lang, obj) {
obj = obj || strings;
lang = lang || "en";
var dotIndex = path.indexOf('.');
if(dotIndex === -1) {
return obj[path][lang];
}
else
{
var firstFromPath = path.substring(0, dotIndex);
var restPath = path.substring(dotIndex + 1);
return getTranslation(restPath, lang, obj[firstFromPath]);
}
这并不是你想做的一切,但希望它有所帮助。