Sencha Ext JS 国际化和本地化

EXTjs国际化详解 首先说明一下国际化的原理:Ext是一个充分利用面向对象概念来设计的一个框架,松耦合、高内聚的特点让它本身的组件与使用Ext开发的程序能够轻松地实现系统的国际化功能,所以Ext框架本身也内置了各国语言的本地化文件,位于source\locale包中。local包中的文件只支持对日期显示,控件校验提示的本地化功能,单独使用它并不能做到整个系统的国际化功能,当然Ext不会知道你的系统使用的是什么文本,E 阅读详情

Sencha Ext JS 国际化和本地化

对Ext JS的国际化和本地化做了些研究,有了些体会和总结,在此备忘.
首先将官方博客关于国际化和本地化的内容进行翻译,因为这篇文章很好的告诉我们该如何用Ext JS实现国际化和本地化,然后是根据自身项目的特点总结出一套自己的方案

官方博客翻译

原文地址:https://www.sencha.com/blog/internationalization-localization-with-sencha-ext-js/

Ext JS 提供”开箱即用”的国际化功能,并且很容易扩展.Ext JS 打包了超过40种本地化语言包,从印尼语到马其顿语,都很容易实现.

在本文中,我们将提供一些特殊情况和需求的解决方案,在这之前我们先看看所谓的国际化是个什么功能.

主要重点是应用程序要提供给用户选择语言的设置.这就要求应用程序是”可翻译”的,这样的功能常被称作”i18n”(internationalization单词取首尾,中间18个字母)或者”国际化”.”可翻译”的意思不仅仅是将一个语言转换为另一个语言,还要考虑到与之关联的其他技术要求.

Sencha 为大多数情况下提供了良好的国际化和本地化解决方案,考虑到企业环境下的一些特殊需求,它也是可以扩展的.

怎样本地化Ext JS应用程序

你可以从Sencha推荐的官方文档找到详细方法本地化你的应用程序.也有一些其他的推荐方法在社区成员Saki发的博客里.接下来,我们将要提到:

* 怎样直接在应用程序里写语言文件(通过singleton或override),这样它们就可以直接集成到产品构建中
* 怎样生成,通过Sencha Cmd在相同应用程序中配置不同语言进行产品构建
* 怎样每次改变语言后重新加载整个应用程序
* 怎样启动应用程序之前轻松加载额外资源
* 怎样在应用程序的不同部分使用不同的语言

这里写图片描述

需求来源

企业开发者和普通开发者是不一样的,因为他们有特殊的需求.当企业开发者选一个框架用时,他们要仔细小心的评估他们的用户需求.(看”Sencha Day 2015” Jnesis技术主管 Vincent Munier的介绍)

具有一定规模的公司普遍得出同样的结论:跨开发框架的多语言管理是个麻烦事.适用于大型组织的多语言被关注,因为他们的商业进程在产品开发和企业发展的不同阶段需要不同语言.在某些情况下,语言要求定期更换,翻译的工作需要在应用外进行,大多是由第三方软件管理,并通过一个或多个Web服务加载到应用程序里.

这种方法的优点是:
* 改变语言不需要开发者重新构建应用-改变后立即生效.
* 翻译的工作不必由那个写代码的人来做.

可以这么认为,委托翻译的人由于不知道谁写的代码或者如何在JavaScript文件里编码而造成一些问题.可是,完全可以想到使用翻译层翻译内容,一个可以由非程序员使用,并且将数据加载到应用程序里.

如上所述,官方Ext JS方案在这里查看-localization guide

我们将描述我们的方法,它原生的实现了一个翻译层.项目一开始就使用良好的方法构建国际化到应用程序里是很重要的,可以避免痛苦的重构阶段.

优雅的方法

首先,我们要深刻理解Sencha localization guide和Saki博客里的那篇文章:应用程序主屏构建之前加载语言数据.

这个方案适用于Ext JS 5之前的所有版本: 在应用程序的”index.html”文件里加入依赖到特殊的资源.

这里写图片描述

为了实现这个,我们先要用一个”单例”的类来存储翻译变量,像这样:

Ext.define('Jnesis.Labels', {
    singleton: true,
    button: 'My english button',
    title: 'My english title'
});

