1

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

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 值实现为变量来访问数据对象,像这样[obj.lang.title,obj.lang.url];当然它不会工作就我而言。

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

4

5 回答 5

4

为避免出现该switch语句,您可以设置一个默认值,如下所示:

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

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

$('body').prepend('<a href="' + obj[lang].url + '">' + obj[lang].title + '</a>');
于 2013-08-28T14:08:58.653 回答
2

在这种情况下,您实际上并不需要数组:

$('body').prepend('<a href="'+obj[lang].url+'">'+obj[lang].title+'</a>');
于 2013-08-28T14:09:28.730 回答
1

使用括号表示法

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

我会删除数组,然后将标题/网址放在字符串中。

var data = obj[lang];
$('body').prepend('<a href="' + data.url + '">' + data.text + '</a>');
于 2013-08-28T14:08:15.113 回答
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 所提到的,设置默认值是一个非常好的主意。

于 2013-08-28T14:09:10.727 回答
-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>'
于 2013-08-28T14:22:41.097 回答