--- /dev/null
+/*\r
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.\r
+For licensing, see LICENSE.html or http://ckeditor.com/license\r
+*/\r
+\r
+(function()\r
+{\r
+ var loadedLangs = {};\r
+\r
+ /**\r
+ * @namespace Holds language related functions.\r
+ */\r
+ CKEDITOR.lang =\r
+ {\r
+ /**\r
+ * The list of languages available in the editor core.\r
+ * @type Object\r
+ * @example\r
+ * alert( CKEDITOR.lang.en ); // "true"\r
+ */\r
+ languages :\r
+ {\r
+ 'af' : 1,\r
+ 'ar' : 1,\r
+ 'bg' : 1,\r
+ 'bn' : 1,\r
+ 'bs' : 1,\r
+ 'ca' : 1,\r
+ 'cs' : 1,\r
+ 'cy' : 1,\r
+ 'da' : 1,\r
+ 'de' : 1,\r
+ 'el' : 1,\r
+ 'en-au' : 1,\r
+ 'en-ca' : 1,\r
+ 'en-gb' : 1,\r
+ 'en' : 1,\r
+ 'eo' : 1,\r
+ 'es' : 1,\r
+ 'et' : 1,\r
+ 'eu' : 1,\r
+ 'fa' : 1,\r
+ 'fi' : 1,\r
+ 'fo' : 1,\r
+ 'fr-ca' : 1,\r
+ 'fr' : 1,\r
+ 'gl' : 1,\r
+ 'gu' : 1,\r
+ 'he' : 1,\r
+ 'hi' : 1,\r
+ 'hr' : 1,\r
+ 'hu' : 1,\r
+ 'is' : 1,\r
+ 'it' : 1,\r
+ 'ja' : 1,\r
+ 'km' : 1,\r
+ 'ko' : 1,\r
+ 'lt' : 1,\r
+ 'lv' : 1,\r
+ 'mn' : 1,\r
+ 'ms' : 1,\r
+ 'nb' : 1,\r
+ 'nl' : 1,\r
+ 'no' : 1,\r
+ 'pl' : 1,\r
+ 'pt-br' : 1,\r
+ 'pt' : 1,\r
+ 'ro' : 1,\r
+ 'ru' : 1,\r
+ 'sk' : 1,\r
+ 'sl' : 1,\r
+ 'sr-latn' : 1,\r
+ 'sr' : 1,\r
+ 'sv' : 1,\r
+ 'th' : 1,\r
+ 'tr' : 1,\r
+ 'uk' : 1,\r
+ 'vi' : 1,\r
+ 'zh-cn' : 1,\r
+ 'zh' : 1\r
+ },\r
+\r
+ /**\r
+ * Loads a specific language file, or auto detect it. A callback is\r
+ * then called when the file gets loaded.\r
+ * @param {String} languageCode The code of the language file to be\r
+ * loaded. If null or empty, autodetection will be performed. The\r
+ * same happens if the language is not supported.\r
+ * @param {String} defaultLanguage The language to be used if\r
+ * languageCode is not supported or if the autodetection fails.\r
+ * @param {Function} callback A function to be called once the\r
+ * language file is loaded. Two parameters are passed to this\r
+ * function: the language code and the loaded language entries.\r
+ * @example\r
+ */\r
+ load : function( languageCode, defaultLanguage, callback )\r
+ {\r
+ // If no languageCode - fallback to browser or default.\r
+ // If languageCode - fallback to no-localized version or default.\r
+ if ( !languageCode || !CKEDITOR.lang.languages[ languageCode ] )\r
+ languageCode = this.detect( defaultLanguage, languageCode );\r
+\r
+ if ( !this[ languageCode ] )\r
+ {\r
+ CKEDITOR.scriptLoader.load( CKEDITOR.getUrl(\r
+ '_source/' + // @Packager.RemoveLine\r
+ 'lang/' + languageCode + '.js' ),\r
+ function()\r
+ {\r
+ callback( languageCode, this[ languageCode ] );\r
+ }\r
+ , this );\r
+ }\r
+ else\r
+ callback( languageCode, this[ languageCode ] );\r
+ },\r
+\r
+ /**\r
+ * Returns the language that best fit the user language. For example,\r
+ * suppose that the user language is "pt-br". If this language is\r
+ * supported by the editor, it is returned. Otherwise, if only "pt" is\r
+ * supported, it is returned instead. If none of the previous are\r
+ * supported, a default language is then returned.\r
+ * @param {String} defaultLanguage The default language to be returned\r
+ * if the user language is not supported.\r
+ * @param {String} [probeLanguage] A language code to try to use,\r
+ * instead of the browser based autodetection.\r
+ * @returns {String} The detected language code.\r
+ * @example\r
+ * alert( CKEDITOR.lang.detect( 'en' ) ); // e.g., in a German browser: "de"\r
+ */\r
+ detect : function( defaultLanguage, probeLanguage )\r
+ {\r
+ var languages = this.languages;\r
+ probeLanguage = probeLanguage || navigator.userLanguage || navigator.language;\r
+\r
+ var parts = probeLanguage\r
+ .toLowerCase()\r
+ .match( /([a-z]+)(?:-([a-z]+))?/ ),\r
+ lang = parts[1],\r
+ locale = parts[2];\r
+\r
+ if ( languages[ lang + '-' + locale ] )\r
+ lang = lang + '-' + locale;\r
+ else if ( !languages[ lang ] )\r
+ lang = null;\r
+\r
+ CKEDITOR.lang.detect = lang ?\r
+ function() { return lang; } :\r
+ function( defaultLanguage ) { return defaultLanguage; };\r
+\r
+ return lang || defaultLanguage;\r
+ }\r
+ };\r
+\r
+})();\r