这样,应用程序的任何地方都能访问译文了,怎样访问呢?就像打字一样简单:Jnesis.Labels.button 或 Jnesis.Labels.title
这样做比”重写”类的方法优点在于本地化的值在一个文件里且容易使用,因为像上面看到的那样,每个元素是一个变量.

一旦做到这一点,我们选择其他语言后只需要”重写”覆盖这个语言文件.有两个步骤:
1. 从web服务加载数据,服务器响应回的JSON看起来像这样:

{
    "button": "Mon Bouton",
    "title": "Mon titre"
}

我们需要解析数据并用解析到的值覆盖我们默认的本地化单例类:

Ext.define ('Jnesis.Application', {
    launch:  function () {
        Ext.Ajax.request({
            url: 'get-localization',
            params:{locale:'fr'},
            callback: function (options, success, response) {
                var data = Ext.decode(response.responseText, true);
                Ext.override(Jnesis.Labels, data);
                Ext.create('Jnesis.view.main.Main');
            }
        });
    }
});
  1. 加载重写的Ext JS类:
Ext.define('Jnesis.locale.fr.Labels', {
    override: 'Jnesis.Labels',
    button: 'Mon Bouton',
    title: 'Mon titre'
});

然后用Ext.Loader.loadscript 方法处理它,当它完成后加载我们的主视图:

Ext.define ('Jnesis.Application', {
    launch: function () {
        var lang = 'fr',
            url = 'resources/locale/'+lang+'/Labels.js';
        Ext.Loader.loadScript({
            url: url,
            onLoad: function (options) {
                Ext.create('Jnesis.view.main.Main');
            }
        });
    }
});

然后,我们希望通过在component基类里定义一个新的属性(例如:”localized”),使用我们擅长的原生继承机制获取到翻译类属性.这个属性可以是由键,值组成的简单JavaScript对象(记住上面的Jnesis.Labels.button 和 Jnesis.Labels.title).

用定义键的字符串,就可以获取到对象的值:

Ext.define('Jnesis.view.main.Main', {
    extend: 'Ext.panel.Panel',
    localized: {
        title: 'Jnesis.Labels.title'
    },
    buttons: [{
        localized: {
            text: 'Jnesis.Labels.button'
        },
        handler: 'onClickButton'
    }]
});

一旦做到这一点,我们只需要重写”initComponent”的基类方法并将键的字符串转换为对象的值,那么我们就可以在任意Ext JS组件里使用了:

Ext.define('overrides.localized.Component', {
    override: 'Ext.Component',
    initComponent: function() {
        var me = this,
            localized = me.localized,
            value;
        if (Ext.isObject(localized)) {
            for (var prop in localized) {
                value = localized[prop];
                if (value) {
                    me[prop] = eval(value);
                }
            }
        }
        me.callParent(arguments);
    }
});

此解决方案以透明的方式在任何层级的组件声明(container 配置或 item 配置)正常运行.

我的解决方案

综合官方方案、Saki博客和Sencha论坛网友提供的方法,再根据自身项目的修改,形成自己的解决方案.

项目介绍

前端全部采用Ext Js开发的单页面Desktop应用程序,也就是使用了Ext Js里的Desktop组件加以修改.使用Sencha Cmd进行构建.

后端采用Java Spring MVC

修改需求:现需要将中文版加入英文版功能,并且可以随浏览器语言来识别显示中文版还是英文版,并且可以由用户自行修改语言,并记住语言.

需求分析:其实就是要做国际化和本地化,但后端和前端都有需要做国际化地方,所以统一由server端管理

获取语言:当打开应用时浏览器通过js查询本地cookie并获取,
设置语言:当用户点击指定语言,发送请求到server修改cookies里的语言并响应回由浏览器接收显示
server端国际化由spring mvc完成
前端国际化分为两部分
A. 为项目内容的国际化,如产品,客户,用户登录等.
B. 为Ext JS自身组件的国际化,例如必填字段提示文字,grid列头选择标题字等.

实现A的方案

要想实现A,参考官方的方案即可,且可以做到无刷新更换语言.因为官方的方案是只写了一个类,另一种语言需要从后端请求JSON覆盖JS类的方法来实现,不够统一,我将其修改为以下方法:

定义一个单例的翻译类Locale,加入了多语言属性:

