0

因为 Sencha Touch 缺乏官方的国际化方法,所以我正在编写自己的一小部分实用方法。我不会嵌入另一个像 jQuery 这样的库来使用已经存在的 i18n 插件。目前我很难找出最好的方法。目前我有一个作为单例实现的类。在构造函数中,我确定语言并加载相应的语言文件。目前我正在使用 Sencha 方法并定义模型并将数据(json)加载到商店中。我觉得有点方便 这是我加载数据的构造函数的片段:

        Ext.define('Translation', {
        extend: 'Ext.data.Model',
        idProperty: 'key',
        fields: [
            {name: 'key', type: 'string'},
            {name: 'translation', type: 'string'}
        ],
        proxy: {
            type: 'ajax',
            url: 'res/translation-'+lang+'.json', 
            //appendId: false,
            reader: {
                type: 'json',
            }
        }
    });

    _store = Ext.create('Ext.data.Store', {
        model   : 'Translation',
        autoLoad: true
    });

这里的问题是加载是异步的(无法使用 sencha 进行同步调用?!),这意味着应用程序可能会在这些内容完成之前开始加载。我需要数据,因为视图依赖于它。

Ext.Loader.setConfig({enabled:true});
Ext.application({
name: 'MyApp',
controllers: ['Ctr1', 'Ctr2'],
models: ['Model1', 'Model2],
init: function() {

},
launch: function() {

}
});

到目前为止我发现的唯一解决方案是

  1. 使用回调并将应用程序初始化包装在里面。
  2. 不要使用 Sencha 并手动执行 ajax 请求。
  3. 根本不要使用 Ajax。将所有语言的翻译放入一个 javascript 文件中,将其包含在 index.html 中,并确保实用程序类可以访问该对象。
4

3 回答 3

1

已经有一个 i18N 扩展,请看这里。

https://github.com/elmasse/Ext.i18n.Bundle-touch

于 2012-02-13T15:34:07.273 回答
0

Sencha Touch 没有简单的方法可以做到这一点。您最好的选择是对带有翻译的 json 文件发出同步 Ajax 请求,然后让您的应用程序启动。

于 2012-02-12T23:52:40.960 回答
0

看到这篇文章这可能会有所帮助:sencha touch i18n basics

而我的回答,也许它可以帮助你。

对于您自己的字符串(不是在谈论本机触摸组件),您可以执行类似的操作。

1) 在 head 部分的 index.html 中,在

<script id="microloader" type="text/javascript" src="sdk/microloader/development.js"></script>

在您的 localeManager 中,根据浏览器的语言加载与您的语言对应的资源文件 (myStrings-fr.js | myStrings-en.js )

您可以执行以下操作来获取浏览器中的语言:

window.navigator.language || window.navigator.userLanguage || window.navigator.browserLanguage || window.navigator.systemLanguage

2) 使用翻译后的字符串创建资源文件

英文版 (myStrings-en.js) 应该是这样的:

var myStrings = {
MyPackage1: {
    myString1: 'Seach...'
}};

法语版本 (myStrings-fr.js) 应该是这样的,例如:

var myStrings = {
MyPackage1: {
    myString1: 'Recherchez...'
}};

3) 在您的 sencha 触摸代码中,例如搜索字段占位符值

xtype: 'searchfield',
id: 'searchToolbarItem',
placeHolder: myStrings.MyPackage1.myString1

希望它会有所帮助。

另一种解决方案可能是修改 sencha touch 应用程序的构建过程,并在构建时创建应用程序的本地化版本。因此,每种语言都会有一个版本。然后根据浏览器语言,在浏览器中加载应用程序时,您将加载正确版本的应用程序。

于 2012-08-01T12:07:24.340 回答