1

在我的应用程序中,所有组件的标题/文本都基于应用程序启动之前加载的商店进行本地化。在应用程序中,我有更改商店 url 并重新加载商店以切换语言的按钮。问题是所有类都已加载,因此组件使用以前的语言环境呈现。这是按钮的代码:

tbar: [{
    xtype: 'button',
    id: 'btn-test',
    text: 'xxx',
    handler: function() {
        lang = 'en';        
        i18n.getBundlestore().load({url:'/GSIP/resources/gsip/i18n/bundle-' + lang + '.properties'});

        //bun = Ext.create('I18N.ResourceBundle'); 

        Ext.getCmp('mainview').destroy();

        Ext.create('Ext.container.Viewport', {
            id: 'mainview',
            layout: 'border',
            items: [
                {
                 xtype: 'gsip_mainpanel',
                 region: 'center',
                 items: [{
                     xtype: 'gsip_categoriestabpanel'
                 }]

                }
            ] 

完全相同的视口创建在我的 Application.js 中。lang 和 i18n 是全局变量。旧视口被破坏并创建新视口,但如何强制重新加载类。我不想使用 window.location。

代码更新:

handler: function() {

        lang = 'en';        

        Ext.getCmp('mainview').destroy();

        i18n.getBundlestore().load({url:'/GSIP/resources/gsip/i18n/bundle-' + lang + '.properties',
            callback: function() {
                Ext.create('Ext.container.Viewport', {
                    id: 'mainview',
                    layout: 'border',
                    items: [
                        {
                         xtype: 'gsip_mainpanel',
                         region: 'center',
                         items: [{
                             xtype: 'gsip_categoriestabpanel'
                         }]

                        }
                    ]            
                });
            }
        });

    }

类别标签面板:

Ext.define('GSIP.view.CategoriesTabPanel' ,{
extend: 'Ext.tab.Panel',
alias : 'widget.gsip_categoriestabpanel',   
layout: 'fit',
items: [{
    xtype: 'gsip_planytabpanel',
    title: i18n.getMsg('key-1')
},{
    xtype: 'gsip_adresytabpanel',
    title: i18n.getMsg('key-2')
}],
initComponent: function() {

    this.callParent(arguments);

}

});

和 ResourceBundle(i18n 变量是此类的一个实例):


Ext.define('I18N.ResourceModel',{

        extend: 'Ext.data.Model',
        fields: ['key', 'value']
    });

    Ext.define('I18N.ResourceStore',{
        extend: 'GSIP.core.RegisteredStore',
        model: 'I18N.ResourceModel',
        autoLoad: true,
        proxy: {
            type: 'ajax',
            url: '/GSIP/resources/gsip/i18n/bundle-' + lang + '.properties',
            reader: {
                type: 'json',
                root: 'pl',
                successProperty: 'success'
            }
        }
    });

    Ext.define('I18N.ResourceBundle' ,{

        config: {
            bundlestore: Ext.create('I18N.ResourceStore'),
        },
        constructor: function(config) {
            this.initConfig(config);

            return this;
        },
        getMsg: function(key) {

            return this.bundlestore.getAt(this.bundlestore.findExact('key', key)).get('value');

        }
        },function(){
            //callback function, called before store load :(
        }
    );

4

1 回答 1

1

在 widget.gsip_categoriestabpanel 的定义中,您将项目设置为配置。这意味着它将始终引用相同的对象(而不是更新的对象)。作为第一步,您应该将项目定义移动到 initComponent,您还可以在那里使用 console.log(i18n) 来查看它是正确的。

于 2012-07-10T12:21:56.517 回答