【问题标题】:Translate JQuery Mobile widgets翻译 JQuery Mobile 小部件
【发布时间】:2013-12-30 23:27:15
【问题描述】:

使用i18next,如何翻译JQuery Mobile 小部件?具体来说,我想知道如何在不使用data-i18n-target 修改生成的内部元素的情况下做到这一点,因为这很脆弱,因为未来的小部件版本可能会更改生成的代码。

我是否可以订阅特定的页面生命周期事件,以便能够在小部件转换发生之前让 i18next 修改 DOM?

在这个例子中(见jsfiddle),一些标记被正确翻译,但homeBtnsubmitBtn不是:

HTML:

<div id="home_page" data-role="page">
    <div data-role="header">
        <a id="homeBtn" href="/" data-icon="home" data-i18n>app.home</a>
        <h2 data-i18n>app.title</h2>
    </div>
    <div data-role="content">
        <div data-role="fieldcontain">
            <label for="textinput1" data-i18n>app.label</label>
            <input type="text" name="textinput1" id="textinput1" value=""></input>
        </div>
        <form action="">
            <input id="submitBtn" type="submit" data-i18n="[value]app.button" />
        </form>
    </div>
    <div data-role="footer">
        <center>
            <p data-i18n>app.footer</p>
        </center>
    </div>
</div>

JavaScript:

var i18nOpts = {
    resStore: {
        dev: {
            translation: {
                app: {
                    button: 'Button',
                    home: 'Home',
                    label: 'Label',
                    footer: 'Footer',
                    title: 'i18n Test'
                }
            }
        },
    }
};
i18n.init(i18nOpts).done(function() {
    $("html").i18n();
});

【问题讨论】:

  • pagebeforecreate 是您需要在增强小部件之前进行更改的事件。 .page() 小部件在该事件上得到增强,但大多数其他小部件在 pagecreate 上得到增强。 jsfiddle.net/Palestinian/2uRpK

标签: javascript jquery jquery-mobile internationalization i18next


【解决方案1】:

jQuery Mobile 小部件在pagebeforecreatepagecreate 这两个事件上自动初始化(标记增强)。大多数小部件在出现pagecreate 时被初始化。

您只需将 i18n 代码包装在 pagebeforecreate 中。

$(document).on("pagebeforecreate", function () {
  // code
});

Demo

【讨论】:

  • 我想补充一点,虽然您对我提出的示例的回答是正确的,但只有一个页面,当通过 Ajax 加载多个页面时必须对其进行调整,否则 i18n.init 将是每次创建页面时调用。在这种情况下,一个好的解决方案似乎是在应用程序开始时调用i18n.init,可能带有getAsync: false 选项,这样当创建任何页面时,i18next 已经被初始化并且资源已经被加载。然后可以在每个pagebeforecreate 事件中安全地调用i18n()
  • pagebeforecreate 在单页和多页模型中每页触发一次,只要它们是通过 Ajax 提取的。 pagecreate 也会触发一次,但在这里您可以指定 page_id 选择器。 mobileinit 将使用 ajax 每个框架触发一次。 @FernandoCorreia
猜你喜欢
  • 2013-08-22
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多