我试图用html和javascript创建一个多语言站点。
为了选择语言,我创建了三个单选框(值:en,de,fr)。
应显示的单词存储在javascript对象中。

这是代码:

$('#lang-setting').on('change', function () {
var lang = $('input:checked', '#lang-setting').val();
console.log(lang);
alert(lang);
$('#latitude-n').html(lang.latitude);
$('#longitude-n').html(lang.longitude);
$('#accuracy-n').html(lang.accuracy);
$('#words-n').html(lang.words);
$('#map-n').html(lang.map);
$('#test').html(de.test);
});


每次选择语言时,alert(lang)和console.log都会提供正确的语言。

但是:其他词不变。如果我用f替换“ lang”,它们会执行'de'(请参阅最后一个代码行)。

最佳答案

名为lang的变量是一个字符串,因为您将其设置为单选输入的值,因此lang.latitude,lang.longitude,lang.accuracy,lang.words和lang.map都是未定义的。

我假设您说de.test有效,所以您拥有诸如de set之类的全局变量。

将所有这些语言放在一个对象中,然后可以通过键或单选输入的值进行引用,这可能是最简单的。我还添加了一个变量,该变量允许您选择默认语言以及将执行实际html更改的函数。

var translate = {
    default: 'en',
    en: {
        latitude: 'latitude',
        longitude: 'longitude',
        accuracy: 'accuracy',
        words: 'words',
        map: 'map',
    },
    de: {
        latitude: '',
        longitude: '',
        accuracy: '',
        words: '',
        map: '',
    },
    fr: {
        latitude: '',
        longitude: '',
        accuracy: '',
        words: '',
        map: '',
    },
    changeText: function(lang) {
        $('#latitude-n').html(translate[lang].latitude);
        $('#longitude-n').html(translate[lang].longitude);
        $('#accuracy-n').html(translate[lang].accuracy);
        $('#words-n').html(translate[lang].words);
        $('#map-n').html(translate[lang].map);
    }
}


由于您没有发布三个单选按钮的HTML,因此我将为它们提供名称属性,而不是ID的“ lang-settings”值,因为具有重复的ID是无效的HTML。以下是这些单选按钮的最小HTML。

<input name="lang-setting" value="en" type="radio" />
<input name="lang-setting" value="de" type="radio" />
<input name="lang-setting" value="fr" type="radio" />


然后,对于您的侦听器,我已将其切换为侦听“点击”而不是更改,因为单选按钮的值实际上并未更改,它们分别为“ en”,“ de”和“ fr” 。我还在文档中添加了函数调用,以在页面加载时运行默认语言选择。

$('input[name="lang-setting"]').on('click', function(e){
    var lang = $(this).val();
    translate.changeText(lang);
});
$(document).ready(function(){
    translate.changeText(translate.default);
});


这是一个working demo of it on JSFiddle

09-11 19:11
查看更多