我正在尝试创建一个多语言的javascript对象。类似的东西:
function language(lang){
this.error = {
fname : function(lang){
var fname = {
vn : "Tên",
en : "First Name",
};
return fname.lang;
},
};
}
当我尝试使用此号码fname
时,
var lang = new language("en");
console.log(lang.error.fname);
事实证明
function(lang){var fname = {vn : "Tên",en : "First Name",};return fname.lang;}
代替First Name
。我的代码出了什么问题?我怎样才能正确获得fname
值?
我是JS的新手。如果有人帮我解决这个问题,我感激不尽。
答案 0 :(得分:1)
您需要像fname
function
lang.error.fname()
此外,您应该修改您的功能,因为目前您在lang
函数内部fname()
变量:
fname : function(){
var fname = {
vn : "Tên",
en : "First Name",
};
return fname[lang];
}
答案 1 :(得分:1)
作为快速修复,您需要在返回值时使用[]
语法,并从lang
函数中删除fname()
参数,因此它变为:
function language(lang){
this.error = {
fname : function(){
var fname = {
vn : "Tên",
en : "First Name",
};
return fname[lang];
},
};
}
language = new language('en');
console.log( language.error.fname() );
这有效,但它不是一个非常好的结构。看看获取翻译的语法,看起来很奇怪,为什么fname()
是一个函数?另外,看看如何定义翻译,它们与许多JavaScript函数和逻辑混合在一起,这使得它很难维护,任何人都无法添加不熟悉JavaScript的翻译。
让我们看一下不同的结构:
function language(lang){
var translations = {
vn : {
error_fname : "Tên",
},
en : {
error_fname : 'First Name',
error_lname : 'Last Name'
}
};
var currentLang = 'en'; // default
function get(key){
return translations[currentLang][key];
}
// public pointers
this.get = get;
// constructor
if(typeof lang != 'undefined' && translations[lang]){
currentLang = lang;
}
}
var language = new language('en');
console.log( language.get('error_fname') );
首先看一下如何定义翻译。它非常清楚,所有英文翻译都有一个en
对象。所有的英文翻译都存在于en
对象中 - 对吗?没有JavaScript逻辑与翻译混合在一起,这意味着您可以执行诸如使用JSON结构之类的事情,这些结构可以由不熟悉JavaScript的翻译人员阅读。您甚至可以为翻译人员提供一个基本的.ini
文件,并将其转换为此JavaScript / JSON结构,因为它简单。
还有其他一些好处,例如翻译是封装的,如果不通过get()
方法就无法直接访问。
这是一种不同的方式,它使用.
语法来获取翻译:
function language(lang){
var translations = {
vn : {
error_fname : "Tên",
},
en : {
error_fname : 'First Name',
error_lname : 'Last Name'
}
};
var currentLang = 'en'; // default
if(typeof lang != 'undefined' && translations[lang]){
currentLang = lang;
}
return translations[currentLang];
}
var language = language('en');
console.log( language.error_fname );
没有get()
功能,您可能会或可能不会这样做。我个人更喜欢另一种方式,因为封装和OOP风格。
答案 2 :(得分:0)
你写的方式有点奇怪:
function language(lang){ // Constructor, that's ok
this.error = { // An attribute that is another object
fname : function(lang){ // this attribute has a function
var fname = { // the function has another object as a local variable with the same name!
vn : "Tên",
en : "First Name",
};
return fname.lang; //the object has vn and en attributes, but no lang
},
};
}
我会尝试定义你想要的结构类型,然后从头开始重写那个混乱。