Msjoinder
11 years ago
18 changed files with 330 additions and 108 deletions
@ -0,0 +1,226 @@
@@ -0,0 +1,226 @@
|
||||
// interface_localization.js
|
||||
//
|
||||
// uses JavaScript to detect browser language
|
||||
// uses Polyglot.js ( https://github.com/airbnb/polyglot.js ) to translate interface
|
||||
|
||||
// translators: add your language code here such as "es" for Spanish, "ru" for Russian
|
||||
var knownLanguages = ["en"]; |
||||
|
||||
// detect language with JavaScript
|
||||
var preferredLanguage = window.navigator.userLanguage || window.navigator.language || "en"; |
||||
if(knownLanguages.indexOf(preferredLanguage) > -1){ |
||||
// en for en or similar
|
||||
preferredLanguage = preferredLanguage; |
||||
} |
||||
else if(knownLanguages.indexOf(preferredLanguage.split("-")[0]) > -1){ |
||||
// en for en-US or similar
|
||||
preferredLanguage = preferredLanguage.split("-")[0]; |
||||
} |
||||
else{ |
||||
// did not find match
|
||||
preferredLanguage = "en"; |
||||
} |
||||
|
||||
// set up Polyglot
|
||||
polyglot = new Polyglot(); |
||||
var wordset = {}; |
||||
|
||||
if(preferredLanguage == "en"){ |
||||
polyglot.locale("en"); |
||||
wordset = { |
||||
"Actions ▼": "Actions ▼", |
||||
"Active DHT nodes:": "Active DHT nodes: ", |
||||
"Add DNS": "Add DNS", |
||||
"Add peer": "Add peer", |
||||
"ajax_error": "Ajax error: %{error}", // JavaScript error
|
||||
"All users publicly followed by": "All users publicly followed by", |
||||
"Available": "Available", // username is available
|
||||
"Block chain information": "Block chain information", |
||||
"Block chain is up-to-date, twister is ready to use!": "Block chain is up-to-date, twister is ready to use!", |
||||
"Block generation": "Block generation ", |
||||
"Cancel": "Cancel", |
||||
"Change user": "Change user", |
||||
"Checking...": "Checking...", // checking if username is available
|
||||
"Collapse": "Collapse", // smaller view of a post
|
||||
"Configure block generation": "Configure block generation", |
||||
"Connections:": "Connections: ", // to network
|
||||
"Connection lost.": "Connection lost.", |
||||
"days": "%{days} day |||| %{days} days", |
||||
"Detailed information": "Detailed information", |
||||
"DHT network down.": "DHT network down.", |
||||
"Direct Messages": "Direct Messages", |
||||
"Disable": "Disable", |
||||
"Display mentions to @": "Display mentions to @", |
||||
"Display retransmissions": "Display retransmissions", |
||||
"DNS to obtain list of peers:": "DNS to obtain list of peers:", |
||||
"downloading_block_chain": "Downloading block chain, please wait before continuing (block chain is %{days} days old).", |
||||
"download_posts_status": "Downloaded %{portion} posts", // Downloaded 10/30 posts
|
||||
"Enable": "Enable", |
||||
"error": "Error: %{error}", |
||||
"error_connecting_to_daemon": "Error connecting to local twister daemon.", |
||||
"Error in 'createwalletuser' RPC.": "Error in 'createwalletuser' RPC.", |
||||
"Error in 'importprivkey'": "Error in 'importprivkey' RPC: %{rpc}", |
||||
"Error in 'sendnewusertransaction' RPC.": "Error in 'sendnewusertransaction' RPC.", |
||||
"Expand": "Expand", // larger view of a post
|
||||
"Favorite": "Favorite", |
||||
"File APIs not supported in this browser.": "File APIs not supported in this browser.", |
||||
"Follow": "Follow", |
||||
"Followed by": "Followed by", |
||||
"followed_by": "Followed by %{username}", |
||||
"Followers": "Followers", |
||||
"Following": "Following", |
||||
"Following users": "Following users", |
||||
"Force connection to peer:": "Force connection to peer:", |
||||
"General information": "General information", |
||||
"Generate blocks (send promoted messages)": "Generate blocks (send promoted messages)", |
||||
"Home": "Home", // homepage
|
||||
"hours": "%{hours} hour |||| %{hours} hours", |
||||
"Internal error: lastPostId unknown (following yourself may fix!)": "Internal error: lastPostId unknown (following yourself may fix!)", |
||||
"Known peers:": "Known peers: ", |
||||
"Last block is ahead of your computer time, check your clock.": "Last block is ahead of your computer time, check your clock.", |
||||
"mentions_at": "Mentions @%{user}", |
||||
"minutes": "%{minutes} minute |||| %{minutes} minutes", |
||||
"Must be 16 characters or less.": "Must be 16 characters or less.", // username
|
||||
"Network": "Network", |
||||
"Network config": "Network config", |
||||
"Network status": "Network status", |
||||
"New direct message...": "New direct message...", |
||||
"New Post...": "New Post...", |
||||
"new_posts": "%{count} new post |||| %{count} new posts", |
||||
"nobody": "nobody", // used to promote a post without attaching the user
|
||||
"Not available": "Not available", // username is not available
|
||||
"Number of blocks in block chain:": "Number of blocks in block chain: ", |
||||
"Number of CPUs to use": "Number of CPUs to use ", |
||||
"Only alphanumeric and underscore allowed.": "Only alphanumeric and underscore allowed.", |
||||
"peer address": "peer address", |
||||
"Private": "Private", |
||||
"Profile": "Profile", |
||||
"Postboard": "Postboard", |
||||
"post": "post", // verb - button to post a message
|
||||
"Post to promote:": "Post to promote: ", |
||||
"Posts": "Posts", |
||||
"propagating_nickname": "Propagating nickname %{username} to the network...", |
||||
"Public": "Public", |
||||
"Refresh": "Refresh", |
||||
"retransmit_this": "Retransmit this post to your followers?", |
||||
"Reply": "Reply", |
||||
"Reply...": "Reply...", |
||||
"reply_to": "Reply to %{fullname}", |
||||
"Retransmit": "Retransmit", |
||||
"Retransmits": "Retransmits", |
||||
"Retransmitted by": "Retransmitted by", |
||||
"search": "search", |
||||
"seconds": "%{seconds} second |||| %{seconds} seconds", |
||||
"send": "send", |
||||
"Send post with username": "Send post with username ", |
||||
"Sent Direct Message": "Sent Direct Message", |
||||
"Sent Post to @": "Sent Post to @", |
||||
"Setup account": "Setup account", |
||||
"switch_to_network": "Local daemon is not connected to the network or\n" + |
||||
"block chain is outdated. If you stay in this page\n" + |
||||
"your actions may not work.\n" + |
||||
"Do you want to check Network Status page instead?", |
||||
"The File APIs are not fully supported in this browser.": "The File APIs are not fully supported in this browser.", |
||||
"time_ago": "%{time} ago", // 5 minutes ago
|
||||
"Time of the last block:": "Time of the last block: ", |
||||
"Type message here": "Type message here", |
||||
"Unfollow": "Unfollow", |
||||
"Update": "Update", |
||||
"Updating status...": "Updating status...", // status of block chain
|
||||
"user_not_yet_accepted": "Other peers have not yet accepted this new user.\n" + |
||||
"Unfortunately it is not possible to save profile\n" + |
||||
"or send any posts in this state.\n\n" + |
||||
"Please wait a few minutes to continue.\n\n" + |
||||
"The 'Save Changes' will be automatically enabled\n" + |
||||
"when the process completes. (I promise this is\n"+ |
||||
"the last time you will have to wait before using\n" + |
||||
"twister).\n\n" + |
||||
"Tip: choose your avatar in the meantime!", |
||||
"users_mentions": "Mentions of @%{username}", |
||||
"users_profile": "%{username}'s Profile", |
||||
"username_undefined": "Username undefined, login required.", |
||||
"View": "View", |
||||
"View All": "View All", |
||||
"Who to Follow": "Who to Follow", |
||||
"Your message was sent!": "Your message was sent!" |
||||
}; |
||||
} |
||||
|
||||
// translators: sample adding a language
|
||||
if(preferredLanguage == "ru"){ |
||||
// polyglot.locale() is used to support plurals
|
||||
// locales currently known by Polyglot.js:
|
||||
/* |
||||
chinese: ['id', 'ja', 'ko', 'ms', 'th', 'tr', 'zh'], |
||||
german: ['da', 'de', 'en', 'es', 'fi', 'el', 'he', 'hu', 'it', 'nl', 'no', 'pt', 'sv'], |
||||
french: ['fr', 'tl'], |
||||
russian: ['hr', 'ru'], |
||||
czech: ['cs'], |
||||
polish: ['pl'], |
||||
icelandic: ['is'] |
||||
*/ |
||||
|
||||
polyglot.locale("ru"); |
||||
|
||||
// list of the English words and translations
|
||||
wordset = { |
||||
"Actions ▼": "Действия ▼" // , comma after each match except the last
|
||||
}; |
||||
} |
||||
|
||||
// uncomment to see all translated words replaced with filler
|
||||
//for(var word in wordset){
|
||||
// wordset[word] = "AAAA";
|
||||
//}
|
||||
|
||||
polyglot.extend(wordset); |
||||
|
||||
// Text from HTML and not JavaScript is selected and translated at $(document).ready
|
||||
// Add selectors here to translate the text and placeholders inside new UI
|
||||
var fixedLabels = [ |
||||
// An easy way to include new items in translation is to add the "label" class
|
||||
".label", |
||||
|
||||
// navbar and home
|
||||
"button", |
||||
".userMenu > ul > li > a", |
||||
".postboard-news", |
||||
".post-area-new textarea", |
||||
".refresh-users, .view-all-users", |
||||
".who-to-follow h3", |
||||
".userMenu-search-field", |
||||
"a.dropdown-menu-item, a.direct-messages", |
||||
".post-interactions span", |
||||
".post-expand", |
||||
".post-context span", |
||||
".post-stats .stat-count span", |
||||
".postboard h2", |
||||
|
||||
// following page
|
||||
".following h2", |
||||
".mini-profile-actions span, .mini-profile-actions li", |
||||
|
||||
// network page
|
||||
".network h2, .network h3", |
||||
".network ul li span", |
||||
".network label", |
||||
".network textarea, .network input, .network option", |
||||
]; |
||||
$(document).ready(function(){ |
||||
for(var i=0;i<fixedLabels.length;i++){ |
||||
var elems = $(fixedLabels[i]); |
||||
for(var e=0;e<elems.length;e++){ |
||||
var content = $.trim($(elems[e]).text()); |
||||
if(wordset[content]){ |
||||
$(elems[e]).text( polyglot.t(content) ); |
||||
} |
||||
else{ |
||||
// uncomment to see translations not found
|
||||
//console.log(content);
|
||||
} |
||||
if(typeof $(elems[e]).attr("placeholder") != "undefined" && wordset[ $(elems[e]).attr("placeholder")]){ |
||||
$(elems[e]).attr("placeholder", polyglot.t( $(elems[e]).attr("placeholder") ) ); |
||||
} |
||||
} |
||||
} |
||||
}); |
@ -0,0 +1,17 @@
@@ -0,0 +1,17 @@
|
||||
// (c) 2012 Airbnb, Inc.
|
||||
//
|
||||
// polyglot.js may be freely distributed under the terms of the BSD
|
||||
// license. For all licensing information, details, and documention:
|
||||
// http://airbnb.github.com/polyglot.js
|
||||
//
|
||||
//
|
||||
// Polyglot.js is an I18n helper library written in JavaScript, made to
|
||||
// work both in the browser and in Node. It provides a simple solution for
|
||||
// interpolation and pluralization, based off of Airbnb's
|
||||
// experience adding I18n functionality to its Backbone.js and Node apps.
|
||||
//
|
||||
// Polylglot is agnostic to your translation backend. It doesn't perform any
|
||||
// translation; it simply gives you a way to manage translated phrases from
|
||||
// your client- or server-side JavaScript application.
|
||||
//
|
||||
!function(e){"use strict";function t(e){e=e||{},this.phrases=e.phrases||{},this.currentLocale=e.locale||"en",this.allowMissing=!!e.allowMissing}function s(e){var t,n,r,i={};for(t in e)if(e.hasOwnProperty(t)){n=e[t];for(r in n)i[n[r]]=t}return i}function o(e){var t=/^\s+|\s+$/g;return e.replace(t,"")}function u(e,t,r){var i,s,u;return r!=null&&e?(s=e.split(n),u=s[f(t,r)]||s[0],i=o(u)):i=e,i}function a(e){var t=s(i);return t[e]||t.en}function f(e,t){return r[a(e)](t)}function l(e,t){for(var n in t)n!=="_"&&t.hasOwnProperty(n)&&(e=e.replace(new RegExp("%\\{"+n+"\\}","g"),t[n]));return e}function c(t){e.console&&e.console.warn&&e.console.warn("WARNING: "+t)}function h(e){var t={};for(var n in e)t[n]=e[n];return t}t.VERSION="0.2.0",t.prototype.locale=function(e){return e&&(this.currentLocale=e),this.currentLocale},t.prototype.extend=function(e){for(var t in e)e.hasOwnProperty(t)&&(this.phrases[t]=e[t])},t.prototype.clear=function(){this.phrases={}},t.prototype.replace=function(e){this.clear(),this.extend(e)},t.prototype.t=function(e,t){var n;t=t==null?{}:t,typeof t=="number"&&(t={smart_count:t});var r=this.phrases[e]||t._||(this.allowMissing?e:"");return r===""?(c('Missing translation for key: "'+e+'"'),n=e):(t=h(t),n=u(r,this.currentLocale,t.smart_count),n=l(n,t)),n};var n="||||",r={chinese:function(e){return 0},german:function(e){return e!==1?1:0},french:function(e){return e>1?1:0},russian:function(e){return e%10===1&&e%100!==11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2},czech:function(e){return e===1?0:e>=2&&e<=4?1:2},polish:function(e){return e===1?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2},icelandic:function(e){return e%10!==1||e%100===11?1:0}},i={chinese:["id","ja","ko","ms","th","tr","zh"],german:["da","de","en","es","fi","el","he","hu","it","nl","no","pt","sv"],french:["fr","tl"],russian:["hr","ru"],czech:["cs"],polish:["pl"],icelandic:["is"]};typeof module!="undefined"&&module.exports?module.exports=t:e.Polyglot=t}(this); |
Loading…
Reference in new issue