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.

Reply via email to