function commonNameToLowerFirst(phr) { var str = Ts.subs(0); var pval = Ts.getProp(str, "yleisnimi"); if (pval == "kyllä") { return Ts.toLowerFirst(phr); } else { return phr; } } Ts.setcall("yleisnimi_pienellä", commonNameToLowerFirst); // Converts the first character in the string to lower case function toLowerFirst(str) { return Ts.toLowerFirst(str); } Ts.setcall("pieni_alkukirjain", toLowerFirst); function conditionalHyphen(str1, str2) { var spaceBeforeHyphen = false; if (str1.indexOf(' ') != -1) { spaceBeforeHyphen = true; // Simple logic for detecting if str1 consists of only an HTML 'a' tag // In that case only check for user visible whitespaces inside the tag. // This is to prevent "foo -bar" behaviour when "foo-bar" is wanted. // This obviously catches only the most basic cases. // Also it is assumed that this kind of link string is never used as // the first parameter to this function if it is meant to be displayed // as plain text (i.e. not as a link). if (str1.length > 4 && str1[0] == '<' && str1[1] == 'a' && str1[2] == ' ') { var tagEnd = str1.indexOf('>', 3); if (tagEnd != -1) { var textStart = tagEnd + 1; var endTagStart = str1.indexOf('<', textStart); if (endTagStart != -1 && str1.length == endTagStart+4 && str1[endTagStart+1] == '/' && str1[endTagStart+2] == 'a' && str1[endTagStart+3] == '>') { str1Text = str1.substring(textStart, endTagStart-1); if (str1Text.indexOf(' ') != -1) { spaceBeforeHyphen = true; } else { spaceBeforeHyphen = false; } } } } } if (spaceBeforeHyphen) { return str1 + " -" + str2; } else { return str1 + "-" + str2; } } Ts.setcall("yhdysmerkki", conditionalHyphen); // Set properties of the phrase given by the finalized msgstr in the PO file. // The arguments to the call are consecutive pairs of keys and values, // as many as needed (i.e. total number of arguments must be even). // // The property keys are registered as PO calls taking single argument, // which can be used to retrive the property values for this msgstr // when it is later used as placeholder replacement in another message. // // Always signals fallback. // function setMsgstrProps (/*KEY1, VALUE1, ...*/) { if (arguments.length % 2 != 0) throw Error("Property setter given odd number of arguments."); // Collect finalized msgstr. phrase = Ts.msgstrf() // Go through all key-value pairs. for (var i = 0; i < arguments.length; i += 2) { var pkey = arguments[i]; var pval = arguments[i + 1]; // Set the value of the property for this phrase. Ts.setProp(phrase, pkey, pval); // Set the PO call for getting this property, if not already set. if (!Ts.hascall(pkey)) { Ts.setcall(pkey, function (phr) { return Ts.getProp(phr, this.pkey) }, {"pkey" : pkey}); } } throw Ts.fallback(); } Ts.setcall("aseta", setMsgstrProps); // NOTE: You can replace "aseta" in the line above with any UTF-8 string, // e.g. one in your language so that it blends nicely inside POs. // The following things are copied from the croation kdelibs4.js and used for // noun cases // ------------------------------ // Create a scripting call linked to property key in pmaps. // If the call name starts with lowercase letter, // another call with the first letter in uppercase will be defined, // which will upcase the first letter in the property value before // returning it. function create_pgetter (cname, pkey) { if (!Ts.hascall(cname)) { Ts.setcall(cname, function (phr) { if (this.pkey.constructor == Array) { for (var i = 0; i < this.pkey.length; ++i) { var pval = Ts.getProp(phr, this.pkey[i]); if (pval != undefined) { return pval; } } return undefined; } else { return Ts.getProp(phr, this.pkey); } }, {"pkey" : pkey}); cname_uc = Ts.toUpperFirst(cname); if (cname_uc != cname) { Ts.setcall(cname_uc, function (phr) { return Ts.toUpperFirst(Ts.acall(this.cname_lc, phr)); }, {"cname_lc" : cname}); } } } // ------------------------------ // Predefined property getters. // Call names with corresponding pmap keys for predefined getters. // The first letter in the call name should be in lowercase; // see the comment to create_pgetter() function for the reason. var call_name_to_prop = { "nom" : "nom", // nominative case // is this really needed? "gen" : "gen", // genitive case "part" : "part", // partitive case "elat" : "elat", // elative case "adess" : "adess", // adessive case "iness": "iness", // inessive case "illat" : "illat", // illative case "hakumuoto" : "hakumuoto", "teonnimi" : "teonnimi", // "lok" : ["lok", "dat"], // locative case (forwarded to dative if missing) // commented and left here for the purpose of example }; for (cname in call_name_to_prop) { create_pgetter(cname, call_name_to_prop[cname]); } // ------------------------------ // Property maps to be available to all apps. Ts.loadProps("general");