      1 // The Antville Project
      2 // http://code.google.com/p/antville
      3 //
      4 // Copyright 2007-2011 by Tobi Schäfer.
      5 //
      6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
      7 // Matthias & Michael Platzer, Christoph Lincke.
      8 //
      9 // Licensed under the Apache License, Version 2.0 (the ``License'');
     10 // you may not use this file except in compliance with the License.
     11 // You may obtain a copy of the License at
     12 //
     13 //    http://www.apache.org/licenses/LICENSE-2.0
     14 //
     15 // Unless required by applicable law or agreed to in writing, software
     16 // distributed under the License is distributed on an ``AS IS'' BASIS,
     17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18 // See the License for the specific language governing permissions and
     19 // limitations under the License.
     20 //
     21 // $Revision$
     22 // $LastChangedBy$
     23 // $LastChangedDate$
     24 // $URL$
     25
     26 /**
     27  * @fileOverview Contains redefined or additional methods for
     28  * internationalization and localization.
     29  */
     30
     31 /**
     32  * This method is called from the build script to extract gettext call strings
     33  * from scripts and skins.
     34  * @param {String} script
     35  * @param {String} scanDirs
     36  * @param {String} potFile
     37  */
     38 Root.prototype.extractMessages = function(script, scanDirs, potFile) {
     39    var temp = {print: global.print, readFile: global.readFile};
     40    global.print = function(str) {app.log(str);}
     41    global.readFile = function(fpath, encoding) {
     42       res.push();
     43       var file = new helma.File(fpath);
     44       file.open({charset: encoding || "UTF-8"});
     45       var str;
     46       while ((str = file.readln()) !== null) {
     47          res.writeln(str);
     48       }
     49       file.close();
     50       return res.pop();
     51    }
     52    var args = ["-o", potFile, "-e", "utf-8"];
     53    for each (var dir in scanDirs.split(" ")) {
     54       args.push(app.dir + "/../" + dir);
     55    }
     56    var file = new helma.File(script);
     57    var MessageParser = new Function(file.readAll());
     58    MessageParser.apply(global, args);
     59    global.print = temp.print;
     60    global.readFile = temp.readFile;
     61    return;
     62 }
     63
     64 /**
     65  * This method is useful for disambiguation of messages (single words most of
     66  * the time) that have different meanings depending on the context.
     67  * Example: comment (the verb "to comment" vs the noun "a comment")
     68  * @param {Object} key The message ID
     69  * @param {Object} context The context of the message
     70  * @returns String
     71  */
     72 function cgettext(key, context) {
     73    var msgId = cgettext.getKey(key, context);
     74    var text = jala.i18n.translate(msgId);
     75    return text === msgId ? key : text;
     76 }
     77
     78 /**
     79  * Helper method to define the message ID depending on the context.
     80  * @param {Object} key
     81  * @param {Object} context
     82  * @returns String
     83  */
     84 cgettext.getKey = function(key, context) {
     85    return context ? key + " // " + context : key;
     86 }
     87
     88 /**
     89  *
     90  * @param {Object} param
     91  * @param {String} text
     92  * @returns String
     93  * @see jala.i18n.gettext
     94  */
     95 function gettext_macro(param, text /*, value1, value2, ...*/) {
     96    if (!text) {
     97       return;
     98    }
     99    var re = gettext_macro.REGEX;
    100    var args = [text.replace(re, String.SPACE)];
    101    for (var i=2; i<arguments.length; i+=1) {
    102       args.push(arguments[i]);
    103    }
    104    if (param.context) {
    105       return cgettext.call(this, args[0], param.context);
    106    }
    107    return gettext.apply(this, args);
    108 }
    109
    110 /**
    111  * The regular expression used to reduce multiple whitespace characters.
    112  * @constant
    113  */
    114 gettext_macro.REGEX = /\s+/g;
    115
    116 /**
    117  *
    118  * @param {Object} param
    119  * @param {String} singular
    120  * @param {String} plural
    121  * @returns String
    122  * @see jala.i18n#ngettext
    123  */
    124 function ngettext_macro(param, singular, plural /*, value1, value2, ...*/) {
    125    if (!singular || !plural) {
    126       return;
    127    }
    128    var re = gettext_macro.REGEX;
    129    var args = [singular.replace(re, String.SPACE), plural.replace(re, String.SPACE)];
    130    for (var i=3; i<arguments.length; i+=1) {
    131       args.push(arguments[i]);
    132    }
    133    return ngettext.apply(this, args);
    134 }
    135
    136 /**
    137  *
    138  * @param {Object} param
    139  * @param {Object} singular
    140  * @param {Object} plural
    141  * @see jala.i18n#markgettext
    142  */
    143 function markgettext_macro(param, singular, plural) {
    144    return markgettext.call(this, singular, plural);
    145 }
    146