Ext.define('VSMS.Locale', {
    singleton: true,
    lang: 'zh_CN',
    username: {
        zh_CN: '用户名',
        en: 'Username'      
    },
    inputusername: {
        zh_CN: '输入用户名',
        en: 'Input username'        
    },
    login: {
        zh_CN: '登录',
        en: 'Login'
    },
    forgotpassword: {
        zh_CN: '忘记密码',
        en: 'Forgot password'
    },
    logout: {
        zh_CN: '注销',
        en: 'Logout'
    },
    Dywexit: {
        zh_CN: '确定要退出吗?',
        en: 'Exit?'
    },
    password: {
        zh_CN: '密码',
        en: 'Password'
    },
    inputpassword: {
        zh_CN: '输入密码',
        en: 'Input password'
    },
    checkcode: {
        zh_CN: '验证码',
        en: 'Check code'
    },
    changeone: {
        zh_CN: '换一张',
        en: 'Change'
    },
    autologin: {
        zh_CN: '自动登录',
        en: 'Auto login'
    }
})

Application初始化时初始化VSMS.Locale.lang:

Ext.define('VSMS.Application', {
    extend: 'Ext.app.Application',

    name: 'VSMS',

    stores: [
        // TODO: add global / shared stores here
    ],
    launch: function() {
        //获取cookie 本地化语言
        var lang = Ext.util.Cookies.get('lang');
        if(!lang){
            lang = 'zh_CN';
        }
        VSMS.Locale.lang = lang;
    }
});

在Sencha Cmd项目里的overrides新建目录localized,并重写Component的initComponent方法:

这里写图片描述

Ext.define('overrides.localized.Component', {
    override: 'Ext.Component',
    initComponent: function() {
        var me = this,
            localized = me.localized,
            value;
        if (Ext.isObject(localized)) {
            for (var prop in localized) {
                value = localized[prop];
                if (value) {
                    me[prop] = eval(value)[VSMS.Locale.lang];//根据不同语言来获取不同属性的值
                }
            }
        }
        me.callParent(arguments);
    }
});

在view上使用localized属性包住需要翻译的属性,完整的view太长,下面显示了一个片段:

items: [{
    xtype: 'textfield',
    name: 'username',
    localized: {
        fieldLabel: 'VSMS.Locale.username', //用户名
        emptyText: 'VSMS.Locale.inputusername' //输入用户名
    },
    fieldCls: 'logininput',
    beforeBodyEl: '<i id=\'iconuser\' class=\'fa fa-user loginicont loginiconu loginicon\'></i>',
    enableKeyEvents: true
        }]

那么在viewController里如何使用翻译属性呢?参照下面的写法:

VSMS.Locale.changeone[VSMS.Locale.lang]

到现在,所有A部分的国际化完成了.

实现B的方案

我们知道,在用Sencha Cmd构建不同语言应用程序时需要在项目根目录的app.json指定:

    "requires": [
        "ext-locale"
    ]
    "locales": [
        "zh_CN"
    ],

_注意: locales不要写成locale了,我因为写错了导致找了很久_

可是在构建时locales只能构建一个语言.如果能构建多个语言,并通过一个”index.html”进行选择加载就能实现B的国际化了.思路如下图:

这里写图片描述

下面是实现方法

修改Sencha Cmd项目根目录下app.json的以下属性:

    "requires": [
        "ext-locale"
    ],

    "locales": [
        "zh_CN",
        "en"
    ],

    "builds": {
        "crisp": {
            "theme": "ext-theme-crisp"
        }
    },

    "bootstrap": {
        "base": "${app.dir}",
        "manifest": "${build.id}.json",
        "microloader": "bootstrap.js",
        "css": "bootstrap.css"
    },

    "output": {
        "base": "${workspace.build.dir}/${build.environment}/${app.name}/${build.id}",
        "page": "../index.html",
        "manifest": "../${build.id}.json",
        "deltas": {
            "enable": false
        },
        "cache": {
            "enable": false
        },
        "js": {
            "optimize": {
                "callParent": true,
                "cssPrefix": true,
                "defines": true
            }
        }
    },

修改build.xml文件如下:

