From 0781f022dd2a5c61e5accdc9030d1a88c7e941ed Mon Sep 17 00:00:00 2001 From: Santhosh Thottingal Date: Fri, 21 Sep 2012 22:24:06 -0700 Subject: [PATCH] Internationalize ULS * internationalize ULS when jquery.i18n is present. Otherwise use the fallback English interface * Example with and without i18n * Message files for few languages --- .gitignore | 2 + examples/index-i18n.html | 54 ++++++++++++++++++++++++ examples/resources/i18n/en.json | 3 ++ examples/resources/i18n/ml.json | 3 ++ examples/resources/jquery.i18n.min.js | 4 ++ i18n/de.json | 3 ++ i18n/en.json | 20 +++++++++ i18n/es.json | 3 ++ i18n/fi.json | 3 ++ i18n/he.json | 3 ++ i18n/hi.json | 3 ++ i18n/ja.json | 3 ++ i18n/ml.json | 14 ++++++ i18n/nl.json | 3 ++ i18n/qqq.json | 19 +++++++++ i18n/ta.json | 3 ++ src/jquery.uls.core.js | 28 ++++++++---- src/jquery.uls.lcd.js | 61 +++++++++++++++++---------- 18 files changed, 201 insertions(+), 31 deletions(-) create mode 100644 examples/index-i18n.html create mode 100644 examples/resources/i18n/en.json create mode 100644 examples/resources/i18n/ml.json create mode 100644 examples/resources/jquery.i18n.min.js create mode 100644 i18n/de.json create mode 100644 i18n/en.json create mode 100644 i18n/es.json create mode 100644 i18n/fi.json create mode 100644 i18n/he.json create mode 100644 i18n/hi.json create mode 100644 i18n/ja.json create mode 100644 i18n/ml.json create mode 100644 i18n/nl.json create mode 100644 i18n/qqq.json create mode 100644 i18n/ta.json diff --git a/.gitignore b/.gitignore index 6e1f261..2182950 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .*.swp *.kate-swp *.bak +/node_modules +/dist diff --git a/examples/index-i18n.html b/examples/index-i18n.html new file mode 100644 index 0000000..ed02775 --- /dev/null +++ b/examples/index-i18n.html @@ -0,0 +1,54 @@ + + + + + Universal Language Selector + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/examples/resources/i18n/en.json b/examples/resources/i18n/en.json new file mode 100644 index 0000000..88703e4 --- /dev/null +++ b/examples/resources/i18n/en.json @@ -0,0 +1,3 @@ +{ +"uls-example-title": "Universal Language Selector" +} diff --git a/examples/resources/i18n/ml.json b/examples/resources/i18n/ml.json new file mode 100644 index 0000000..94c3d0d --- /dev/null +++ b/examples/resources/i18n/ml.json @@ -0,0 +1,3 @@ +{ +"uls-example-title": "ആഗോള ഭാഷാ സഹായി" +} diff --git a/examples/resources/jquery.i18n.min.js b/examples/resources/jquery.i18n.min.js new file mode 100644 index 0000000..a57228a --- /dev/null +++ b/examples/resources/jquery.i18n.min.js @@ -0,0 +1,4 @@ +/*! jquery.i18n - v0.1.0 - 2012-09-21 +* https://github.com/wikimedia/jquery.i18n +* Copyright (c) 2012 Santhosh Thottingal; Licensed GPL, MIT */ +function pluralRuleParser(a,b){function q(){}function r(a){return function(){for(var b=0;b0&&e!=="number")if(e==="string")this.log("Loading messages from: "+a),this.jsonMessageLoader(a).done(function(a,d){c.load(a,b),delete c.sources[b]});else{var f=a;for(var g in f){if(!d.call(f,g))continue;var h=typeof g;if(h==="string"&&b)c.log("["+b+"]["+g+"] : "+f[g]),c.messages[b]=c.messages[b]||[],c.messages[b][g]=f[g];else{var i=g;this.log("Loading locale: "+i),c.load(f[i],i)}}}},log:function(){var d=b.console!==c;d&&a.i18n.debug&&b.console.log.apply(b.console,arguments)},loadFromQueue:function(a){var b=this,c=b.sources[a];for(var d=0;d1?["CONCAT"].concat(b):b[0]}function B(){var a=d([z,i,y]);return a===null?null:[a[0],a[2]]}function C(){var a=d([z,i,I]);return a===null?null:[a[0],a[2]]}function G(){var a=d([E,D,F]);return a===null?null:a[1]}function J(){var a=e(0,H)();return a===null?null:["CONCAT"].concat(a)}var b=0,h=f("|"),i=f(":"),j=f("\\"),k=g(/^./),l=f("$"),m=g(/^\d+/),n=g(/^[^{}\[\]$\\]/),o=g(/^[^{}\[\]$\\|]/),p=g(/^[^{}\[\]$\s]/),v=c([u,p]),w=c([u,o]),x=c([u,n]),z=q(g(/^[ !"$&'()*,.\/0-9;=?@A-Z\^_`a-z~\x80-\xFF+\-]+/),function(a){return a.toString()}),D=c([function(){var a=d([c([B,C]),e(0,A)]);return a===null?null:a[0].concat(a[1])},function(){var a=d([z,e(0,A)]);return a===null?null:[a[0]].concat(a[1])}]),E=f("{{"),F=f("}}"),H=c([G,y,t]),I=c([G,y,s]),K=J();return K}},a.extend(a.i18n.parser,new b)}(jQuery),function(a){"use strict";var b=function(){this.language=a.i18n.languages[a.i18n().locale]||a.i18n.languages["default"]};b.prototype={constructor:b,emit:function(b,c){var d=null,e=this;switch(typeof b){case"string":case"number":d=b;break;case"object":var f=a.map(b.slice(1),function(a){return e.emit(a,c)}),g=b[0].toLowerCase();if(typeof e[g]=="function")d=e[g](f,c);else throw new Error('unknown operation "'+g+'"');break;case"undefined":d="";break;default:throw new Error("unexpected type in AST: "+typeof b)}return d},concat:function(b){var c="";return a.each(b,function(a,b){c+=b}),c},replace:function(a,b){var c=parseInt(a[0],10);return c"ת")a="־"+a}return a}});a.extend(a.i18n.languages,{he:b})}(jQuery),function(a){"use strict";var b=a.extend({},a.i18n.languages["default"],{convertGrammar:function(a,b){switch(b){case"instrumental":a="z "+a;break;case"lokatiw":a="wo "+a}return a}});a.extend(a.i18n.languages,{hsb:b})}(jQuery),function(a){"use strict";var b=a.extend({},a.i18n.languages["default"],{convertGrammar:function(a,b){switch(b){case"rol":a+="ról";break;case"ba":a+="ba";break;case"k":a+="k"}return a}});a.extend(a.i18n.languages,{hu:b})}(jQuery),function(a){"use strict";var b=a.extend({},a.i18n.languages["default"],{convertGrammar:function(a,b){return b==="genitive"&&(a.substr(-1)==="ա"?a=a.substr(0,a.length-1)+"այի":a.substr(-1)==="ո"?a=a.substr(0,a.length-1)+"ոյի":a.substr(-4)==="գիրք"?a=a.substr(0,a.length-4)+"գրքի":a=a+"ի"),a}});a.extend(a.i18n.languages,{hy:b})}(jQuery),function(a){"use strict";var b=a.extend({},a.i18n.languages["default"],{convertGrammar:function(a,b){switch(b){case"genitive":a=a.replace(/u[ms]$/i,"i"),a=a.replace(/ommunia$/i,"ommunium"),a=a.replace(/a$/i,"ae"),a=a.replace(/libri$/i,"librorum"),a=a.replace(/nuntii$/i,"nuntiorum"),a=a.replace(/tio$/i,"tionis"),a=a.replace(/ns$/i,"ntis"),a=a.replace(/as$/i,"atis"),a=a.replace(/es$/i,"ei");break;case"accusative":a=a.replace(/u[ms]$/i,"um"),a=a.replace(/ommunia$/i,"am"),a=a.replace(/a$/i,"ommunia"),a=a.replace(/libri$/i,"libros"),a=a.replace(/nuntii$/i,"nuntios"),a=a.replace(/tio$/i,"tionem"),a=a.replace(/ns$/i,"ntem"),a=a.replace(/as$/i,"atem"),a=a.replace(/es$/i,"em");break;case"ablative":a=a.replace(/u[ms]$/i,"o"),a=a.replace(/ommunia$/i,"ommunibus"),a=a.replace(/a$/i,"a"),a=a.replace(/libri$/i,"libris"),a=a.replace(/nuntii$/i,"nuntiis"),a=a.replace(/tio$/i,"tione"),a=a.replace(/ns$/i,"nte"),a=a.replace(/as$/i,"ate"),a=a.replace(/es$/i,"e")}return a}});a.extend(a.i18n.languages,{la:b})}(jQuery),function(a){"use strict";var b=a.extend({},a.i18n.languages["default"],{convertGrammar:function(a,b){var c="мæ",d="",e="",f="";a.match(/тæ$/i)?(a=a.substring(0,a.length-1),c="æм"):a.match(/[аæеёиоыэюя]$/i)?d="й":a.match(/у$/i)?a.substring(a.length-2,a.length-1).match(/[аæеёиоыэюя]$/i)||(d="й"):a.match(/[бвгджзйклмнопрстфхцчшщьъ]$/i)||(e="-");switch(b){case"genitive":f=e+d+"ы";break;case"dative":f=e+d+"æн";break;case"allative":f=e+c;break;case"ablative":d==="й"?f=e+d+"æ":f=e+d+"æй";break;case"superessive":f=e+d+"ыл";break;case"equative":f=e+d+"ау";break;case"comitative":f=e+"имæ"}return a+f}});a.extend(a.i18n.languages,{os:b})}(jQuery),function(a){"use strict";var b=a.extend({},a.i18n.languages["default"],{convertGrammar:function(a,b){return b==="genitive"&&a.substr(a.length-4)!=="вики"&&a.substr(a.length-4)!=="Вики"&&(a.substr(a.length-1)==="ь"?a=a.substr(0,a.length-1)+"я":a.substr(a.length-2)==="ия"?a=a.substr(0,a.length-2)+"ии":a.substr(a.length-2)==="ка"?a=a.substr(0,a.length-2)+"ки":a.substr(a.length-2)==="ти"?a=a.substr(0,a.length-2)+"тей":a.substr(a.length-2)==="ды"?a=a.substr(0,a.length-2)+"дов":a.substr(a.length-3)==="ник"&&(a=a.substr(0,a.length-3)+"ника")),a}});a.extend(a.i18n.languages,{ru:b})}(jQuery),function(a){"use strict";var b=a.extend({},a.i18n.languages["default"],{convertGrammar:function(a,b){switch(b){case"mestnik":a="o "+a;break;case"orodnik":a="z "+a}return a}});a.extend(a.i18n.languages,{sl:b})}(jQuery),function(a){"use strict";var b=a.extend({},a.i18n.languages["default"],{convertGrammar:function(a,b){switch(b){case"genitive":a.substr(a.length-4)!=="вікі"&&a.substr(a.length-4)!=="Вікі"&&(a.substr(a.length-1)==="ь"?a=a.substr(0,a.length-1)+"я":a.substr(a.length-2)==="ія"?a=a.substr(0,a.length-2)+"ії":a.substr(a.length-2)==="ка"?a=a.substr(0,a.length-2)+"ки":a.substr(a.length-2)==="ти"?a=a.substr(0,a.length-2)+"тей":a.substr(a.length-2)==="ды"?a=a.substr(0,a.length-2)+"дов":a.substr(a.length-3)==="ник"&&(a=a.substr(0,a.length-3)+"ника"));break;case"accusative":a.substr(a.length-4)!=="вікі"&&a.substr(a.length-4)!=="Вікі"&&a.substr(a.length-2)==="ія"&&(a=a.substr(0,a.length-2)+"ію")}return a}});a.extend(a.i18n.languages,{uk:b})}(jQuery),typeof module!="undefined"&&module.exports&&(module.exports=pluralRuleParser); \ No newline at end of file diff --git a/i18n/de.json b/i18n/de.json new file mode 100644 index 0000000..3941a66 --- /dev/null +++ b/i18n/de.json @@ -0,0 +1,3 @@ +{ +"uls-select-language": "Wählen Sie eine Sprache" +} diff --git a/i18n/en.json b/i18n/en.json new file mode 100644 index 0000000..aa8e466 --- /dev/null +++ b/i18n/en.json @@ -0,0 +1,20 @@ +{ +"@metadata": { + "author": "Santhosh Thottingal ", + "last-updated": "2012 Septmber 21", + "locale": "en", + "message-documentation": "qqq" +}, +"uls-select-language": "Select Language", +"uls-region-WW": "Worldwide", +"uls-region-AM": "America", +"uls-region-AF": "Africa", +"uls-region-EU": "Europe", +"uls-region-AS": "Asia", +"uls-region-ME": "Middle East", +"uls-region-PA": "Pacific", +"uls-no-results-found": "No results found", +"uls-common-languages": "Common languages", +"uls-no-results-suggestion-title": "You may be interested in:", +"uls-search-help": "You can search by language name, script name, ISO code of language or you can browse by region:" +} diff --git a/i18n/es.json b/i18n/es.json new file mode 100644 index 0000000..1fa4fa8 --- /dev/null +++ b/i18n/es.json @@ -0,0 +1,3 @@ +{ +"uls-select-language": "Seleccione el idioma" +} \ No newline at end of file diff --git a/i18n/fi.json b/i18n/fi.json new file mode 100644 index 0000000..0df6375 --- /dev/null +++ b/i18n/fi.json @@ -0,0 +1,3 @@ +{ +"uls-select-language": "Valitse kieli" +} \ No newline at end of file diff --git a/i18n/he.json b/i18n/he.json new file mode 100644 index 0000000..1fffdbd --- /dev/null +++ b/i18n/he.json @@ -0,0 +1,3 @@ +{ +"uls-select-language": "בחר את השפה" +} \ No newline at end of file diff --git a/i18n/hi.json b/i18n/hi.json new file mode 100644 index 0000000..20aa019 --- /dev/null +++ b/i18n/hi.json @@ -0,0 +1,3 @@ +{ +"uls-select-language": "भाषा चुनें" +} diff --git a/i18n/ja.json b/i18n/ja.json new file mode 100644 index 0000000..0abd83b --- /dev/null +++ b/i18n/ja.json @@ -0,0 +1,3 @@ +{ +"uls-select-language": "言語を選択する" +} diff --git a/i18n/ml.json b/i18n/ml.json new file mode 100644 index 0000000..ef41817 --- /dev/null +++ b/i18n/ml.json @@ -0,0 +1,14 @@ +{ +"uls-select-language": "ഭാഷ തിരഞ്ഞെടുക്കുക", +"uls-region-WW": "ആഗോള ഭാഷകൾ", +"uls-region-AM": "അമേരിക്ക", +"uls-region-AF": "ആഫ്രിക്ക", +"uls-region-EU": "യൂറോപ്പ്", +"uls-region-AS": "ഏഷ്യ", +"uls-region-ME": "മദ്ധ്യപൂർവേഷ്യ", +"uls-region-PA": "പസഫിക്", +"uls-no-results-found": "ഒന്നും കണ്ടെത്താനായില്ല", +"uls-common-languages": "സാധാരണ ഭാഷകൾ", +"uls-no-results-suggestion-title": "ഒരു പക്ഷേ ഇതായിരിക്കും നിങ്ങൾ തിരഞ്ഞത്:", +"uls-search-help": "നിങ്ങൾക്ക് ഭാഷയുടെ പേര്, ISO 639 കോഡ്, ലിപിയുടെ പേര് എന്നിവ ഉപയോഗിച്ച് തിരയാം. അല്ലെങ്കിൽ ഈ മേഖലകളിൽ തിരയാം:" +} \ No newline at end of file diff --git a/i18n/nl.json b/i18n/nl.json new file mode 100644 index 0000000..e834702 --- /dev/null +++ b/i18n/nl.json @@ -0,0 +1,3 @@ +{ +"uls-select-language": "Selecteer taal" +} diff --git a/i18n/qqq.json b/i18n/qqq.json new file mode 100644 index 0000000..ca00a73 --- /dev/null +++ b/i18n/qqq.json @@ -0,0 +1,19 @@ +{ +"@metadata": { + "author": "Santhosh Thottingal ", + "last-updated": "2012 Septmber 21", + "locale": "qqq" +}, +"uls-select-language": "Language Selector Title", +"uls-region-WW": "Label for worldwide languages. They are languages spoken in multiple countries. Eg: English, French, Spanish etc. This lable is used in the map region of ULS and as the title of section showing worldwide languages. Translation should not be descriptive.", +"uls-region-AM": "America", +"uls-region-AF": "Africa", +"uls-region-EU": "Europe", +"uls-region-AS": "Asia", +"uls-region-ME": "Middle East", +"uls-region-PA": "Pacific", +"uls-no-results-found": "No results found", +"uls-common-languages": "Common languages", +"uls-no-results-suggestion-title": "You may be interested in:", +"uls-search-help": "You can search by language name, script name, ISO code of language or you can browse by region:" +} diff --git a/i18n/ta.json b/i18n/ta.json new file mode 100644 index 0000000..e2fa8a5 --- /dev/null +++ b/i18n/ta.json @@ -0,0 +1,3 @@ +{ +"uls-select-language": "மொழி தேர்வு" +} \ No newline at end of file diff --git a/src/jquery.uls.core.js b/src/jquery.uls.core.js index 9025f3f..7c5f1f3 100644 --- a/src/jquery.uls.core.js +++ b/src/jquery.uls.core.js @@ -29,26 +29,27 @@ \
\
\ -

Select language

\ +

Select Language

\
\
\
\
\ \ \ @@ -138,6 +139,7 @@ if ( !this.initialized ) { $( 'body' ).prepend( this.$menu ); + this.i18n(); // Initialize with a full search. // This happens on first time click of uls trigger. this.defaultSearch(); @@ -148,7 +150,11 @@ this.$languageFilter.focus(); }, - defaultSearch: function() { + i18n: function() { + this.$element.find( '[data-i18n]' ).i18n(); + }, + + defaultSearch: function () { this.$resultsView.lcd( 'empty' ); this.$regionFilters.first().regionselector( 'show' ); }, @@ -315,6 +321,12 @@ quickList: null // Array of language codes of function that returns such }; + // Define a dummy i18n function, if jquery.i18n not integrated. + if( !$.fn.i18n ) { + $.fn.i18n = function( option ) { + }; + } + $.fn.uls.Constructor = ULS; } ( jQuery ) ); diff --git a/src/jquery.uls.lcd.js b/src/jquery.uls.lcd.js index 6e5e3a5..1f4a9a0 100644 --- a/src/jquery.uls.lcd.js +++ b/src/jquery.uls.lcd.js @@ -25,21 +25,22 @@ var noResultsTemplate = '\
\ -

\ - No results found\ +

\ + No results found\

\
\
\

\ - You can search by language name, script name, ISO code of language or \ - you can browse by region:\ - America,\ - Europe,\ - Middle East, \ - Africa,\ - Asia,\ - Pacific or \ - Worldwide languages.\ + You can search by language name, \ + script name, ISO code of language or \ + you can browse by region:\ + America, \ + Europe, \ + Middle East, \ + Africa, \ + Asia, \ + Pacific, \ + Worldwide.\

\
\
\ @@ -149,7 +150,9 @@ render: function() { var that = this; - var regions = { // FIXME Remove this when i18n is in place. + var $section, $sectionTitle; + var regions = { + // These are fallback text when i18n library not present WW: 'Worldwide', AM: 'America', EU: 'Europe', @@ -158,17 +161,22 @@ AF: 'Africa', PA: 'Pacific' }; - var $section; $.each( $.uls.data.regiongroups, function( regionCode, regionIndex ) { $section = $( '
' ).addClass( 'twelve columns uls-lcd-region-section' ).prop( 'id', regionCode ); - $section.append( $( '

' ) - .addClass( 'eleven columns uls-lcd-region-section offset-by-one' ) - .text( regions[regionCode] ) ); + $sectionTitle = $( '

' ) + .addClass( 'eleven columns uls-lcd-region-section offset-by-one' ) + .text( regions[regionCode] ); + $section.append( $sectionTitle ); that.$element.append( $section ); $section.hide(); that.regionDivs[regionCode] = $section; } ); this.$noResults.hide(); + this.i18n(); + }, + + i18n: function( ) { + this.$element.find( '[data-i18n]' ).i18n(); }, quicklist: function() { @@ -184,10 +192,13 @@ var quickList = this.options.quickList; quickList = quickList.slice( 0, 16 ); quickList.sort( $.uls.data.sortByAutonym ); - var $quickListsection = $( '
' ).addClass( 'twelve columns uls-lcd-region-section' ).prop( 'id', 'uls-lcd-quicklist' ); - $quickListsection.append( $( '

' ).addClass( 'eleven columns uls-lcd-region-section offset-by-one' ).text( 'Common languages' ) ); - this.$element.prepend( $quickListsection ); - this.regionDivs[ 'quick' ] = $quickListsection; + var $quickListSection = $( '
' ).addClass( 'twelve columns uls-lcd-region-section' ).prop( 'id', 'uls-lcd-quicklist' ); + var $quickListSectionTitle = $( '

' ) + .addClass( 'eleven columns uls-lcd-region-section offset-by-one' ) + .text( 'Common languages' ); // This is placeholder text if jquery.i18n not present + $quickListSection.append( $quickListSectionTitle ); + this.$element.prepend( $quickListSection ); + this.regionDivs[ 'quick' ] = $quickListSection; for ( var i = 0; i < quickList.length; i++) { var $column = this.getColumn( 'quick', i % 4 === 0 ); var langCode = quickList[i]; @@ -200,8 +211,9 @@ ); $column.append( $li ); } - $quickListsection.show(); - return $quickListsection; + $quickListSection.show(); + $quickListSectionTitle.i18n(); + return $quickListSection; }, show: function() { @@ -222,7 +234,10 @@ noResults: function() { this.$noResults.show(); var $suggestions = this.quicklist(); - $suggestions.find( 'h3' ).text( 'You may be interested in' ); + $suggestions.find( 'h3' ) + .data( 'i18n', 'uls-no-results-suggestion-title' ) + .text( "You may be interested in:" ) + .i18n(); this.$noResults.find( 'h2' ).after( $suggestions ); },