2023-03-04 00:18:55 +00:00
/ *
Copyright ( c ) Jim Garvin ( http : //github.com/coderifous), 2008.
Dual licensed under the GPL ( http : //dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses.
Written by Jim Garvin ( @ coderifous ) for use on LMGTFY . com .
http : //github.com/coderifous/jquery-localize
Based off of Keith Wood ' s Localisation jQuery plugin .
http : //keith-wood.name/localisation.html
* /
2023-03-12 15:58:15 +00:00
( function ( $ ) {
2023-03-04 00:18:55 +00:00
var normaliseLang ;
2023-03-12 15:58:15 +00:00
normaliseLang = function ( lang ) {
lang = lang . replace ( /_/ , "-" ) . toLowerCase ( ) ;
2023-03-04 00:18:55 +00:00
if ( lang . length > 3 ) {
lang = lang . substring ( 0 , 3 ) + lang . substring ( 3 ) . toUpperCase ( ) ;
}
return lang ;
} ;
2023-03-12 15:58:15 +00:00
$ . defaultLanguage = normaliseLang (
navigator . languages && navigator . languages . length > 0
? navigator . languages [ 0 ]
: navigator . language || navigator . userLanguage
) ;
$ . localize = function ( pkg , options ) {
var defaultCallback ,
deferred ,
fileExtension ,
intermediateLangData ,
jsonCall ,
lang ,
loadLanguage ,
localizeElement ,
localizeForSpecialKeys ,
localizeImageElement ,
localizeInputElement ,
localizeOptgroupElement ,
notifyDelegateLanguageLoaded ,
regexify ,
setAttrFromValueForKey ,
setTextFromValueForKey ,
valueForKey ,
wrappedSet ;
2023-03-04 00:18:55 +00:00
if ( options == null ) {
options = { } ;
}
wrappedSet = this ;
intermediateLangData = { } ;
fileExtension = options . fileExtension || "json" ;
deferred = $ . Deferred ( ) ;
2023-03-12 15:58:15 +00:00
loadLanguage = function ( pkg , lang , level ) {
2023-03-04 00:18:55 +00:00
var file ;
if ( level == null ) {
level = 1 ;
}
switch ( level ) {
case 1 :
intermediateLangData = { } ;
if ( options . loadBase ) {
file = pkg + ( "." + fileExtension ) ;
return jsonCall ( file , pkg , lang , level ) ;
} else {
return loadLanguage ( pkg , lang , 2 ) ;
}
break ;
case 2 :
2023-03-12 15:58:15 +00:00
file = "" + pkg + "-" + lang . split ( "-" ) [ 0 ] + "." + fileExtension ;
2023-03-04 00:18:55 +00:00
return jsonCall ( file , pkg , lang , level ) ;
case 3 :
2023-03-12 15:58:15 +00:00
file =
"" +
pkg +
"-" +
lang . split ( "-" ) . slice ( 0 , 2 ) . join ( "-" ) +
"." +
fileExtension ;
2023-03-04 00:18:55 +00:00
return jsonCall ( file , pkg , lang , level ) ;
default :
return deferred . resolve ( ) ;
}
} ;
2023-03-12 15:58:15 +00:00
jsonCall = function ( file , pkg , lang , level ) {
2023-03-04 00:18:55 +00:00
var ajaxOptions , errorFunc , successFunc ;
if ( options . pathPrefix != null ) {
file = "" + options . pathPrefix + "/" + file ;
}
2023-03-12 15:58:15 +00:00
successFunc = function ( d ) {
2023-03-04 00:18:55 +00:00
$ . extend ( intermediateLangData , d ) ;
notifyDelegateLanguageLoaded ( intermediateLangData ) ;
return loadLanguage ( pkg , lang , level + 1 ) ;
} ;
2023-03-12 21:00:35 +00:00
errorFunc = function ( xhr , status , error ) {
if ( status === "error" && xhr . status === 404 ) {
// Le fichier n'existe pas
console . log ( "Le fichier " + file + " n'existe pas." ) ;
} else if ( level === 2 && lang . indexOf ( "-" ) > - 1 ) {
2023-03-04 00:18:55 +00:00
return loadLanguage ( pkg , lang , level + 1 ) ;
} else if ( options . fallback && options . fallback !== lang ) {
return loadLanguage ( pkg , options . fallback ) ;
}
} ;
ajaxOptions = {
url : file ,
dataType : "json" ,
async : true ,
timeout : options . timeout != null ? options . timeout : 500 ,
success : successFunc ,
2023-03-12 15:58:15 +00:00
error : errorFunc ,
2023-03-12 21:00:35 +00:00
statusCode : {
404 : function ( ) {
console . log ( "Le fichier " + file + " n'existe pas." ) ;
}
}
2023-03-04 00:18:55 +00:00
} ;
if ( window . location . protocol === "file:" ) {
2023-03-12 15:58:15 +00:00
ajaxOptions . error = function ( xhr ) {
2023-03-04 00:18:55 +00:00
return successFunc ( $ . parseJSON ( xhr . responseText ) ) ;
} ;
}
return $ . ajax ( ajaxOptions ) ;
} ;
2023-03-12 15:58:15 +00:00
notifyDelegateLanguageLoaded = function ( data ) {
2023-03-04 00:18:55 +00:00
if ( options . callback != null ) {
return options . callback ( data , defaultCallback ) ;
} else {
return defaultCallback ( data ) ;
}
} ;
2023-03-12 15:58:15 +00:00
defaultCallback = function ( data ) {
2023-03-04 00:18:55 +00:00
$ . localize . data [ pkg ] = data ;
2023-03-12 15:58:15 +00:00
return wrappedSet . each ( function ( ) {
2023-03-04 00:18:55 +00:00
var elem , key , value ;
elem = $ ( this ) ;
key = elem . data ( "localize" ) ;
key || ( key = elem . attr ( "rel" ) . match ( /localize\[(.*?)\]/ ) [ 1 ] ) ;
value = valueForKey ( key , data ) ;
if ( value != null ) {
return localizeElement ( elem , key , value ) ;
}
} ) ;
} ;
2023-03-12 15:58:15 +00:00
localizeElement = function ( elem , key , value ) {
if ( elem . is ( "input" ) ) {
2023-03-04 00:18:55 +00:00
localizeInputElement ( elem , key , value ) ;
2023-03-12 15:58:15 +00:00
} else if ( elem . is ( "textarea" ) ) {
2023-03-04 00:18:55 +00:00
localizeInputElement ( elem , key , value ) ;
2023-03-12 15:58:15 +00:00
} else if ( elem . is ( "img" ) ) {
2023-03-04 00:18:55 +00:00
localizeImageElement ( elem , key , value ) ;
2023-03-12 15:58:15 +00:00
} else if ( elem . is ( "optgroup" ) ) {
2023-03-04 00:18:55 +00:00
localizeOptgroupElement ( elem , key , value ) ;
2023-03-12 15:58:15 +00:00
} else if ( $ . isArray ( value ) ) {
elem . empty ( ) ;
for ( const key in value ) {
var converter = new showdown . Converter ( ) ,
text = value [ key ] ,
converted = converter . makeHtml ( text ) ;
elem . append ( converted ) ;
}
2023-03-04 00:18:55 +00:00
} else if ( ! $ . isPlainObject ( value ) ) {
elem . html ( value ) ;
}
if ( $ . isPlainObject ( value ) ) {
return localizeForSpecialKeys ( elem , value ) ;
}
} ;
2023-03-12 15:58:15 +00:00
localizeInputElement = function ( elem , key , value ) {
2023-03-04 00:18:55 +00:00
var val ;
val = $ . isPlainObject ( value ) ? value . value : value ;
if ( elem . is ( "[placeholder]" ) ) {
return elem . attr ( "placeholder" , val ) ;
} else {
return elem . val ( val ) ;
}
} ;
2023-03-12 15:58:15 +00:00
localizeForSpecialKeys = function ( elem , value ) {
2023-03-04 00:18:55 +00:00
setAttrFromValueForKey ( elem , "title" , value ) ;
setAttrFromValueForKey ( elem , "href" , value ) ;
return setTextFromValueForKey ( elem , "text" , value ) ;
} ;
2023-03-12 15:58:15 +00:00
localizeOptgroupElement = function ( elem , key , value ) {
2023-03-04 00:18:55 +00:00
return elem . attr ( "label" , value ) ;
} ;
2023-03-12 15:58:15 +00:00
localizeImageElement = function ( elem , key , value ) {
2023-03-04 00:18:55 +00:00
setAttrFromValueForKey ( elem , "alt" , value ) ;
return setAttrFromValueForKey ( elem , "src" , value ) ;
} ;
2023-03-12 15:58:15 +00:00
valueForKey = function ( key , data ) {
2023-03-04 00:18:55 +00:00
var keys , value , _i , _len ;
keys = key . split ( /\./ ) ;
value = data ;
for ( _i = 0 , _len = keys . length ; _i < _len ; _i ++ ) {
key = keys [ _i ] ;
value = value != null ? value [ key ] : null ;
}
return value ;
} ;
2023-03-12 15:58:15 +00:00
setAttrFromValueForKey = function ( elem , key , value ) {
2023-03-04 00:18:55 +00:00
value = valueForKey ( key , value ) ;
if ( value != null ) {
return elem . attr ( key , value ) ;
}
} ;
2023-03-12 15:58:15 +00:00
setTextFromValueForKey = function ( elem , key , value ) {
2023-03-04 00:18:55 +00:00
value = valueForKey ( key , value ) ;
if ( value != null ) {
return elem . text ( value ) ;
}
} ;
2023-03-12 15:58:15 +00:00
regexify = function ( string _or _regex _or _array ) {
2023-03-04 00:18:55 +00:00
var thing ;
if ( typeof string _or _regex _or _array === "string" ) {
return "^" + string _or _regex _or _array + "$" ;
} else if ( string _or _regex _or _array . length != null ) {
2023-03-12 15:58:15 +00:00
return ( function ( ) {
2023-03-04 00:18:55 +00:00
var _i , _len , _results ;
_results = [ ] ;
2023-03-12 15:58:15 +00:00
for (
_i = 0 , _len = string _or _regex _or _array . length ;
_i < _len ;
_i ++
) {
2023-03-04 00:18:55 +00:00
thing = string _or _regex _or _array [ _i ] ;
_results . push ( regexify ( thing ) ) ;
}
return _results ;
2023-03-12 15:58:15 +00:00
} ) ( ) . join ( "|" ) ;
2023-03-04 00:18:55 +00:00
} else {
return string _or _regex _or _array ;
}
} ;
2023-03-12 15:58:15 +00:00
lang = normaliseLang (
options . language ? options . language : $ . defaultLanguage
) ;
2023-03-04 00:18:55 +00:00
if ( options . skipLanguage && lang . match ( regexify ( options . skipLanguage ) ) ) {
deferred . resolve ( ) ;
} else {
loadLanguage ( pkg , lang , 1 ) ;
}
wrappedSet . localizePromise = deferred ;
return wrappedSet ;
} ;
$ . fn . localize = $ . localize ;
2023-03-12 15:58:15 +00:00
return ( $ . localize . data = { } ) ;
2023-03-04 00:18:55 +00:00
} ) ( jQuery ) ;