<?xml version="1.0" encoding="utf-8"?><project name="${app.name}" default=".help">
    <!--
    The build-impl.xml file imported here contains the guts of the build process. It is
    a great idea to read that file to understand how the process works, but it is best to
    limit your changes to this file.
    -->
    <import file="${basedir}/.sencha/app/build-impl.xml"/>

    <!--
    The following targets can be provided to inject logic before and/or after key steps
    of the build process:

        The "init-local" target is used to initialize properties that may be personalized
        for the local machine.

            <target name="-before-init-local"/>
            <target name="-after-init-local"/>

        The "clean" target is used to clean build output from the build.dir.

            <target name="-before-clean"/>
            <target name="-after-clean"/>

        The general "init" target is used to initialize all other properties, including
        those provided by Sencha Cmd.

            <target name="-before-init"/>
            <target name="-after-init"/>

        The "page" target performs the call to Sencha Cmd to build the 'all-classes.js' file.

            <target name="-before-page"/>
            <target name="-after-page"/>

        The "build" target performs the call to Sencha Cmd to build the application.

            <target name="-before-build"/>
            <target name="-after-build"/>
    -->

    <macrodef name="x-run-build">
        <attribute name="target"/>
        <attribute name="theme"/>
        <attribute name="locale" default="en"/>
        <attribute name="buildName" default="@{theme}"/>
        <attribute name="buildId" default="@{theme}-@{locale}"/>
        <sequential>
            <if>
                <equals arg1="@{locale}" arg2=""/>
                <then>
                    <ant dir="${basedir}" inheritall="false" inheritrefs="true" target="@{target}">
                        <property name="compiler.ref.id" value="${compiler.ref.id}-@{theme}"/>
                        <property name="app.theme" value="ext-theme-@{theme}"/>
                        <property name="app.build.dir.suffix" value="ext-theme-@{theme}"/>
                        <property name="cmd.dir" value="${cmd.dir}"/>
                        <property name="build.environment" value="${build.environment}"/>
                        <property name="build.compression.yui" value="${build.compression.yui}"/>
                        <property name="build.id" value="@{buildId}"/>
                        <property name="build.name" value="@{buildName}"/>
                    </ant>
                </then>
                <else>
                    <ant dir="${basedir}" inheritall="false" inheritrefs="true" target="@{target}">
                        <property name="compiler.ref.id" value="${compiler.ref.id}-@{theme}-@{locale}"/>
                        <property name="app.theme" value="ext-theme-@{theme}"/>
                        <property name="app.locale" value="@{locale}"/>
                        <property name="app.build.dir.suffix" value="ext-theme-@{theme}-@{locale}"/>
                        <property name="cmd.dir" value="${cmd.dir}"/>
                        <property name="build.environment" value="${build.environment}"/>
                        <property name="build.compression.yui" value="${build.compression.yui}"/>
                        <property name="build.id" value="@{buildId}"/>
                        <property name="build.name" value="@{buildName}"/>
                    </ant>
                </else>
            </if>
        </sequential>
    </macrodef>

    <target name="build-all" depends="build-crisp,build-crisp-touch"/>

    <!--<target name="clean" depends="init,clean-all"/>-->
    <!--<target name="build" depends="init,build-all"/>-->

    <!-- Build -->

    <target name="build-crisp" depends="init">
        <echo>Build ${app.name} - Crisp Theme</echo>
        <x-run-build theme="crisp" target="app-build-impl.build"/>
    </target>

    <target name="build-crisp-touch" depends="init">
        <echo>Build ${app.name} - Crisp Touch Theme</echo>
        <x-run-build theme="crisp-touch" target="app-build-impl.build"/>
    </target>

    <!-- Watch -->

    <target name="watch-crisp" depends="init">
        <echo>Watch ${app.name} - Crisp Theme</echo>
        <x-run-build theme="crisp" target="watch"/>
    </target>

    <target name="watch-crisp-touch" depends="init">
        <echo>Watch ${app.name} - Crisp Touch Theme</echo>
        <x-run-build theme="crisp-touch" target="watch"/>
    </target>

    <!-- Refresh -->

    <target name="refresh-crisp" depends="init">
        <echo>Refresh ${app.name} - Crisp Theme</echo>
        <x-run-build theme="crisp" target="app-build-impl.refresh"/>
    </target>

    <target name="refresh-crisp-touch" depends="init">
        <echo>Refresh ${app.name} - Crisp Theme</echo>
        <x-run-build theme="crisp-touch" target="app-build-impl.refresh"/>
    </target>

    <!-- Clean -->
    <target name="clean-all" depends="clean-crisp,clean-crisp-touch"/>

    <target name="clean-crisp" depends="init">
        <echo>Clean ${app.name} - Crisp Theme</echo>
        <x-run-build theme="crisp" target="app-build-impl.clean"/>
    </target>

    <target name="clean-crisp-touch" depends="init">
        <echo>Clean ${app.name} - Crisp Theme</echo>
        <x-run-build theme="crisp-touch" target="app-build-impl.clean"/>
    </target>

    <target name="sass-full" depends="resources,sass"/>

    <target name="sass-all" depends="init">
        <for param="theme" list="crisp,crisp-touch">
            <sequential>
                <x-run-build target="sass-full" theme="@{theme}"/>
            </sequential>
        </for>
    </target>
