如何正确本地化剑道移动中的字符串?

时间:2014-09-08 17:49:42

标签: jquery kendo-ui kendo-mobile i18next

我正在使用与剑道一起使用的i18next库,并且没有任何问题让我的应用程序的Kendo UI Web部分按预期工作,但移动设备是另一回事。我以为我可以从init函数调用我的i18n函数并让它在我的模板属性中填充“data-i18n”没有问题......但是看起来你不能访问任何视图元素直到视图之后完全构建/绑定...所以我尝试将i18n代码放在​​ListView的“DataBound”事件中,它确实有效,但是每次渲染/刷新列表时,这似乎都会产生大量不必要的代码。

关于如何更好地做到这一点的想法?由于这个原因,我甚至没有开始本地化Layouts的道路。

以下是我自己的模板

<div id="dashboard-meeting" data-role="view" data-model="dashViewModel" data-bind="events:{init:meetingListInit,show:meetingListShow}" data-layout="drawer-layout" data-title="By Meeting"> <ul id="meeting-list" class="meetingList"></ul> <div class="no-data" style="display:none;">No Data</div> </div>

这是列表的行项目模板...

<script type="script/x-kendo-template" id="meeting-item">
    <a data-item-id="#=meetingID#" href="\#meeting-details?id=#=meetingID#" data-transition="slide:left">
    <h3 class="time">#= startTime #</h3>
    <h3 class="counts"><span class="hc" data-i18n="dashboard.headCountText"></span>: #=headCount# | Total: #=totalCount#</h3>
    <h2>#=meetingName#</h2>
    </a>
</script>

这是我的viewModel:

    var dashViewModel = kendo.observable({
    headCountText : "Head Count",
    meetingListInit : function(e){
        var meetingList = $("#meeting-list").kendoMobileListView({
            dataSource: bymeetingData,
            pullToRefresh: true,
            template: $('#meeting-item').html(),
            dataBound: function(e){
                console.log("Data Bound");
                i18n.init(lang_options).done(function() {
                    //dashViewModel.set("headCountText", $.t("dashboard.headCount"));
                    //console.log("this list init'd" , $.t("dashboard.headCount"))
                    //$("#meeting-list").i18n();
                    $(".hc").text($.t("dashboard.headCount"));
                });
            }
        }).data("kendoMobileListView");
    },
    meetingListShow : function(e){
        //bymeetingData.read();
        $("#meeting-list").data("kendoMobileListView").refresh();
    }
});

正如您在我的初始化代码中的注释中所看到的,我甚至尝试将“head count”的列表项元素的文本绑定到通过init函数本地化的数据模型文本字符串。但那不会受到约束,所以我放弃了这一点,走了这条路。

1 个答案:

答案 0 :(得分:1)

我相信MVVM绑定和初始化实际上发生在视图initshow事件之前,因此您可能会在这两个事件中更改i18n内容。


实际上你可以使用text MVVM绑定器来处理i18n而不是使用像i18next这样的其他库。

<span data-bind="text: strings.hello"></span>

我的ViewModel有一个“字符串”哈希(实际上在启动时加载为JSON)

var english = {
    hello: "Hello"
};

var spanish = {
    hello: "Hola"
};

var viewModel = kendo.observable({
    strings: english
});

function enEspanolPorFavor() {
    viewModel.set("strings", spanish);
}

viewModel.set("strings", ...)会通知text绑定者他们需要更新语言更改。