1

我正在建立一个网站,这基本上是我想要使用 JavaScript 实现的目标:

如果浏览器语言 = fr 然后从 languageFr.json 获取文本,否则从 languageEn.json 获取文本

这是我的代码现在的样子:

我的 JSON

{
"h2": "random title",
    "p": lorem ipsum
}

我的 JavaScript,在 index.html 的头部

<script text="text/javascript">
    var lang;

    function detect() {
        var userLang = navigator.language || navigator.userLanguage;
        if (userLang == "fr") {
             lang = JSON.parse("languageFr.json");
        } else {
                 lang = JSON.parse("languageEn.json");
        }       
    }

    $(document).ready(detect());
</script>

然后在我的 HTML 正文中:

<h2><script>document.write(lang.h2);</script></h2>

但是,这似乎不起作用。Chrome 的控制台告诉我 lang 未定义。我究竟做错了什么?

谢谢

4

3 回答 3

3
  1. 代码<h2><script>document.write(lang.h2);</script></h2>在文档准备好之前执行。这就是为什么您的detect方法目前已被调用且lang尚未初始化的原因。
  2. 您以错误的方式使用 JSON.parse 方法
于 2013-07-12T13:28:59.343 回答
0

好吧,一个想法是这个块中的Javascript

<h2><script>document.write(lang.h2);</script></h2>

在函数运行之前执行。

该 Javascript 将在浏览器到达它时立即执行;浏览器将暂停解析页面以执行此操作。但是,您的检测功能看起来正在等待文档就绪事件运行。

因此, document.write() 调用发生在调用 detect() 方法之前,而 lang 没有任何价值。

于 2013-07-12T13:31:54.293 回答
0

Egor4eg 对这个问题是正确的(实际上大多数答案都是正确的)。我建议您使用不同的方法来填写任何应具有特定语言文本的元素。这是一种可能性。

<div class="i18nstring" data-message="h2"></div>

//Put this at the bottom of your detect() function (so it's only called after $ ready)

$('.i18nstring').forEach(function() {
    $(this).text( lang[this.dataset.message] );
}

这可能只需要多做一点工作(主要是在数据消息方面)才能完全跨浏览器兼容,但 JQuery 可以提供帮助。请注意,每个 i18nstring 节点不必是 div。

于 2013-07-12T13:37:56.490 回答