</project>

修改index.html文件如下:

<!DOCTYPE HTML><html><head>
    <meta charset="UTF-8">
    <title>Application Name</title>

    <script type="text/javascript">
        var Ext = Ext || {};
            Ext.repoDevMode = true;

        Ext.beforeLoad = function(tags){
            var theme = location.href.match(/theme=([\w-]+)/), //这里采用获取地址参数来加载语言,可以根据需求改为从cookies获取语言
            locale = location.href.match(/locale=([\w-]+)/);
            theme  = (theme && theme[1]) || 'crisp';
            locale = (locale && locale[1]) || 'en';
            Ext.manifest = theme + "-" + locale;
         };
    </script>

    <!-- The line below must be kept intact for Sencha Cmd to build your application -->
    <script id="microloader" type="text/javascript" src="bootstrap.js"></script>
</head><body></body></html> 

_注意: index.html里的注释,根据需求修改_

这样B部分的国际化就完成了,每次加载页面时根据cookies里的不同参数Ext JS组件就能显示不同语言.你应该注意到了这个方案不仅能改变语言,还能改变主题.此方案默认采用的是Ext JS5的crisp主题,如果你是低版本且没有这个主题的项目可以修改为你项目对应的主题.

不足

因为A部分方案是不需要刷新页面就能切换语言的,但B部分的方案需要刷新页面来支持切换,所以整个项目还是需要刷新来加载语言.解决办法是将B部分里的翻译集成到A里,或者还有其他的办法,欢迎赐教.

最终效果展示

这里写图片描述

这里写图片描述

相关文档:

http://docs.sencha.com/extjs/6.0.2-classic/guides/core_concepts/localization.html

https://www.sencha.com/blog/internationalization-localization-with-sencha-ext-js/

http://extjs.eu/localization-of-ext-applications/

https://www.sencha.com/forum/showthread.php?295987-UPDATED-Two-themes-in-single-app-5.1

EXTJS desktop 国际化 NULL 博文链接:https://longyou.iteye.com/blog/1123360 立即下载

相关推荐

Globus 数据下载

Globus 大数据下载流程~

weixin_43978558的博客 6622

extjs - 多国语言化

在下载下来的extjs包里应该有一个locale目录,里面会有不同国家的组件语言设置

技术记录 2821

Android逆向实战:通过smali/baksmali动态注入DEX逻辑

本文详细介绍了在无源码条件下对Android应用进行动态逻辑注入的实战方法。通过使用smali和baksmali工具对DEX文件进行反编译、修改与重打包,实现在目标方法中插入自定义代码(如日志打印),并分享了定位目标、处理寄存器、避免常见错误的实用技巧与避坑指南。

weixin_29008691的博客 363

Extjs多语言实现

Extjs 版本4.2 thinkphp 3.2.3在public 公共目录下,如下建立国际化js文件(中英文) 在myproject-lang-zh_CN.js中var myproject = {}; myproject.Message = {}; myproject.Message.Code = 'Code';则在Extjs的组件中引用国际化就可以使用myproject.Message.Cod

春暖花自开 1083

Python 上位机开发

首先,什么是上位机?上位机通常是指可以与下位机(如单片机、传感器等硬件设备)进行通信和交互,实现数据采集、控制指令发送以及数据处理和展示的计算机程序。 Python 作为一种高级编程语言,在开发上位机方面具有诸多优势。它拥有丰富的第三方库,使得开发过程变得相对简单和高效。

