lxw
2020-07-11 9db52f2f2dd3665fe9da1ae5657e0167c3a34d40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
(function( $, window, undefined ) {
        
     var language =  window.navigator.language.replace("-","_"),
      
        defaultFolder = "i18n",
 
        mobile = $.mobile,
 
        version = mobile.version;
    
        
    mobile.i18n = {
        
        /**
         * 获得国际化信息
         * @param {String} key 国际化信息字符串,如"user.name"
         * @param {Object} context 国际化信息上下文,默认为window.i18n
         * @method getText
         */
        getText: function( key, context ){
            if( !key || typeof( key ) !== "string" ) return;
            var parts = key.split("."),
                obj = context || window.i18n || window;
            if ( typeof( obj ) !== "object" ) return;
            for( var i=0, p ; p = parts[i]; i++){
                obj =  ( p in obj ) ? obj[p] : undefined;
                if ( obj === undefined ) return;
            }
    
            return obj;
        },
        
        
        /**
         * 处理某个DOM元素中的国际化标签
         * @param {DOM} 
         * @return {jQuery} 封装后的jQuery对象
         */
        applyI18n: function( ele ){
            var $eles = $( ele ),
                getText = this.getText;
            if( $eles.length ===0 ) return;
 
            var applyContext = function() {
                var inputs = "input,textarea,select",
                    $this = $( this ),
                    key = $this.attr( "data-i18n" ),
                    value = getText( key ),
                    reg = new RegExp( "\\b" + this.nodeName.toLowerCase() + "\\b" );
                inputs.match( reg ) ? $this.val( value ) : $this.text( value );
            };
            
            var apply2Ele = function( $ele ) {
                $ele.children().length === 0 ? 
                    $ele.each( applyContext ) : 
                    $ele.find( "[data-i18n]" ).each( applyContext );
            };
 
            return $eles.each( function(){
                var $ele = $(this),
                    isScriptEle = $ele[0].tagName.toLowerCase() === "script",
                    scriptType  = $ele[0].type,
                    $div = $("<div></div>");
                if( scriptType === "" || scriptType === "text/javascript" ) return;
                apply2Ele( isScriptEle ? $div.html( $ele.html() ) : $ele );
                isScriptEle && $ele.html( $div.html() );
            });
        },
        
        /**
         * 获得当前浏览器的语言
         * @return {String} 返回当前语言类型,如"zh-CN"、"en-US"等
         */
        getLanguage: function() {
             return language.replace("_","-");
            
        }
        
    };
    
    
    var loadJSON = function( folder ) { 
        var url = folder + "/" + language + ".json?_=" + new Date().getTime();
        $.ajax({
            url: url,
            async: false,
            dataType: "json",
            success: function( msg ){
                window.i18n = msg;
            },
            error: function(){
                console.error("error: Could not find file " +  url )
            }
        });
        
    }, i18n = mobile.i18n;
        
    
    // 检测是否开启国际化,用于可以在$(document).bind("mobileinit",function(){})中进行设置
    if( mobile.i18nEnabled ) {
        
        var path = $("script").filter(function(){ return this.src.match(/jquery\.mobile/)})[0].src,
            reg = new RegExp("(.*?)\/\\w+\/jquery\.mobile-" + version +"(?:\.min)?\.js$");
        
        path = path.match(reg)[1];
        
        loadJSON( path + "/" + ( mobile.i18nFolder || defaultFolder ) ) ;
        
        // 页面渲染前进行国际化信息替换
        $(document).bind("pagebeforecreate", function( evt ) { 
            var $page = $( evt.target );
            i18n.applyI18n( $().add( $page ).add( $page.find( "script" ) ) );
        });
   }
 
})( jQuery, this );