具有不同语言选项的数据对象。 Javascript实现

时间:2013-08-28 14:06:06

标签: javascript jquery arrays multidimensional-array

我有这个奇怪的情况,我必须使用javascript根据页面语言管理一些小文本。想象一下,你需要根据html lang属性替换模板的某些部分。所以我创建了多维数据对象,并决定采用以下方式。一切正常,但我觉得这不是最好的做法,也许我可以避免使用开关:

jsbin版本: http://jsbin.com/EvEciVa/2/

$(function(){

var lang = $('html').attr('lang'),
    text;

var obj = {
  'en' : {
    'title' : 'Title english',
    'url' : 'en.html'   
  },
  'fr' : {
    'title' : 'Title french',
    'url' : 'fr.html',   
  }               
};

switch(lang){               
  case'fr':
  text = [obj.fr.title,obj.fr.url];
  break;               
  default:
  text = [obj.en.title,obj.en.url];
}

  $('body').prepend('<a href="'+text[1]+'">'+text[0]+'</a>');

});

问题是:至于我有lang属性值(语言),也许我可以避免使用switch和重复的情况,而是我可以将lang值实现为变量来访问数据对象,就像这样{{ 1}}当然,在我的情况下它不会起作用。

我很感激任何意见。谢谢。

5 个答案:

答案 0 :(得分:4)

为了避免使用switch语句,您可以设置如下默认值:

var lang = $('html').attr('lang') || 'en';

这意味着en是默认设置,如果设置了lang,则会被覆盖。然后,您可以使用括号表示法来访问对象:

$('body').prepend('<a href="' + obj[lang].url + '">' + obj[lang].title + '</a>');

答案 1 :(得分:2)

在这种情况下你真的不需要数组:

$('body').prepend('<a href="'+obj[lang].url+'">'+obj[lang].title+'</a>');

答案 2 :(得分:1)

使用括号表示法

text = [obj[lang].title,obj[lang].url];

我会丢弃数组,只是将标题/ url放在字符串中。

var data = obj[lang];
$('body').prepend('<a href="' + data.url + '">' + data.text + '</a>');

答案 3 :(得分:0)

我会将本地化对象分配给另一个变量并从那里开始工作。这样,所有本地化代码都可以引用同一个对象而无需处理语言逻辑,如果需要,可以在以后切换到外部本地化文件。

$(function(){

  var lang = $('html').attr('lang') || 'en',
        text;


  var obj = {
    'en' : {
      'title' : 'Title english',
      'url' : 'en.html'   
    },
    'fr' : {
      'title' : 'Title french',
      'url' : 'fr.html',   
    }               
  };


  var translations = obj[lang];


  $('body').prepend('<a href="'+translations.url+'">'+translations.text+'</a>');

});

另外,正如Rory所说,设置默认值是一个非常好的主意。

答案 4 :(得分:-1)

要避免使用switch语句,您只需检查对象中是否显示属性语言,然后选择英语:

var lang = $('html').attr('lang');
if (! (lang in obj))
    lang = "en";

// then:
'<a href="' + obj[lang].url + '">' + obj[lang].title + '</a>'

或者,也许更容易,使用较短的

var localisation = obj[ $('html').attr('lang') ] || obj.en;

'<a href="' + localisation.url + '">' + localisation.title + '</a>'