weixin_46807151的博客 4303

达梦数据库(DM)的备份与恢复功能

本文系统介绍了达梦数据库(DM)的备份与恢复功能,主要包括作业系统和物理/逻辑备份还原两大模块。作业系统部分详细说明了通过代理环境创建定时备份和删除备份作业的步骤;物理备份还原部分阐述了联机和脱机备份方式,包括数据库、表空间、表和归档的备份还原操作;逻辑备份还原部分介绍了dexp/dimp工具的使用方法及四种级别的导入导出功能。文章还介绍了图形化管理工具进行备份还原的操作流程,全面覆盖了达梦数据库的数据保护方案,为数据库管理员提供了详细的技术指导。

weixin_48812832的博客 1210

ExtJs 学习笔记9国际化和汉字的使用问题

beidou321的专栏 205

爆肝5万字❤️Open3D 点云数据处理基础(Python版)

本文为Open3D 点云数据处理基础教程(Python版),小白也能轻松上手!还等什么呢,学起来!

孙悟空 13万+

ExtJs4本地化

在做Extjs4为前台的时候,遇到本地化的问题。通过google找到一点资料,希望记录下来以为后用。 参考内容: Extjs4 API文档阅读(七)——本地化(Localization) http://www.cnblogs.com/shukefrz/articles/2322932.html 以下为转载内容: 工作后干的活有点乱七八糟,被折磨死每一段时间就要学新的语言。2011下半...

lusam的专栏 227

详解账务核心,从入门到精通

本文系统阐述了账务体系的设计原理与实现方法,围绕支付交易的基础设施——账务系统展开深入探讨。文章首先从账务实现原理出发,强调从客户场景中抽象能力的重要性,详细解析了账务总架构及其与外围系统的协同关系。随后重点剖析了账户子系统的设计,包括账户生态、主体管理、结构设计等核心要素,并针对热点账户问题提出了多种创新解决方案。此外,文章还深入探讨了会计日切原理、营销类账务处理等专业领域,最后以支付机构场景为例,全面解析了清结算业务的账务实现模型。全文通过理论结合实践的方式,为构建高效、可靠的账务系统提供了系统性的方法

银行信息系统应用架构详解 530

手机相机Tuning专项调优(一):基础流程与图像主观评价标准建立实战解析

本篇为手机相机系统“Tuning专项调优”系列的开篇,深入剖析了当前手机相机Tuning的基本流程与图像主观评价标准的构建方法。结合实际工程经验与最新业界案例,详细介绍ISP调优和3A控制中涉及的主观评价标准,如锐度、色彩饱和度、噪声感知等,并提出一套可工程化落地的标准制定与评测实践体系,帮助工程师有效提升图像品质。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1933

sencha touch Msg中文提示框

在默认情况下sencha touch的消息提示框为英文: [code="javascript"] Ext.Msg.alert('message'); [/code]结果如下: [img]http://dl2.iteye.com/upload/attachment/0092/2239/fc833f04-0c54-38b9-a022-ed314a7da981.png[/img] 可在...

wo4330839的专栏 274

Oracle EBS R12 主 / 辅助分类帐(主 / 辅助帐套)落地

本文提供了Oracle EBS R12主/辅助分类帐实施的全套文档模板,包含主帐套(法定帐套)和辅助帐套的完整配置清单、科目映射规则模板、4类典型调整分录示例(存货跌价、折旧差异、往来重分类、外币折算)以及税会/IFRS案例分录。重点阐述了主/辅助帐套的配置要点、SLA子分类帐关键配置、科目映射规则(一对一、多对一、重分类等类型)以及调整分录的自动生成逻辑。文档可直接用于项目实施,包含总体架构图、科目映射矩阵表、会计规则集配置等交付物,并附有Excel版模板便于直接使用。适用于需要实现多准则并行记账、税务调

金牌架构师 386

sencha touch Ext.date.monthNames

