http://trac.tiddlywiki.org/changeset/12145
MartinBudden 2010-05-18 10:00:02 -0700 (Tue, 18 May 2010) 25 TiddlyWiki jquery gettext --------------- A Trunk/core/jquery/plugins/jquery.gettext-1.0.4.js --------------- Added: Trunk/core/jquery/plugins/jquery.gettext-1.0.4.js =================================================================== --- Trunk/core/jquery/plugins/jquery.gettext-1.0.4.js (rev 0) +++ Trunk/core/jquery/plugins/jquery.gettext-1.0.4.js 2010-05-18 17:00:02 UTC (rev 12145) @@ -0,0 +1,139 @@ +/** + * gettext for jQuery + * + * Copyright (c) 2008 Sabin Iacob (m0n5t3r) <[email protected]> + * 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. + * + * @license http://www.gnu.org/licenses/gpl.html + * @project jquery.gettext + * + * Usage: + * + * This plugin expects its input data to be a JSON object like + * {"": header, "string": "translation", ...} + * + * After getting the server side set up (either as a static file - my choice - or + * as a web service), the client side is simple: + * * add to the head section of the page something like + * <link href="path/to/translation.json" lang="ro" rel="gettext"/> + * * in your script, use $.gt.gettext(string) or _(string); for plural forms, use + * $.gt.ngettext(sg, pl1[, pl2, ...], count) or n_(sg, pl1[, pl2, ...], count) + * * to extract strings to a .po file, you can use standard gettext utilities like + * xgettext and msgfmt; to generate the JSON, one could use the following Python + * snippet, assuming a domain.mo file exists under path/lang/LC_MESSAGES: + * + * import simplejson as enc + * + * def gettext_json(domain, path, lang = [], indent = False): + * try: + * tr = gettext.translation(domain, path, lang) + * return enc.dumps(tr._catalog, ensure_ascii = False, indent = indent) + * except IOError: + * return None + * + * why go through the additional hassle of gettext? well, it's a matter of + * preference, the main advantags I see are: + * * well known editing tools like KBabel, poEdit, gtranslator, Emacs PO mode, + * etc. + * * translation memory, fuzzy matches and other features that get really + * helpful when your application is big and you have hundreds of strings + */ +(function($) { + $.gt = $.gt || {}; + + $.extend($.gt, { + messages: {}, + lang: 'C', + setLang: function(code) { $.gt.lang = typeof code == 'string' && code != ' ' ? code : 'C'; }, + pl_re: /^Plural-Forms:\s*nplurals\s*=\s*(\d+);\s*plural\s*=\s*([^a-zA-Z0-9\$]*([a-zA-Z0-9\$]+).+)$/m, + plural: function(n) {return n != 1;}, + load: function() { + $('link[rel=gettext]').each(function(){ + var lang = this.lang; + $.get(this.href, function(data){ + $.gt.messages[lang] = $.gt.messages[lang] || {}; + try { + var messages = eval('(' + data + ')'); + } catch(e) { + return; + } + + $.extend($.gt.messages[lang], messages); + + var pl = $.gt.pl_re.exec($.gt.messages[lang]['']); + if(pl){ + var expr = pl[2]; + var np = pl[1]; + var v = pl[3]; + try { + var fn = eval('(function(' + v + ') {return ' + expr + ';})'); + } catch(e) { + return; + } + $.gt.plural = fn; + } + }); + }); + $.gt.setLang($('html').attr('lang')); + }, + gettext: function(msgstr) { + var lang = $.gt.lang; + + if(lang == 'C' || typeof $.gt.messages[lang] == 'undefined') { + return msgstr; + } + + var trans = $.gt.messages[lang][msgstr]; + + if(typeof trans == 'string') { // regular action + return trans; + } else if(typeof trans == 'object' && trans.constructor == Array) { // the translation contains plural(s), yet gettext was called + return trans[0]; + } + return msgstr; + }, + ngettext: function() { + var lang = $.gt.lang; + var argv = Array.apply(null, arguments); + var cnt = argv[argv.length - 1]; + var sg = argv[0]; + var pls = argv.slice(0, -1); + + var trans = pls; + + if(lang != 'C' && typeof $.gt.messages[lang] != 'undefined') { + trans = $.gt.messages[lang][sg]; + } + + if(typeof trans == 'string') { // called ngettext, but no plural forms available :-? + return trans; + } else if(typeof trans == 'object' && trans.constructor == Array) { + var pl = $.gt.plural(cnt); + if(typeof pl == 'boolean' && pls.length == 2) { + pl = pl ? 1 : 0; + } + if(typeof pl == 'number' && pl < trans.length) { + return trans[pl]; + } + } + return sg; + } + }); + + $('document').ready($.gt.load); +})(jQuery); + +if(typeof _ == 'undefined') { + var _ = jQuery.gt.gettext; +} +if(typeof n_ == 'undefined') { + var n_ = jQuery.gt.ngettext; +} -- You received this message because you are subscribed to the Google Groups "TiddlyWikiDev" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/tiddlywikidev?hl=en.
