Includes : I18n

By w35l3y Last update Jan 31, 2012 — Installed 134,610 times.

There are 9 previous versions of this script.

// ==UserScript==
// @name           Includes : I18n
// @namespace      http://gm.wesley.eti.br/includes
// @description    I18n Function
// @author         w35l3y
// @email          w35l3y@brasnet.org
// @copyright      2011+, w35l3y (http://gm.wesley.eti.br)
// @license        GNU GPL
// @homepage       http://gm.wesley.eti.br
// @version        3.0.0.3
// @language       en
// @include        nowhere
// @exclude        *
// @resource       i18n http://pastebin.com/download.php?i=ULrVTsSg
// @resource       meta http://userscripts.org/scripts/source/87940.meta.js
// @require        http://userscripts.org/scripts/source/56489.user.js
// @require        http://userscripts.org/scripts/source/85618.user.js
// ==/UserScript==

/**************************************************************************

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

**************************************************************************/
I18n = function () {};
I18n.get = function (item_str, item, obj, callback) {
	var section = GM_getValue("locale", navigator.language).toLowerCase().replace(/[_-]+/g, "-").split(",").map(function ($0) {
		return (~$0.indexOf("-") ? $0.substring(0, $0.indexOf("-")) : $0);
	}),
	i18n = JSON.parse(GM_getValue("i18n") || '{"version" : -1, "languages" : {}}'),
	res = {
		"version" : 0
	};
	
	if (!("languages" in i18n)) {
		GM_deleteValue("i18n");
		i18n = {
			"version" : -1,
			"languages" : {}
		};
	}

	if (typeof item == "function") {
		callback = item;
		item = null;
		obj = null;
	} else if (typeof obj == "function") {
		callback = obj;
		obj = null;
	}

	if (item instanceof Array) {
		obj = item;
		item = null;
	}

	var cb2 = function (str) {
		return (obj ? str.replace(/\{(\d+)\}/g, function ($0, $1) {
			return ($1 in obj ? obj[$1] : $0);
		}) : str);
	},
	cb = function (str) {
		if (callback) {
			callback(str, obj);
		}

		return cb2(str);
	};

	if (!item) {
		item = item_str.toLowerCase().replace(/[^\w.-]+/g, "");
	}

	// For compatibility with v2.0.1.0
	try {
		res = JSON.parse(GM_getResourceText("i18n").replace(/^\(|\)$/g, "") || "{}");
		
		if (!("languages" in res)) {
			res.version = 0;
			res.languages = res;
		}
	} catch (e) { }

	if (i18n.version < res.version) {
		i18n.version = res.version;
		i18n.languages = {};
		GM_setValue("i18n", JSON.stringify(i18n));
	}

	for each (var lang in section)
	if (lang in res.languages && item in res.languages[lang])
	return cb(res.languages[lang][item]);
	else if (lang in i18n.languages && item in i18n.languages[lang])
	return cb(i18n.languages[lang][item]);
	
	function translate (text, from, to, item) {
		Translate.execute(text.replace(/\n/g, "<br />"), from, to, function (result) {
			if (result.translation) {
				var data = JSON.parse(GM_getValue("i18n") || '{"version":0,"languages":{}}');

				if (!(to in data.languages))
				data.languages[to] = {};

				data.languages[to][item] = result.translation.replace(/\s*<br\s*\/?>\s*/g, "\n");
				
				GM_setValue("i18n", JSON.stringify(data));
				
				return cb(data.languages[to][item]);
			}
		});
	}

	if (section.length) {
		var def = res["default"] || "en",
		meta = "// @language " + def;
		
		try {
			meta = GM_getResourceText("meta");
		} catch (e) { }
		
		var metaLang = /^\/\/ @language\s+(\w+)/m.test(meta) && RegExp.$1;

		for (var key in section) {
			if (item in res.languages[def] && res.languages[def][item] != null) {
				translate(res.languages[def][item], def, section[key], item);

				return cb2(res.languages[def][item]);
			}

			for (var lang in res.languages)
			if (lang != def && item in res.languages[lang] && res.languages[lang][item] != null) {
				translate(res.languages[lang][item], lang, section[key], item);

				return cb2(res.languages[lang][item]);
			}

			if (metaLang != section[key]) {
				translate(item_str, metaLang, section[key], item);

				return cb2(item_str);
			}
		}
	}

	return cb(item_str);
};

function __ () {
	return I18n.get.apply(I18n, Array.prototype.slice.apply(arguments));
}