sencha touch-2.4.1 修改月份为中文,文件位置在touch-src-viewport-DateExtras.js monthNames : [         "一月",         "二月",         "三月",         "四月",         "五月",         "六月",         "七月",         "八月",

jusdingzy的博客 508

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

datepicker的汉化(sencha touch)

sencha touch中提供的datepicker,是英文版的,在中国做软件当然要汉化。   如上图,就是sencha的原版datepicker,我们要对它进行汉化。找源码:找到js源码文件sencha-touch-debug.js 在文件中搜索datepicker部分。找到Ext.DatePicker的initComponent方法,对如下代码做修改 for (i = yearsF

精彩人生 929

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

精通 Ext.js(一)

如果你是一名 Ext JS 开发者,你可能花费了不少时间来学习这个框架。我们知道 Ext JS 的学习曲线并不短。在我们掌握了基础知识之后,当我们需要在日常工作中使用 Ext JS 时,会涌现出很多问题:一个组件如何与另一个组件通信?最佳实践是什么?使用这种方法而不是另一种方法是否真的值得?还有没有其他方式可以实现相同的功能?这是正常的。本书是考虑到这些开发者而编写的。因此,这就是本书的主题:我们如何将所有内容整合在一起,并使用 Ext JS 创建真正出色的应用程序?

龙哥盟 680

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Ext JS多语言

国际化和本地化 对Ext JS的国际化和本地化做了些研究,有了些体会和总结,在此备忘. 首先将官方博客关于国际化和本地化的内容进行翻译,因为这篇文章很好的告诉我们该如何用Ext JS实现国际化和本地化,然后是根据自身项目的特点总结出一套自己的方案 官方博客翻译 原文地址:https://www.sencha.com/blog/internationalization-loca

我的成长之路! 2413

Ext JS 4.2.1 Beta 1发布了

下载地址:http://www.sencha.com/forum/showthread.php?261008-Ext-JS-4.2.1-Beta-1-Now-AvailableI am pleased to announce that Ext JS 4.2.1 Beta 1 is available for your testing and reviewing pleasure. We have

黄灯桥的专栏 3879

使用sencha cmd操作ExtJS 6

Using Sencha Cmd with Ext JS 6(原文) sencha cmd是用来创建,构建ExtJS 程序的工具。准备您需要安装好sencha cmd命令行工具。创建应用程序sencha cmd创建ExtJS的程序框架//方法一:创建ExtJS 6 项目 // 打开命令行窗口,window上即cmd.exe sencha -sdk /path/to/ext6 generate ap

Steve.Tao的博客 1078

使用Ext JS社区版的快速模版:创建移动版应用程序

注册社区版 社区版的注册地址如下: https://www.sencha.com/products/extjs/communityedition/?utm_source=snceb&amp;amp;utm_medium=email&amp;amp;utm_campaign=sncextjs-communtiy&amp;amp;utm_content=181106-pt-sncextjs-community 注册社区版要注...

黄灯桥的专栏 1983

Sencha 包(Package)

在 ExtJS 应用程序中,可以使用包(package)。Package 的优点(主题也是一种 package),它可以很容易地在不同的应用程序之间共享代码。增加了组件复用的可能性。 例如,您在 grid 顶部有自己设计的搜索工具栏。那么把这个工具栏放到你自己的 package 中就是一个不错的选择。这样,直接把 package 添加到应用程序中,就可以使用这些组件了,而不需要再你的项目结构中复...

小桥流水丿小溪 911

sencha touch中datepicker的汉化

sencha touch中提供的datepicker,是英文版的,在中国做软件当然要汉化。 如上图,就是sencha的原版datepicker,我们要对它进行汉化。找源码:找到js源码文件sencha-touch-debug.js 在文件中搜索datepicker部分。找到Ext.DatePicker的initComponent方法,对如下代码做修改 for (i = yearsF...

weixin_34254823的博客 59

Sencha Touch2.3.1中自定义Ext.Msg中按钮显示信息方法

由于框架中消息框显示都是英文的,根据实际需要须改成中文的,网上找的方法都没解决,只好自己看源码,最终找到了解决办法。 源码中定义如下:  statics: {         OK    : {text: 'OK',     itemId: 'ok',  ui: 'action'},         YES   : {text: 'Yes',    itemId: 'yes', ui: '

CXC0716的专栏 2068
上一篇: Java调用C++库文件例子
下一篇: ExtJs 当饼图只有一项数据记录占比为100%时tooltip和events无效问题修复
etimechen
博客等级 码龄21年 19粉丝 18原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值