diff --git a/js/interface_common.js b/js/interface_common.js
index 897df8c..604cc6e 100644
--- a/js/interface_common.js
+++ b/js/interface_common.js
@@ -292,7 +292,7 @@ function refreshWhoToFollow(e) {
e.stopPropagation();
e.preventDefault();
- $('.follow-suggestions').html('');
+ $('.module.who-to-follow .follow-suggestions').empty();
getRandomFollowSuggestion(processSuggestion);
getRandomFollowSuggestion(processSuggestion);
@@ -729,10 +729,11 @@ var composeNewPost = function( e, postAreaNew )
}
var textArea = postAreaNew.find("textarea");
- textArea.focus();
if( textArea.attr("data-reply-to") && !textArea.val().length ) {
textArea.val(textArea.attr("data-reply-to"));
}
+ if (!postAreaNew.find("textarea:focus").length)
+ postAreaNew.find("textarea:last").focus();
}
//Reduz Área do Novo post
@@ -751,63 +752,76 @@ function checkPostForMentions(post, mentions, max) {
var splitedPostsCount = 1;
var usePostSpliting = false;
-function replyTextKeypress(e) {
+function replyTextInput(e) {
e = e || event;
var $this = $( this );
var tweetForm = $this.parents("form");
if( tweetForm != undefined ) {
if ($.Options.getUnicodeConversionOpt() !== "disable")
$this.val(convert2Unicodes($this.val(), $this));
- var c = 140 - $this.val().length;
+
if (usePostSpliting && !$this.parents('.directMessages').length) {
var $tas = tweetForm.find("textarea");
splitedPostsCount = $tas.length;
- if ($this.hasClass('splited-post'))
- $this.css('height', '28px');
-
+ var icurrentta = $tas.index(this); // current textarea $tas index
+ if (splitedPostsCount > 1)
+ var pml = getPostSplitingPML();
+ else
+ var pml = 140;
+ var cci = getPostSpittingCI(icurrentta);
+ var caretPos = $this.caret();
var reply_to = $this.attr('data-reply-to');
- for (var i = 0; i < $tas.length; i++) {
- var pml = 140 - (i+1).toString().length - splitedPostsCount.toString().length - 4;
- //if mention exists, we shouldn't add it while posting.
- if (typeof(reply_to) !== 'undefined' &&
- !checkPostForMentions($tas[i].value, reply_to, pml - reply_to.length)) {
- pml -= reply_to.length;
- }
+ for (var i = 0; i < $tas.length; i++) {
if ($tas[i].value.length > pml) {
- var endings = $tas[i].value.match(/ |,|;|\.|:|\/|\?|\!|\\|'|"|\n|\t/g);
- var ci = $tas[i].value.lastIndexOf(endings[endings.length - 1]);
- for (var j = endings.length - 2; j >= 0 && ci > pml; j--) {
- ci = $tas[i].value.lastIndexOf(endings[j], ci - 1);
- }
- ci = (ci > pml ? pml : ci);
+ if (pml === 140)
+ pml = getPostSplitingPML();
+ var ci = getPostSpittingCI(i);
if (i < splitedPostsCount - 1) {
$tas[i + 1].value = $tas[i].value.substr(ci) + $tas[i + 1].value;
$tas[i].value = $tas[i].value.substr(0, ci);
+ if (caretPos > cci) {
+ caretPos -= ci;
+ icurrentta += 1;
+ cci = getPostSpittingCI(icurrentta);
+ var $targetta = $($tas[icurrentta]);
+ } else if (i === icurrentta)
+ $($tas[i]).caret(caretPos);
} else {
var $oldta = $($tas[i]);
+ if (typeof($.fn.textcomplete) === 'function') {
+ $oldta.textcomplete('destroy');
+ e.stopImmediatePropagation(); // something goes wrong in $.fn.textcomplete if we don't stop this immediately
+ }
var $newta = $($oldta).clone(true);
var cp = $oldta.val();
- $oldta.val(cp.substr(0, ci));
- $oldta.on("click", function(e) {
- e.stopPropagation();
- this.style.height = '80px';
- });
- $oldta.unbind("keyup");
- $oldta.on("blur", replyTextKeypress);
- $oldta.addClass('splited-post');
-
- tweetForm.find(".textcomplete-wrapper").append($newta); // FIXME come find textcomplete-wrapper anywhere in code
+ $oldta.after($newta);
$newta.val(cp.substr(ci));
- $newta.focus();
- if ($newta[0].setSelectionRange)
- $newta[0].setSelectionRange($newta.val().length, $newta.val().length);
- else if ($newta[0].createTextRange)
- $newta[0].createTextRange().moveEnd('character', $newta.val().length);
+ $oldta.val(cp.substr(0, ci));
$tas = tweetForm.find("textarea");
splitedPostsCount = $tas.length;
+ pml = getPostSplitingPML();
+
+ $oldta.on('focus', function() {
+ this.style.height = '80px';
+ });
+ $oldta.addClass('splited-post');
+ $oldta.on('focusout', function() {this.style.height = '28px';}); // FIXME move this to CSS
+
+ if (caretPos > cci) {
+ caretPos -= ci;
+ icurrentta += 1;
+ cci = getPostSpittingCI(icurrentta);
+ var $targetta = $newta;
+ $oldta[0].style.height = '28px'; // FIXME move this to CSS
+ } else if (i === icurrentta) {
+ $($tas[i]).caret(caretPos);
+ replyTextUpdateRemaining($tas[i]);
+ if (typeof($.fn.textcomplete) === 'function')
+ setTextcompleteOn($tas[i]);
+ }
}
} else if ($tas.length > 1 && $tas[i].value.length === 0) {
@@ -819,34 +833,113 @@ function replyTextKeypress(e) {
}
$tas = tweetForm.find("textarea");
splitedPostsCount = $tas.length;
+ if (splitedPostsCount > 1)
+ pml = getPostSplitingPML();
+ else
+ pml = 140;
+ caretPos = -1;
+ if (icurrentta >= i && icurrentta > 0) {
+ icurrentta -= 1;
+ cci = getPostSpittingCI(icurrentta);
+ }
+ var $targetta = $($tas[icurrentta]);
}
}
- c = 140 - $tas[$tas.length - 1].value.length - (2 * splitedPostsCount.toString().length) - 4;
- if (typeof(reply_to) !== 'undefined' &&
- !checkPostForMentions($tas[$tas.length - 1].value, reply_to, 140 - c - reply_to.length))
- c -= reply_to.length;
+ if (typeof($targetta) !== 'undefined' && $targetta[0] !== document.activeElement) {
+ $this = $targetta;
+ $this.focus();
+ $this.caret(caretPos);
+ }
}
- var remainingCount = tweetForm.find(".post-area-remaining");
+ }
- if( c < 0 )
- remainingCount.addClass("warn");
- else
- remainingCount.removeClass("warn");
+ function getPostSplitingPML() {
+ var pml = 140 -(i+1).toString().length -splitedPostsCount.toString().length -4;
- if (usePostSpliting && !$this.parents('.directMessages').length)
- remainingCount.text(splitedPostsCount.toString() + ". post: " + c.toString());
- else
- remainingCount.text(c.toString());
+ // if mention exists, we shouldn't add it while posting.
+ if (typeof(reply_to) !== 'undefined' &&
+ !checkPostForMentions($tas[i].value, reply_to, pml -reply_to.length)) {
+ pml -= reply_to.length;
+ }
+
+ return pml;
+ }
+
+ function getPostSpittingCI(ita) {
+ var ci;
+ var endings = $tas[ita].value.match(/ |,|;|\.|:|\/|\?|\!|\\|'|"|\n|\t/g);
+
+ if (endings) {
+ ci = $tas[ita].value.lastIndexOf(endings[endings.length - 1]);
+ for (var j = endings.length - 2; j >= 0 && ci > pml; j--) {
+ ci = $tas[ita].value.lastIndexOf(endings[j], ci - 1);
+ }
+ }
+ if (!(ci > 0))
+ ci = pml;
+
+ return (ci > pml) ? pml : ci;
+ }
+}
+
+function replyTextUpdateRemaining(ta) {
+ if (ta === document.activeElement ) {
+ var $this = $(ta);
+ var tweetForm = $this.closest('form');
+ if( tweetForm != undefined ) {
+ var remainingCount = tweetForm.find(".post-area-remaining");
+ var c = replyTextCountRemaining(ta);
+
+ if (usePostSpliting && !$this.parents('.directMessages').length && splitedPostsCount > 1)
+ remainingCount.text((tweetForm.find("textarea").index(ta)+1).toString() +'/' +splitedPostsCount.toString() +": " +c.toString());
+ else
+ remainingCount.text(c.toString());
+
+ var tweetAction = tweetForm.find(".post-submit");
+ if( !tweetAction.length ) tweetAction = tweetForm.find(".dm-submit");
+ var disable = false;
+ $this.closest('form').find("textarea").each(function() {
+ if (replyTextCountRemaining(this) < 0) {
+ disable = true; // alternatively we could call replyTextInput()
+ return false;
+ }
+ });
+ if (!disable && c >= 0 && c < 140 && $this.val() != $this.attr("data-reply-to")) {
+ remainingCount.removeClass("warn");
+ $.MAL.enableButton(tweetAction);
+ } else {
+ if (disable)
+ remainingCount.addClass("warn");
+ $.MAL.disableButton(tweetAction);
+ }
+ }
+ }
+}
+
+function replyTextCountRemaining(ta) {
+ var $this = $(ta);
+ var c;
+
+ if (usePostSpliting && !$this.parents('.directMessages').length && splitedPostsCount > 1) {
+ c = 140 -ta.value.length -($this.closest('form').find("textarea").index(ta)+1).toString().length -splitedPostsCount.toString().length -4;
+ var reply_to = $this.attr('data-reply-to');
+ if (typeof(reply_to) !== 'undefined' &&
+ !checkPostForMentions(ta.value, reply_to, 140 -c -reply_to.length))
+ c -= reply_to.length;
+ } else
+ c = 140 - ta.value.length;
+ return c;
+}
+
+function replyTextKeySend(e) {
+ e = e || event;
+ var $this = $( this );
+ var tweetForm = $this.parents('form');
+ if( tweetForm != undefined ) {
var tweetAction = tweetForm.find(".post-submit");
if( !tweetAction.length ) tweetAction = tweetForm.find(".dm-submit");
- if( c >= 0 && c < 140 &&
- $this.val() != $this.attr("data-reply-to") ) {
- $.MAL.enableButton(tweetAction);
- } else {
- $.MAL.disableButton(tweetAction);
- }
if( $.Options.keyEnterToSend() && $('.dropdown-menu').css('display') == 'none'){
if (e.keyCode === 13 && (!e.metaKey && !e.ctrlKey)) {
@@ -1445,19 +1538,20 @@ function replaceDashboards() {
if ($(window).width() >= 1200 && !$('.wrapper').hasClass('w1200')) {
$('.wrapper').addClass('w1200');
$('.userMenu').addClass('w1200');
- var wf = $('.module.who-to-follow');
- wf.detach();
- wf.appendTo($('.dashboard.right'));
+ var wtf = $('.module.who-to-follow');
+ if (wtf.length > 0) {
+ wtf.detach();
+ wtf.appendTo($('.dashboard.right'));
+ }
} else if ($(window).width() < 1200 && $('.wrapper').hasClass('w1200')) {
$('.wrapper').removeClass('w1200');
$('.userMenu').removeClass('w1200');
- var wf = $('.module.who-to-follow');
- wf.detach();
- $('.module.mini-profile').after(wf);
+ var wtf = $('.module.who-to-follow');
+ if (wtf.length > 0) {
+ wtf.detach();
+ $('.module.mini-profile').after(wtf);
+ }
}
-
- $( ".who-to-follow .refresh-users" ).bind( "click", refreshWhoToFollow );
- //$( ".who-to-follow .view-all-users" ).bind( "click", function(){window.location.hash = "#whotofollow"} );
}
function initInterfaceCommon() {
@@ -1508,7 +1602,9 @@ function initInterfaceCommon() {
$( ".undo-unicode" ).click( undoLastUnicode );
var $replyText = $( ".post-area-new textarea" );
- $replyText.on("keyup", replyTextKeypress );
+ $replyText.on('input', replyTextInput); // input event fires in modern browsers (IE9+) on any changes in textarea (and copypasting with mouse too)
+ $replyText.on('input focus', function() {replyTextUpdateRemaining(this);});
+ $replyText.on('keyup', replyTextKeySend);
$( ".open-profile-modal").bind( "click", function(e){ e.stopPropagation(); } );
//$( ".open-hashtag-modal").bind( "click", openHashtagModal );
@@ -1519,6 +1615,11 @@ function initInterfaceCommon() {
replaceDashboards();
$( window ).resize(replaceDashboards);
+ if ($.Options.getWhoToFollowOpt() === 'enable')
+ initWhoToFollow();
+ else
+ killWhoToFollow();
+
$('.tox-ctc').on('click', function(){
window.prompt(polyglot.t('copy_to_clipboard'), $(this).attr('data'))
});
@@ -1528,25 +1629,42 @@ function initInterfaceCommon() {
if (typeof($.fn.textcomplete) === 'function') {
$('textarea')
- .on('focus', function () {
- var element = this;
- // Cursor has not set yet. And wait 100ms to skip global click event.
- setTimeout(function () {
- // Cursor is ready.
- $(element).textcomplete(getMentionsForAutoComplete(), {
- 'appendTo': ($(element).parents('.dashboard').length > 0) ? $(element).parent() : $('body'),
- 'listPosition': setTextcompleteDropdownListPos
- });
- }, 100);
- })
- .on('focusout', function () {
- $(this).textcomplete('destroy');
- })
+ .on('focus', function () { setTextcompleteOn(this); })
+ .on('focusout', function () { $(this).textcomplete('destroy'); })
;
}
}
+function initWhoToFollow() {
+ var wtf = $('.module.who-to-follow');
+ if (wtf.length) {
+ wtf.html($('#who-to-follow-template').html()).show();
+ var wtfRefresh = wtf.find('.refresh-users');
+ wtfRefresh.on('click', refreshWhoToFollow);
+ setTimeout(function() { wtfRefresh.click() }, 100);
+ //wtf.find('.view-all-users').on('click', function() { window.location.hash = '#whotofollow'; });
+ }
+}
+
+function killWhoToFollow() {
+ var wtf = $('.module.who-to-follow');
+ if (wtf.length)
+ wtf.empty().hide();
+}
+
+function setTextcompleteOn(element) {
+ var $this = $(element);
+ // Cursor has not set yet. And wait 100ms to skip global click event.
+ setTimeout(function () {
+ // Cursor is ready.
+ $this.textcomplete(getMentionsForAutoComplete(), {
+ 'appendTo': ($this.parents('.dashboard').length > 0) ? $this.parent() : $('body'),
+ 'listPosition': setTextcompleteDropdownListPos
+ });
+ }, 100);
+}
+
// following workaround function is for calls from $.fn.textcomplete only
// we need this because currently implementation of caret position detection is way too imperfect
diff --git a/js/interface_home.js b/js/interface_home.js
index e04c07d..734412a 100644
--- a/js/interface_home.js
+++ b/js/interface_home.js
@@ -99,10 +99,6 @@ var InterfaceFunctions = function()
twisterFollowingO = TwisterFollowing(defaultScreenName);
- setTimeout("getRandomFollowSuggestion(processSuggestion)", 1000);
- setTimeout("getRandomFollowSuggestion(processSuggestion)", 1000);
- setTimeout("getRandomFollowSuggestion(processSuggestion)", 1000);
-
if( args.cbFunc )
args.cbFunc(args.cbArg);
}, {cbFunc:cbFunc, cbArg:cbArg});
@@ -122,45 +118,67 @@ var InterfaceFunctions = function()
});
}
- setTimeout(updateTrendingHashtags, 1000);
- if ($.Options.getTopTrendsAutoUpdateOpt() === 'enable' && $.Options.getTopTrendsAutoUpdateTimerOpt() > 0)
- setInterval(updateTrendingHashtags, $.Options.getTopTrendsAutoUpdateTimerOpt()*1000);
+ if ($.Options.getTopTrendsOpt() === 'enable')
+ initTopTrends();
+ else
+ killTopTrends();
}
};
+function initTopTrends() {
+ var $tt = $('.module.toptrends');
+ if ($tt.length) {
+ $tt.html($('#toptrends-template').html()).show();
+ var $ttRefresh = $tt.find('.refresh-toptrends');
+ $ttRefresh.on('click', updateTrendingHashtags);
+ setTimeout(function() { $ttRefresh.click() }, 100);
+ }
+}
+
+function killTopTrends() {
+ var $tt = $('.module.toptrends');
+ if ($tt.length)
+ $tt.empty().hide();
+}
+
function updateTrendingHashtags() {
- twisterRpc('gettrendinghashtags', [10],
- function(args, ret) {
- $('.toptrends-list').empty();
- //console.log('hashtags trends: '+ret);
- for( var i = 0; i < ret.length; i++ ) {
- if ($.Options.getFilterLangOpt() !== 'disable' && $.Options.getFilterLangForTopTrendsOpt())
- var langFilterData = filterLang(ret[i]);
- if (typeof(langFilterData) === 'undefined' || langFilterData['pass'] || $.Options.getFilterLangSimulateOpt()) {
- var $li = $('
');
- var hashtagLinkTemplate = $('#hashtag-link-template').clone(true);
-
- hashtagLinkTemplate.removeAttr('id');
- hashtagLinkTemplate.attr('href',$.MAL.hashtagUrl(ret[i]));
- hashtagLinkTemplate.text('#'+ret[i]);
-
- $li.append(hashtagLinkTemplate);
- if ($.Options.getFilterLangOpt() !== 'disable' && $.Options.getFilterLangSimulateOpt()) {
- if (typeof(langFilterData) !== 'undefined') {
- $li.append(' '+((langFilterData['pass']) ? polyglot.t('passed') : polyglot.t('blocked'))+': '+langFilterData['prob'][0].toString()+'');
- } else {
- $li.append(' '+polyglot.t('not analyzed')+'');
+ var $ttl = $('.module.toptrends .toptrends-list');
+ if ($ttl.length) {
+ twisterRpc('gettrendinghashtags', [10],
+ function(args, ret) {
+ $ttl.empty();
+ //console.log('hashtags trends: '+ret);
+ for( var i = 0; i < ret.length; i++ ) {
+ if ($.Options.getFilterLangOpt() !== 'disable' && $.Options.getFilterLangForTopTrendsOpt())
+ var langFilterData = filterLang(ret[i]);
+ if (typeof(langFilterData) === 'undefined' || langFilterData['pass'] || $.Options.getFilterLangSimulateOpt()) {
+ var $li = $('');
+ var hashtagLinkTemplate = $('#hashtag-link-template').clone(true);
+
+ hashtagLinkTemplate.removeAttr('id');
+ hashtagLinkTemplate.attr('href',$.MAL.hashtagUrl(ret[i]));
+ hashtagLinkTemplate.text('#'+ret[i]);
+
+ $li.append(hashtagLinkTemplate);
+ if ($.Options.getFilterLangOpt() !== 'disable' && $.Options.getFilterLangSimulateOpt()) {
+ if (typeof(langFilterData) !== 'undefined') {
+ $li.append(' '+((langFilterData['pass']) ? polyglot.t('passed') : polyglot.t('blocked'))+': '+langFilterData['prob'][0].toString()+'');
+ } else {
+ $li.append(' '+polyglot.t('not analyzed')+'');
+ }
}
- }
- $('.toptrends-list').append($li);
+ $ttl.append($li);
+ }
}
- }
- }, {},
- function(args, ret) {
- console.log('Error with gettrendinghashtags. Older twister daemon?');
- }, {}
- );
+ }, {},
+ function(args, ret) {
+ console.log('Error with gettrendinghashtags. Older twister daemon?');
+ }, {}
+ );
+ if ($.Options.getTopTrendsAutoUpdateOpt() === 'enable' && $.Options.getTopTrendsAutoUpdateTimerOpt() > 0)
+ setTimeout(updateTrendingHashtags, $.Options.getTopTrendsAutoUpdateTimerOpt()*1000);
+ }
};
//***********************************************
diff --git a/js/interface_localization.js b/js/interface_localization.js
index 16620fe..5fa58c2 100644
--- a/js/interface_localization.js
+++ b/js/interface_localization.js
@@ -4,7 +4,7 @@
// 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","es","nl","it","fr","ru","de","zh","ja","pt-BR","tr","uk","cs"];
+var knownLanguages = ["en","es","nl","it","fr","ru","de","zh-CN","ja","pt-BR","tr","uk","cs"];
if( $.Options.getOption('locLang','auto') == 'auto'){
// detect language with JavaScript
@@ -186,7 +186,7 @@ if(preferredLanguage == "en"){
"You have to log in to use direct messages.": "You have to log in to use direct messages.",
"You have to log in to follow users.": "You have to log in to follow users.",
"You are not following anyone because you are not logged in.": "You are not following anyone because you are not logged in.",
- "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
+ "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
"No one can mention you because you are not logged in.": "No one can mention you because you are not logged in.",
"You don't have any profile because you are not logged in.": "You don't have any profile because you are not logged in.",
"Options": "Options",
@@ -295,7 +295,20 @@ if(preferredLanguage == "en"){
"Terminate Daemon": "Terminate Daemon",
"New post": "New post",
"Search": "Search",
- "Direct Msg": "Direct Msg"
+ "Direct Msg": "Direct Msg",
+ "Traffic information": "Traffic information",
+ "DHT Torrents:": "DHT Torrents:",
+ "Peers:": "Peers:",
+ "Peer List Size:": "Peer List Size:",
+ "Active Requests:": "Active Requests:",
+ "Download:": "Download:",
+ "Upload:": "Upload:",
+ "DHT Download:": "DHT Download:",
+ "DHT Upload:": "DHT Upload:",
+ "IP Overhead Download:": "IP Overhead Download:",
+ "IP Overhead Upload:": "IP Overhead Upload:",
+ "Payload Download:": "Payload Download:",
+ "Payload Upload:": "Payload Upload:",
};
}
if(preferredLanguage == "es"){
@@ -456,7 +469,7 @@ if(preferredLanguage == "es"){
"You have to log in to use direct messages.": "Debes estar logueado para usar mensajes directos.",
"You have to log in to follow users.": "Debes estar logueado para seguir usuarios.",
"You are not following anyone because you are not logged in.": "No estás siguiendo a nadie porque no estás logueado.",
- "You don't have any followers because you are not logged in.": "No tienes ningun seguidor porque no estás logueado.",
+ "You don't have any followers because you are not logged in.": "No tienes ningun seguidor porque no estás logueado.",
"No one can mention you because you are not logged in.": "Nadie te puede mencionar porque no estás logueado.",
"You don't have any profile because you are not logged in.": "No tienes ningún perfil porque noe estás logueado.",
"Options": "Opciones",
@@ -575,7 +588,7 @@ if(preferredLanguage == "uk"){
"ajax_error": "Помилка Ajax: %{error}", // JavaScript error
"All users publicly followed by": "Усі публічні користувачі яких читають",
"Available": "Доступний", // username is available
- "Appearance": "Appearance",
+ "Appearance": "Вигляд",
"Block chain information": "Інформація про ланцюжок блоків",
"Block chain is up-to-date, twister is ready to use!": "Ланцюг блоків оновлено, twister готовий до використання!",
"Block generation": "Генерація блоку ",
@@ -585,17 +598,17 @@ if(preferredLanguage == "uk"){
"Collapse": "Згорнути", // smaller view of a post
"Configure block generation": "Налаштувати генерацію блоку",
"Connections:": "З’єднання: ", // to network
- "Connection lost.": "З’єднання втрачеон.",
+ "Connection lost.": "З’єднання втрачено.",
"days": "%{smart_count} день |||| %{smart_count} днів",
"Detailed information": "Детальна інформація",
"DHT network down.": "Мережа DHT недоступна.",
"Direct Messages": "Особисті повідомлення",
- "Disable": "Відключено",
- "Display mentions to @": "Показати згадування @",
+ "Disable": "Вимкнено",
+ "Display mentions to @": "Показати події @",
"Display retransmissions": "Показати пересилання",
"DNS to obtain list of peers:": "DNS для отримання пірів:",
- "dns address": "адреса dns",
- "downloading_block_chain": "Завантаження ланцюга блоків, будьласка, зачекайте перед продовженням (ланцюг блоків віком %{days} днів).",
+ "dns address": "адреса DNS",
+ "downloading_block_chain": "Завантаження ланцюга блоків, будь ласка, зачекайте перед продовженням (ланцюг блоків віком %{days} днів).",
"download_posts_status": "Завантажено %{portion} повідомлень", // Downloaded 10/30 posts
"Enable": "Включено",
"error": "Помилка: %{error}",
@@ -606,23 +619,23 @@ if(preferredLanguage == "uk"){
"Expand": "Розгорнути", // larger view of a post
"Favorite": "Улюблені",
"File APIs not supported in this browser.": "File APIs не підтримуєтся цим браузером.",
- "Follow": "Підписатись",
- "Following config": "Following config",
- "Which way do you want to follow": "Which way do you want to follow",
- "Followed by": "Підписаний на",
- "followed_by": "%{username} підписан",
+ "Follow": "Читати",
+ "Following config": "Налаштування читання",
+ "Which way do you want to follow": "У який спосіб ви бажаєте читати",
+ "Followed by": "Читає",
+ "followed_by": "%{username} читає",
"Followers": "Читачі",
- "Following": "Читаємі",
+ "Following": "Читає",
"Following users": "Підписані користувачі",
"Force connection to peer:": "Примусове з’єднання з піром:",
"General information": "Загальна інформація",
- "Generate blocks (send promoted messages)": "Генерація блоків (відправка рекламних повідомень)",
+ "Generate blocks (send promoted messages)": "Генерація блоків (відправка рекламних повідомлень)",
"Home": "Головна", // homepage
"hours": "%{smart_count} година |||| %{smart_count} годин",
- "Internal error: lastPostId unknown (following yourself may fix!)": "Внутрішня помилка: lastPostId невизначено (підписка на себе може виправити!)",
+ "Internal error: lastPostId unknown (following yourself may fix!)": "Внутрішня помилка: lastPostId невизначено (підписка на себе може виправити помилку!)",
"Known peers:": "Відомі піри: ",
"Last block is ahead of your computer time, check your clock.": "Останній блок датований майбутнім часом, перевірте свій годинник.",
- "mentions_at": "Згадування @%{user}",
+ "mentions_at": "Події @%{user}",
"minutes": "%{smart_count} хвилина |||| %{smart_count} хвилин",
"Must be 16 characters or less.": "Повинно бути не більше 16 символів.", // username
"Network": "Мережа",
@@ -630,27 +643,27 @@ if(preferredLanguage == "uk"){
"Network status": "Статус мережі",
"New direct message...": "Нове особисте повідомлення...",
"New Post...": "Нове повідомлення...",
- "You got": "You got",
- "in postboard": "in postboard",
- "in search result": "in search result",
- "in top trends": "in top trends",
+ "You got": "Ви отримали",
+ "in postboard": "в стрічці",
+ "in search result": "в пошуковому запиті",
+ "in top trends": "в трендах",
"new_posts": "%{smart_count} нове повідомлення |||| %{smart_count} нових повідомлень",
- "new_mentions": "%{smart_count} new mention |||| %{smart_count} new mentions",
+ "new_mentions": "%{smart_count} нова подія |||| %{smart_count} нових подій",
"new_direct_messages": "%{smart_count} new direct message |||| %{smart_count} new direct messages",
- "nobody": "nobody", // used to promote a post without attaching the user
+ "nobody": "анонімно", // used to promote a post without attaching the user
"Not available": "Не доступне", // username is not available
- "notify_desktop_error": "Twister cannot perform desktop notification: unknown error occured.",
- "notify_desktop_perm_denied": "Twister cannot perform desktop notification: permission denied.\n\nIf you want to get notifications, allow them for %{this_domain} in settings of your browser.",
+ "notify_desktop_error": "Twister не може створити виринаюче повідомлення: невідома помилка.",
+ "notify_desktop_perm_denied": "Twister не може створити сповіщення на робочому столі: доступ обмежено.\n\nЯкщо ви бажаєте отримувати сповіщення, дозвольте їх виконання в налаштуваннях браузера для %{this_domain}.",
"notify_desktop_test": "All the twisters gonna twist.\nNow you are welcome too.",
"notify_desktop_title": "Watch out, it's twister over here!",
"Number of blocks in block chain:": "Кількість блоків у ланцюгу: ",
- "Number of CPUs to use": "Кількість CPUs до використання ",
- "Only alphanumeric and underscore allowed.": "Тільки літеро-численні сиволи та нижнє підкреслення дозволені.",
+ "Number of CPUs to use": "Кількість CPU до використання ",
+ "Only alphanumeric and underscore allowed.": "Допустимі тільки латинські символи, числа та нижнє підкреслення.",
"peer address": "адреса піру",
"Private": "Особистий",
- "Profile": "Проіфль",
+ "Profile": "Профіль",
"Postboard": "Стрічка оновлень",
- "post": "відістати", // verb - button to post a message
+ "post": "надіслати", // verb - button to post a message
"Post to promote:": "Рекламне повідомлення: ",
"Posts": "Повідомлення",
"propagating_nickname": "Поширення інформації шо до %{username} у мережі...",
@@ -666,38 +679,38 @@ if(preferredLanguage == "uk"){
"search": "пошук",
"seconds": "%{smart_count} секунда |||| %{smart_count} секунд",
"send": "відіслати",
- "Send post with username": "Відіслати повідомлення з ім’ям ",
- "Sent Direct Message": "Відіслати особисте повідомлення",
- "Sent Post to @": "Відіслати повідомлення @",
+ "Send post with username": "Надіслати повідомлення від",
+ "Sent Direct Message": "Надіслати особисте повідомлення",
+ "Sent Post to @": "Надіслати повідомлення @",
"Setup account": "Налаштувати акаунт",
"switch_to_network": "Локальний сервер не підєднаний до мережі або \n" +
"ланцюг блоків не актуальний. Якщо ви залишитесь на цій сторінці\n" +
"ваші дії можуть не спрацювати.\n" +
- "Чи бажаєта ви перевірити сторінку зі статусом мережі?",
- "The File APIs are not fully supported in this browser.": "File APIs не повністью підтримуєтся браузером.",
+ "Чи бажаєте ви перевірити сторінку зі статусом мережі?",
+ "The File APIs are not fully supported in this browser.": "File APIs не повністю підтримується браузером.",
"time_ago": "%{time} тому", // 5 minutes ago
"Time of the last block:": "Час останнього блоку: ",
"Type message here": "Напишіть повідомлення тут",
"Unfollow": "Відписатись",
"Update": "Оновити",
- "Auto updating": "Auto updating",
+ "Auto updating": "Автоматичне оновлення",
"Updating status...": "Оновлення статусу...", // status of block chain
"user_not_yet_accepted": "Інші піри ще не прийняли цього користувача.\n" +
"Нажаль, у цьому стані не можливо зберегти профіль\n" +
- "або послати якісь повідомлення.\n\n" +
- "Будьласка, зачекайте декілька хвилин для продовження.\n\n" +
+ "або надсилати якісь повідомлення.\n\n" +
+ "Будь ласка, зачекайте декілька хвилин для продовження.\n\n" +
"Кнопка 'Зберегти зміни' стане доступною автоматично,\n" +
"коли цей процес завершится. (Я обіцяю, це останній раз,\n"+
- "коли ви змушені чекати перед використанням twister).\n\n" +
+ "коли ви змушені чекати перед використанням Twister).\n\n" +
"Підказка: тим часом ви можете вибрати аватар!",
- "users_mentions": "Згадування @%{username}",
+ "users_mentions": "Події @%{username}",
"users_profile": "Профіль %{username}",
- "username_undefined": "Користувач невизначений, потрібен логін.",
+ "username_undefined": "Користувач невизначений, необхідно вказати нік.",
"View": "Дивитись",
"View All": "Дивитись все",
"Who to Follow": "Кого читати",
"Your message was sent!": "Ваше повідомлення відправлене!",
- "twister login": "Вхід до twister",
+ "twister login": "Вхід до Twister",
"Existing local users": "Вже зареєстровані",
"Or...": "Або...",
"Create a new user": "Створити нового користувача",
@@ -713,7 +726,7 @@ if(preferredLanguage == "uk"){
"Mining difficulty:": "Складність майнінгу:",
"Block generation status": "Статус генерації блоків",
"Current hash rate:": "Поточна швидкість хешування:",
- "Terminate Daemon:": "Зупинити twister:",
+ "Terminate Daemon:": "Зупинити Twister:",
"Exit": "Вихід",
"Save Changes": "Зберегти зміни",
"Secret key:": "Секретний ключ:",
@@ -723,204 +736,204 @@ if(preferredLanguage == "uk"){
"You have to log in to use direct messages.": "You have to log in to use direct messages.",
"You have to log in to follow users.": "You have to log in to follow users.",
"You are not following anyone because you are not logged in.": "You are not following anyone because you are not logged in.",
- "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
+ "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
"No one can mention you because you are not logged in.": "No one can mention you because you are not logged in.",
"You don't have any profile because you are not logged in.": "You don't have any profile because you are not logged in.",
- "Options": "Options",
- "Switch to Promoted posts": "Switch to Promoted posts",
- "Switch to Normal posts": "Switch to Normal posts",
- "Use language": "Use language",
- "Ignore": "Ignore",
- "Theme": "Theme",
- "Keys": "Keys",
+ "Options": "Опції",
+ "Switch to Promoted posts": "Рекламні пости",
+ "Switch to Normal posts": "Звичайні пости",
+ "Use language": "Використати мову",
+ "Ignore": "Ігнорувати",
+ "Theme": "Тема",
+ "Keys": "Гарячі клавіші",
"Notifications": "Оповіщення",
"Desktop notifications": "Настільні повідомлення",
"Sound notifications": "Звукові сповіщення",
"Volume": "Гучність",
"Test": "Випроба",
- "Send key": "Send key",
- "Posts display": "Posts display",
- "Post editor": "Post editor",
- "Inline image preview": "Inline image preview",
- "Display": "Display",
+ "Send key": "Надсилання повідомлення",
+ "Posts display": "Відображення постів",
+ "Post editor": "Редактор посту",
+ "Inline image preview": "Контекстний перегляд зображення",
+ "Display": "Відображати",
"Line feeds": "Line feeds",
"Supported punctuations:": "Supported punctuations:",
"Supported emotions:": "Supported emotions:",
- "Supported signs:": "Supported signs:",
- "Supported fractions:": "Supported fractions:",
+ "Supported signs:": "Підтримувані підписи:",
+ "Supported fractions:": "Підтримувані фракції:",
"Automatic unicode conversion options": "Automatic unicode conversion options",
"Convert punctuations to unicode": "Convert punctuations to unicode",
- "Convert emotions codes to unicode symbols": "Convert emotions codes to unicode symbols",
+ "Convert emotions codes to unicode symbols": "Конвертувати смайли в символи Unicode",
"Convert common signs to unicode": "Convert common signs to unicode",
- "Convert fractions to unicode": "Convert fractions to unicode",
- "Convert all": "Convert all",
- "Auto": "Auto",
- "Original": "Original",
- "none": "none",
- "Custom": "Custom",
+ "Convert fractions to unicode": "Конвертувати фракції в Unicode",
+ "Convert all": "Конвертувати усі",
+ "Auto": "Автоматично",
+ "Original": "Оригінал",
+ "none": "немає",
+ "Custom": "Вибірково",
"Mentions": "Mentions",
- "Use proxy for image preview only": "Use proxy for image preview only",
+ "Use proxy for image preview only": "Використовуати Proxy тільки для попереднього перегляду зображень",
"Use external links behind a proxy": "Use external links behind a proxy",
- "There aren't any posts with this hashtag.": "There aren't any posts with this hashtag.",
- "Split only new post": "Split only new post",
- "Split all": "Split all",
- "Don't split": "Don't split",
- "Split long posts": "Split long posts",
- "Posts that begin with mention": "Posts that begin with mention",
- "Show all": "Show all",
+ "There aren't any posts with this hashtag.": "Не знайдено публікацій за цим теґом.",
+ "Split only new post": "Розділяти тільки нові публікації",
+ "Split all": "Поєднати усі",
+ "Don't split": "Не розділювати",
+ "Split long posts": "Розділити довгі повідомлення",
+ "Posts that begin with mention": "Повідомлення, що починаються з події",
+ "Show all": "Відображати усі",
"Show only if I am in": "Show only if I am in",
"Show if it's between users I follow": "Show if it's between users I follow",
- "Postboard displays": "Postboard displays",
+ "Postboard displays": "Відображення публікацій",
"RTs those are close to original twist": "RTs those are close to original twist",
- "Show if the original is older than": "Show if the original is older than",
- "hour(s)": "hour(s)",
- "second(s)": "second(s)",
- "only positive numbers!": "only positive numbers are allowed!",
- "Language filtering": "Language filtering",
- "By blacklist": "By blacklist",
- "By whitelist": "By whitelist",
- "Comma separated ISO 639-3 language codes": "Comma separated ISO 639-3 language codes",
- "Accuracy": "Accuracy",
- "Simulation mode": "Simulation mode",
- "This post is treated by language filter": "This post is %{treated} by language filter.",
- "blocked": "blocked",
- "passed": "passed",
- "not analyzed": "not analyzed",
- "Reason: this": "Reason: %{this}",
- "this doesnt contain that": "%{this} does not contain %{that}",
- "this is undefined": "%{this} is undefined",
- "blacklist": "blacklist",
- "whitelist": "whitelist",
- "language of this": "language of this",
- "its undefined language": "it is undefined language",
- "its this, blacklisted": "it is %{this}, blacklisted",
- "its this, whitelisted": "it is %{this}, whitelisted",
- "Most possible language: this": "Most possible language: %{this}",
- "Scope of usage": "Scope of usage",
- "Show with every user name": "Show with every user name",
- "Show at profile modal only": "Show at profile modal only",
- "Show if a user follows me": "Show if a user follows me",
- "follows you": "follows you",
- "Show conversation": "Show conversation",
- "Mark all as read": "Mark all as read",
- "show_more_count": "%{smart_count} more...",
- "hide": "hide",
- "Show more in this conversation...": "Show more in this conversation...",
- "conversation_title": "Conversation of @%{username}",
- "copy_to_clipboard": "Press Ctrl/Cmd+C to copy then Enter to close",
- "Normal posts": "Normal posts",
- "Promoted posts": "Promoted posts",
- "Messages": "Messages",
- "Edit profile": "Edit profile",
- "Top Trends": "Top Trends",
+ "Show if the original is older than": "Показувати, якщо оригінал старіше за",
+ "hour(s)": "годин",
+ "second(s)": "секунд",
+ "only positive numbers!": "Дозволені тільки позитивні числа!",
+ "Language filtering": "Фільтрування за мовою",
+ "By blacklist": "За чорним списком",
+ "By whitelist": "За білим списком",
+ "Comma separated ISO 639-3 language codes": "Розділені комою у мовному кодуванні ISO 639-3",
+ "Accuracy": "Точність",
+ "Simulation mode": "Режим симуляції",
+ "This post is treated by language filter": "Цю публікацію %{treated} за мовним фільтром.",
+ "blocked": "заблоковано",
+ "passed": "пройшло",
+ "not analyzed": "не проаналізовано",
+ "Reason: this": "Причина: %{this}",
+ "this doesnt contain that": "%{this} не містить %{that}",
+ "this is undefined": "%{this} невідомо",
+ "blacklist": "чорний список",
+ "whitelist": "білий список",
+ "language of this": "мова цього",
+ "its undefined language": "це невідома мова",
+ "its this, blacklisted": "%{this} занесено до чорного списку",
+ "its this, whitelisted": "%{this} занесено до білого списку",
+ "Most possible language: this": "Найбільш вірогідні мови: %{this}",
+ "Scope of usage": "Сфера використання",
+ "Show with every user name": "Відображати поряд з кожним ніком",
+ "Show at profile modal only": "Відображати тільки в модальному вікні профілю",
+ "Show if a user follows me": "Якщо користувач читає мене",
+ "follows you": "стежить за тобою",
+ "Show conversation": "Показати бесіду",
+ "Mark all as read": "Позначити усі як прочитані",
+ "show_more_count": "%{smart_count} більше...",
+ "hide": "сховати",
+ "Show more in this conversation...": "Показати більше у цій бесіді...",
+ "conversation_title": "Розмова з @%{username}",
+ "copy_to_clipboard": "Щоб скопіювати, натисніть Ctrl/Cmd+C а потім Enter щоб закрити",
+ "Normal posts": "Звичайні пости",
+ "Promoted posts": "Рекламні пости",
+ "Messages": "Повідомлення",
+ "Edit profile": "Редагувати профіль",
+ "Top Trends": "Тренди",
"twisted again by": "twisted again by",
- "undo": "undo",
- "Are you sure you want to exit the daemon?\nThe Twister client will stop working.": "Are you sure you want to exit the daemon?\nThe Twister client will stop working.",
- "Daemon exited...": "Daemon exited...",
- "Secret Key": "Secret Key",
- "Copy to clipboard": "Copy to clipboard",
- "Full name here": "Full name here",
- "Describe yourself": "Describe yourself",
- "Location": "Location",
- "website": "website",
- "Tox address": "Tox address",
- "Bitmessage address": "Bitmessage address",
- "Language": "Language",
- "Sound": "Sound",
- "Users": "Users",
+ "undo": "відмінити",
+ "Are you sure you want to exit the daemon?\nThe Twister client will stop working.": "Ви впевнені, що бажаєте зупинити системний демон? \nУ такому разі, клієнт Twister буде зупинено допоки ви не запустите його знову.",
+ "Daemon exited...": "Системний демон припинив роботу...",
+ "Secret Key": "Секретний ключ",
+ "Copy to clipboard": "Скопіювати до буферу",
+ "Full name here": "Повне ім’я",
+ "Describe yourself": "Розкажи про себе",
+ "Location": "Розташування",
+ "website": "Вебсайт",
+ "Tox address": "Адреса Tox",
+ "Bitmessage address": "Адреса Bitmessage",
+ "Language": "Мова",
+ "Sound": "Звук",
+ "Users": "Користувачі",
"Direct Message's copy to self": "Direct Message's copy to self",
};
}
-if(preferredLanguage == "zh"){
- polyglot.locale("zh");
+if(preferredLanguage == "zh-CN"){
+ polyglot.locale("zh-CN");
wordset = {
"Actions ▼": "操作 ▼",
"Active DHT nodes:": "活动的DHT节点: ",
"Add DNS": "添加DNS",
"Add peer": "添加节点",
- "ajax_error": "Ajax错误: %{error}", // JavaScript error
- "All users publicly followed by": "所有用户均被关注",
+ "ajax_error": "AJAX错误:%{error}", // JavaScript error
+ "All users publicly followed by": "公开关注的所有用户,被",
"Available": "可用", // username is available
"Appearance": "外观",
- "Block chain information": "块链信息",
- "Block chain is up-to-date, twister is ready to use!": "块链已经更新,Twister已经可以使用!",
- "Block generation": "块生成器 ",
+ "Block chain information": "区块链信息",
+ "Block chain is up-to-date, twister is ready to use!": "区块链已经更新,Twister 已经可以使用!",
+ "Block generation": "区块生成器",
"Cancel": "取消",
"Change user": "切换用户",
"Checking...": "检查中...", // checking if username is available
- "Collapse": "Collapse", // smaller view of a post
- "Configure block generation": "配置块生成器",
+ "Collapse": "折叠", // smaller view of a post
+ "Configure block generation": "配置区块生成器",
"Connections:": "连接数:", // to network
- "Connection lost.": "链接中断。",
+ "Connection lost.": "连接中断。",
"days": "%{smart_count} 天",
"Detailed information": "详细信息",
"DHT network down.": "DHT网络中断。",
- "Direct Messages": "即时消息",
+ "Direct Messages": "私信",
"Disable": "关闭",
"Display mentions to @": "显示@",
"Display retransmissions": "显示转发",
- "DNS to obtain list of peers:": "获取节点列表的DNS:",
- "downloading_block_chain": "下载块链中,请等待下载完成(块链已经落后 %{days} 天)。",
+ "DNS to obtain list of peers:": "用DNS获取节点列表:",
+ "downloading_block_chain": "区块链下载中,请等待下载完成(区块链仍落后 %{days} 天)。",
"download_posts_status": "已下载 %{portion} 推文", // Downloaded 10/30 posts
"Enable": "开启",
"error": "错误:%{error}",
- "error_connecting_to_daemon": "连接本地Twister守护进程错误",
- "Error in 'createwalletuser' RPC.": "PRC 'createwalletuser' 错误",
- "Error in 'importprivkey'": "'importprivkey' 错误 RPC: %{rpc}",
- "Error in 'sendnewusertransaction' RPC.": "RPC 'sendnewusertransaction' 错误。",
- "Expand": "扩展", // larger view of a post
+ "error_connecting_to_daemon": "连接本地的 Twister 后台进程时出错",
+ "Error in 'createwalletuser' RPC.": "'createwalletuser' RPC 错误",
+ "Error in 'importprivkey'": "'importprivkey' 错误:%{rpc}",
+ "Error in 'sendnewusertransaction' RPC.": "'sendnewusertransaction' RPC 错误。",
+ "Expand": "展开", // larger view of a post
"Favorite": "收藏",
- "File APIs not supported in this browser.": "这个浏览器不支持文件APIs",
+ "File APIs not supported in this browser.": "这个浏览器不支持 File API。",
"Follow": "关注",
- "Following config": "Following config",
- "Which way do you want to follow": "Which way do you want to follow",
- "Followed by": "被关注",
+ "Following config": "关注配置",
+ "Which way do you want to follow": "你想以哪种方式关注",
+ "Followed by": "关注者",
"followed_by": "被 %{username} 关注",
"Followers": "粉丝",
- "Following": "关注中",
- "Following users": "关注的人",
+ "Following": "关注",
+ "Following users": "关注的用户",
"Force connection to peer:": "强制连接到节点:",
"General information": "常规信息",
- "Generate blocks (send promoted messages)": "生成块(发送广告信息)",
+ "Generate blocks (send promoted messages)": "生成区块(发送推广信息)",
"Home": "主页", // homepage
- "hours": "%{smart_count} hour |||| %{smart_count} 小时",
- "Internal error: lastPostId unknown (following yourself may fix!)": "内部错误:最后推文Id位置(尝试关注你自己进行修复!)",
+ "hours": "%{smart_count} 小时",
+ "Internal error: lastPostId unknown (following yourself may fix!)": "内部错误:最后推文ID未知(关注你自己也许能修复!)",
"Known peers:": "已知节点:",
- "Last block is ahead of your computer time, check your clock.": "最后的块已经慢于你的系统时间,请检查你的系统时间。",
- "mentions_at": "提到 @%{user}",
+ "Last block is ahead of your computer time, check your clock.": "最后的区块已经超前于你的系统时间,请检查你的时钟系统。",
+ "mentions_at": "提及 @%{user}",
"minutes": "%{smart_count} 分钟",
"Must be 16 characters or less.": "必须少于16个字符", // username
"Network": "网络",
"Network config": "网络配置",
"Network status": "网络状态",
- "New direct message...": "新的即时信息...",
+ "New direct message...": "新私信...",
"New Post...": "新推文...",
"You got": "你收到",
"in postboard": "在时间线里",
"in search result": "在搜索结果里",
"in top trends": "在热词趋势里",
- "new_posts": "%{smart_count} 新推文",
- "new_mentions": "%{smart_count} 新的提及 |||| %{smart_count} 新的提及",
- "new_direct_messages": "%{smart_count} 新私信 |||| %{smart_count} 新私信",
- "nobody": "nobody", // used to promote a post without attaching the user
+ "new_posts": "%{smart_count} 篇新推文",
+ "new_mentions": "%{smart_count} 次新的提及",
+ "new_direct_messages": "%{smart_count} 封新私信",
+ "nobody": "无名", // used to promote a post without attaching the user
"Not available": "用户名不可用", // username is not available
- "notify_desktop_error": "Twister 无法发出桌面提醒: 发生未知错误.",
- "notify_desktop_perm_denied": "Twister 无法发出桌面提醒: 权限被拒绝.\n\n如果你想收到提醒, 在你的浏览器设置中允许 %{this_domain} 发出提醒.",
- "notify_desktop_test": "我们都用 Twister.\n欢迎你加入.",
- "notify_desktop_title": "注意, twister 在这!",
- "Number of blocks in block chain:": "块链中的块数:",
- "Number of CPUs to use": "使用CPU数目 ",
- "Only alphanumeric and underscore allowed.": "只允许字母和下划线",
+ "notify_desktop_error": "Twister 无法发出桌面提醒:发生未知错误。",
+ "notify_desktop_perm_denied": "Twister 无法发出桌面提醒:权限被拒绝。\n\n如果你想收到提醒,请在你的浏览器设置中允许 %{this_domain} 发出提醒。",
+ "notify_desktop_test": "我们都在用 Twister。\n欢迎你的加入。",
+ "notify_desktop_title": "注意,Twister 在这里!",
+ "Number of blocks in block chain:": "区块链中的区块数:",
+ "Number of CPUs to use": "使用CPU数目",
+ "Only alphanumeric and underscore allowed.": "只允许字母和下划线。",
"peer address": "节点地址",
- "Private": "私人",
+ "Private": "私密",
"Profile": "个人信息",
"Postboard": "信息流",
"post": "发送", // verb - button to post a message
- "Post to promote:": "要发布的广告信息:",
+ "Post to promote:": "要发送的推广信息:",
"Posts": "推文",
- "propagating_nickname": "Propagating nickname %{username} to the network...",
- "Public": "公共",
+ "propagating_nickname": "正在传播昵称 %{username} 到网络中...",
+ "Public": "公开",
"Refresh": "刷新",
"retransmit_this": "转发推文给你的粉丝?",
"Reply": "回复",
@@ -932,115 +945,115 @@ if(preferredLanguage == "zh"){
"search": "搜索",
"seconds": "%{smart_count} 秒",
"send": "发送",
- "Send post with username": "发送推文的用户名 ",
- "Sent Direct Message": "发送即时消息",
+ "Send post with username": "发送推文的用户名",
+ "Sent Direct Message": "发送私信",
"Sent Post to @": "发送推文 @",
- "Setup account": "设置帐号",
- "switch_to_network": "本地守护进程没有连接网络或\n" +
- "块链已经过时。如果你留在此页\n" +
+ "Setup account": "设置账号",
+ "switch_to_network": "本地的后台进程没有连接到网络,或者\n" +
+ "区块链已经过时。如果你留在此页面\n" +
"你的操作将不会生效\n" +
- "你要马上跳转到网络状态页吗?",
- "The File APIs are not fully supported in this browser.": "这个浏览器不能完全支持文件APIs",
+ "你要跳转到网络状态页吗?",
+ "The File APIs are not fully supported in this browser.": "这个浏览器不能完全支持 File API。",
"time_ago": "%{time} 之前", // 5 minutes ago
- "Time of the last block:": "最新块的时间:",
+ "Time of the last block:": "最新区块的时间:",
"Type message here": "输入消息内容",
"Unfollow": "取消关注",
"Update": "更新",
"Auto updating": "自动更新",
- "Updating status...": "更新状态中...", // status of block chain
- "user_not_yet_accepted": "其他节点还没有接受新用户。\n" +
+ "Updating status...": "状态更新中...", // status of block chain
+ "user_not_yet_accepted": "其他节点还没有接受这个新用户。\n" +
"很抱歉,现在你还不能保存你的个人简介\n" +
"或发送新的推文。\n\n" +
"请稍等几分钟再试试。\n\n" +
- "当节点接受用户操作完成后\n" +
- "“保存”将会自动转换为可以。(我保证这是\n"+
- "在你使用Twister前的最后一次等待。\n\n" +
- "提示:现在先选好你的头像! ",
- "users_mentions": "提到 @%{username}",
- "users_profile": "%{username} 的简介",
- "username_undefined": "用户名未设置,请先登录!",
+ "当相应操作完成后\n" +
+ "“保存更改”按钮将会自动转换为可用。(我保证这是\n"+
+ "在你使用 Twister 前的最后一次等待。\n\n" +
+ "小提示:在这时你可以先选好你的头像!",
+ "users_mentions": "提及 @%{username}",
+ "users_profile": "%{username} 的个人简介",
+ "username_undefined": "用户名未定义,请先登录!",
"View": "查看",
"View All": "查看全部",
"Who to Follow": "推荐关注",
- "Your message was sent!": "你的信息已经发送!",
- "twister login": "登录Twister",
- "Existing local users": "已有本地用户",
+ "Your message was sent!": "你的信息已发送!",
+ "twister login": "登录 Twister",
+ "Existing local users": "现有本地用户",
"Or...": "或...",
- "Create a new user": "创建一个新用户",
+ "Create a new user": "创建新用户",
"Login": "登录",
"Check availability": "检查是否可用",
"Create this nickname": "使用这个昵称",
"Type nickname here": "输入你的昵称",
- "Import secret key": "导入密钥",
- "52-characters secret": "52位密钥串",
- "With nickname": "With nickname",
+ "Import secret key": "导入私钥",
+ "52-characters secret": "52位私钥字符串",
+ "With nickname": "昵称",
"Import key": "导入密钥",
"Client Version:": "客户端版本:",
"Mining difficulty:": "挖矿难度:",
- "Block generation status": "块链状态",
+ "Block generation status": "区块链生成器状态",
"Current hash rate:": "当前hash速率:",
- "Terminate Daemon:": "断开守护进程数:",
+ "Terminate Daemon:": "终止后台进程:",
"Exit": "退出",
- "Save Changes": "保存设置",
- "Secret key:": "密钥:",
- "You have to log in to post messages.": "You have to log in to post messages.",
- "You have to log in to post replies.": "You have to log in to post replies.",
- "You have to log in to retransmit messages.": "You have to log in to retransmit messages.",
- "You have to log in to use direct messages.": "You have to log in to use direct messages.",
- "You have to log in to follow users.": "You have to log in to follow users.",
- "You are not following anyone because you are not logged in.": "You are not following anyone because you are not logged in.",
- "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
- "No one can mention you because you are not logged in.": "No one can mention you because you are not logged in.",
- "You don't have any profile because you are not logged in.": "You don't have any profile because you are not logged in.",
- "Options": "Options",
- "Switch to Promoted posts": "Switch to Promoted posts",
- "Switch to Normal posts": "Switch to Normal posts",
- "Use language": "Use language",
- "Ignore": "Ignore",
- "Theme": "Theme",
- "Keys": "Keys",
- "Notifications": "Notifications",
- "Desktop notifications": "Desktop notifications",
- "Sound notifications": "Sound notifications",
- "Volume": "Volume",
- "Test": "Test",
- "Send key": "Send key",
- "Posts display": "Posts display",
- "Post editor": "Post editor",
- "Inline image preview": "Inline image preview",
- "Display": "Display",
+ "Save Changes": "保存更改",
+ "Secret key:": "私钥:",
+ "You have to log in to post messages.": "你必须登录才能发送信息。",
+ "You have to log in to post replies.": "你必须登录才能发送回复。",
+ "You have to log in to retransmit messages.": "你必须登录才能转发信息",
+ "You have to log in to use direct messages.": "你必须登录才能进行私信。",
+ "You have to log in to follow users.": "你必须登录才能关注用户。",
+ "You are not following anyone because you are not logged in.": "你没有关注任何人,因为你还没登录",
+ "You don't have any followers because you are not logged in.": "你没有任何粉丝,因为你还没登录",
+ "No one can mention you because you are not logged in.": "没人能提及你,因为你还没登录",
+ "You don't have any profile because you are not logged in.": "你没有任何个人简介,因为你还没登录",
+ "Options": "选项",
+ "Switch to Promoted posts": "切换到推广发送",
+ "Switch to Normal posts": "切换到普通发送",
+ "Use language": "界面语言",
+ "Ignore": "忽略",
+ "Theme": "主题",
+ "Keys": "按键",
+ "Notifications": "通知",
+ "Desktop notifications": "桌面通知",
+ "Sound notifications": "声音通知",
+ "Volume": "音量",
+ "Test": "测试",
+ "Send key": "发送键",
+ "Posts display": "推文显示",
+ "Post editor": "信息编辑器",
+ "Inline image preview": "内嵌图像预览",
+ "Display": "显示",
"Line feeds": "Line feeds",
- "Supported punctuations:": "Supported punctuations:",
- "Supported emotions:": "Supported emotions:",
- "Supported signs:": "Supported signs:",
- "Supported fractions:": "Supported fractions:",
- "Automatic unicode conversion options": "Automatic unicode conversion options",
- "Convert punctuations to unicode": "Convert punctuations to unicode",
- "Convert emotions codes to unicode symbols": "Convert emotions codes to unicode symbols",
- "Convert common signs to unicode": "Convert common signs to unicode",
- "Convert fractions to unicode": "Convert fractions to unicode",
- "Convert all": "Convert all",
- "Auto": "Auto",
- "Original": "Original",
- "none": "none",
- "Custom": "Custom",
- "Mentions": "Mentions",
- "Use proxy for image preview only": "Use proxy for image preview only",
- "Use external links behind a proxy": "Use external links behind a proxy",
- "There aren't any posts with this hashtag.": "There aren't any posts with this hashtag.",
- "Split only new post": "Split only new post",
- "Split all": "Split all",
- "Don't split": "Don't split",
- "Split long posts": "Split long posts",
- "Posts that begin with mention": "Posts that begin with mention",
- "Show all": "Show all",
- "Show only if I am in": "Show only if I am in",
- "Show if it's between users I follow": "Show if it's between users I follow",
- "Postboard displays": "Postboard displays",
- "RTs those are close to original twist": "RTs those are close to original twist",
- "Show if the original is older than": "Show if the original is older than",
- "hour(s)": "hour(s)",
- "second(s)": "second(s)",
+ "Supported punctuations:": "支持的标点符号:",
+ "Supported emotions:": "支持的表情符号:",
+ "Supported signs:": "支持的标记符号:",
+ "Supported fractions:": "支持的分数形式:",
+ "Automatic unicode conversion options": "自动转换 Unicode",
+ "Convert punctuations to unicode": "转换标点符号到 Unicode 形式",
+ "Convert emotions codes to unicode symbols": "转换表情码到 Unicode 符号",
+ "Convert common signs to unicode": "转换常见符号到 Unicode 形式",
+ "Convert fractions to unicode": "转换分数到 Unicode 形式",
+ "Convert all": "全部转换",
+ "Auto": "自动",
+ "Original": "原版",
+ "none": "无",
+ "Custom": "自定义",
+ "Mentions": "提及",
+ "Use proxy for image preview only": "只对图像预览使用代理",
+ "Use external links behind a proxy": "在代理的后方使用外部链接",
+ "There aren't any posts with this hashtag.": "这个话题还没有任何推文呢。",
+ "Split only new post": "只拆分新推文",
+ "Split all": "全部拆分",
+ "Don't split": "不拆分",
+ "Split long posts": "拆分长推文",
+ "Posts that begin with mention": "将推文的提及放在开头",
+ "Show all": "全部显示",
+ "Show only if I am in": "只显示如果我在其中",
+ "Show if it's between users I follow": "显示我关注的用户",
+ "Postboard displays": "信息流显示偏好",
+ "RTs those are close to original twist": "靠近原推文的 RT",
+ "Show if the original is older than": "显示,如果比原件晚",
+ "hour(s)": "小时",
+ "second(s)": "秒",
"only positive numbers!": "只允许正数字!",
"Language filtering": "语言过滤",
"By blacklist": "用黑名单",
@@ -1048,53 +1061,70 @@ if(preferredLanguage == "zh"){
"Comma separated ISO 639-3 language codes": "英文逗号分隔的 ISO 639-3 语言代码",
"Accuracy": "严格度",
"Simulation mode": "模拟模式",
- "This post is treated by language filter": "这条推文被语言过滤器 %{treated} .",
+ "This post is treated by language filter": "这条推文被语言过滤器 %{treated}。",
"blocked": "阻止",
"passed": "放行",
- "not analyzed": "未被分析",
+ "not analyzed": "未分析",
"Reason: this": "原因: %{this}",
"this doesnt contain that": "%{this} 不包含 %{that}",
"this is undefined": "%{this} 未定义",
"blacklist": "黑名单",
"whitelist": "白名单",
"language of this": "此语言",
- "its undefined language": "它是未识别语言",
- "its this, blacklisted": "它是 %{this}, 被黑名单",
- "its this, whitelisted": "它是 %{this}, 被白名单",
- "Most possible language: this": "最可能的语言: %{this}",
+ "its undefined language": "它是未定义的语言",
+ "its this, blacklisted": "它是 %{this},被列在黑名单",
+ "its this, whitelisted": "它是 %{this},被列在白名单",
+ "Most possible language: this": "最可能的语言:%{this}",
"Scope of usage": "使用范围",
- "Show with every user name": "Show with every user name",
- "Show at profile modal only": "Show at profile modal only",
- "Show if a user follows me": "Show if a user follows me",
- "follows you": "follows you",
- "Show conversation": "Show conversation",
- "Mark all as read": "Mark all as read",
- "show_more_count": "%{smart_count} more...",
- "hide": "hide",
- "Show more in this conversation...": "Show more in this conversation...",
- "conversation_title": "Conversation of @%{username}",
- "copy_to_clipboard": "Press Ctrl/Cmd+C to copy then Enter to close",
- "Normal posts": "Normal posts",
- "Promoted posts": "Promoted posts",
- "Messages": "Messages",
- "Edit profile": "Edit profile",
- "Top Trends": "Top Trends",
- "twisted again by": "twisted again by",
- "undo": "undo",
- "Are you sure you want to exit the daemon?\nThe Twister client will stop working.": "Are you sure you want to exit the daemon?\nThe Twister client will stop working.",
- "Daemon exited...": "Daemon exited...",
- "Secret Key": "Secret Key",
- "Copy to clipboard": "Copy to clipboard",
- "Full name here": "Full name here",
- "Describe yourself": "Describe yourself",
- "Location": "Location",
- "website": "website",
- "Tox address": "Tox address",
- "Bitmessage address": "Bitmessage address",
- "Language": "Language",
- "Sound": "Sound",
- "Users": "Users",
- "Direct Message's copy to self": "Direct Message's copy to self",
+ "Show with every user name": "显示出每个用户名",
+ "Show at profile modal only": "只显示在个人简介",
+ "Show if a user follows me": "在一名用户关注我时",
+ "follows you": "关注你",
+ "Show conversation": "显示对话",
+ "Mark all as read": "全部标记已读",
+ "show_more_count": "还有 %{smart_count} 条...",
+ "hide": "隐藏",
+ "Show more in this conversation...": "显示更多此对话的内容...",
+ "conversation_title": "@%{username} 的对话",
+ "copy_to_clipboard": "按 Ctrl/Cmd+C 复制,然后按 Enter 关闭",
+ "Normal posts": "普通推文",
+ "Promoted posts": "推广推文",
+ "Messages": "消息",
+ "Edit profile": "编辑个人简介",
+ "Top Trends": "热门趋势",
+ "twisted again by": "转推由",
+ "undo": "撤销",
+ "Are you sure you want to exit the daemon?\nThe Twister client will stop working.": "你确定要退出后台进程?\nTwister 客户端将停止工作。",
+ "Daemon exited...": "后台进程已退出...",
+ "Secret Key": "私钥",
+ "Copy to clipboard": "复制到剪贴板",
+ "Full name here": "输入全称",
+ "Describe yourself": "介绍你自己",
+ "Location": "位置",
+ "website": "网站",
+ "Tox address": "Tox 软件地址",
+ "Bitmessage address": "比特信地址",
+ "Language": "语言",
+ "Sound": "声音",
+ "Users": "用户",
+ "Direct Message's copy to self": "将私信发一份副本给我",
+ "Terminate Daemon": "终止后台进程",
+ "New post": "新推文",
+ "Search": "搜索",
+ "Direct Msg": "私信",
+ "Traffic information": "传输信息",
+ "DHT Torrents:": "DHT种子:",
+ "Peers:": "节点:",
+ "Peer List Size:": "节点列表大小:",
+ "Active Requests:": "活动请求:",
+ "Download:": "下载:",
+ "Upload:": "上传:",
+ "DHT Download:": "DHT下载:",
+ "DHT Upload:": "DHT上传:",
+ "IP Overhead Download:": "IP层开销下载:",
+ "IP Overhead Upload:": "IP层开销上传:",
+ "Payload Download:": "有效载荷下载:",
+ "Payload Upload:": "有效载荷上传:",
};
}
@@ -1256,7 +1286,7 @@ if(preferredLanguage == "nl"){
"You have to log in to use direct messages.": "You have to log in to use direct messages.",
"You have to log in to follow users.": "You have to log in to follow users.",
"You are not following anyone because you are not logged in.": "You are not following anyone because you are not logged in.",
- "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
+ "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
"No one can mention you because you are not logged in.": "No one can mention you because you are not logged in.",
"You don't have any profile because you are not logged in.": "You don't have any profile because you are not logged in.",
"Options": "Options",
@@ -1520,7 +1550,7 @@ if(preferredLanguage == "it"){
"You have to log in to use direct messages.": "You have to log in to use direct messages.",
"You have to log in to follow users.": "You have to log in to follow users.",
"You are not following anyone because you are not logged in.": "You are not following anyone because you are not logged in.",
- "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
+ "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
"No one can mention you because you are not logged in.": "No one can mention you because you are not logged in.",
"You don't have any profile because you are not logged in.": "You don't have any profile because you are not logged in.",
"Options": "Options",
@@ -1788,7 +1818,7 @@ if(preferredLanguage == "fr"){
"You have to log in to use direct messages.": "You have to log in to use direct messages.",
"You have to log in to follow users.": "You have to log in to follow users.",
"You are not following anyone because you are not logged in.": "You are not following anyone because you are not logged in.",
- "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
+ "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
"No one can mention you because you are not logged in.": "No one can mention you because you are not logged in.",
"You don't have any profile because you are not logged in.": "You don't have any profile because you are not logged in.",
"Options": "Options",
@@ -1924,13 +1954,13 @@ if(preferredLanguage == "ru"){
"Detailed information": "Подробная информация",
"DHT network down.": "Недоступна DHT сеть.",
"Direct Messages": "Личные сообщения",
- "Disable": "Отключено",
+ "Disable": "Вимкнено",
"Display mentions to @": "Показать ответы для @",
"Display retransmissions": "Показать репосты",
"DNS to obtain list of peers:": "DNS адрес для получения пиров:",
"downloading_block_chain": "Загрузка цепочки блоков, пожалуйста подождите, (Цепочка блоков устарела на %{days} дней).",
"download_posts_status": "Загружено %{portion} постов", // Downloaded 10/30 posts
- "Enable": "Включено",
+ "Enable": "Увімкнено",
"error": "Ошибка: %{error}",
"error_connecting_to_daemon": "Ошибка подключения к локальному демону twisterd.",
"Error in 'createwalletuser' RPC.": "Ошибка при обращении к RPC - при попытке выполнить 'createwalletuser'.",
@@ -2001,7 +2031,7 @@ if(preferredLanguage == "ru"){
"send": "отправить",
"Send post with username": "Отправить сообщение от имени",
"Sent Direct Message": "Отправить личное сообщение",
- "Sent Post to @": "Отправить сообщение для @",
+ "Sent Post to @": "Отправить сообщение для @",
"Setup account": "Настроить аккаунт",
"switch_to_network": "Локальный демон не подключен к сети или\n" +
"цепочка блоков устарела. Если вы останетесь на этой странице\n" +
@@ -2329,7 +2359,7 @@ if(preferredLanguage == "de"){
"You have to log in to use direct messages.": "You have to log in to use direct messages.",
"You have to log in to follow users.": "You have to log in to follow users.",
"You are not following anyone because you are not logged in.": "You are not following anyone because you are not logged in.",
- "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
+ "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
"No one can mention you because you are not logged in.": "No one can mention you because you are not logged in.",
"You don't have any profile because you are not logged in.": "You don't have any profile because you are not logged in.",
"Options": "Einstellungen",
@@ -2594,7 +2624,7 @@ if(preferredLanguage == "ja"){
"You have to log in to use direct messages.": "You have to log in to use direct messages.",
"You have to log in to follow users.": "You have to log in to follow users.",
"You are not following anyone because you are not logged in.": "You are not following anyone because you are not logged in.",
- "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
+ "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
"No one can mention you because you are not logged in.": "No one can mention you because you are not logged in.",
"You don't have any profile because you are not logged in.": "You don't have any profile because you are not logged in.",
"Options": "Options",
@@ -2864,7 +2894,7 @@ if(preferredLanguage == "pt-BR"){
"You have to log in to use direct messages.": "You have to log in to use direct messages.",
"You have to log in to follow users.": "You have to log in to follow users.",
"You are not following anyone because you are not logged in.": "You are not following anyone because you are not logged in.",
- "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
+ "You don't have any followers because you are not logged in.": "You don't have any followers because you are not logged in.",
"No one can mention you because you are not logged in.": "No one can mention you because you are not logged in.",
"You don't have any profile because you are not logged in.": "You don't have any profile because you are not logged in.",
"Options": "Options",
@@ -3249,7 +3279,7 @@ if(preferredLanguage == "cs"){
"ajax_error": "Ajax chyba: %{error}", // JavaScript error
"All users publicly followed by": "Všichni uživatelé, které veřejně sleduje",
"Available": "Je volná", // username is available
- "Appearance": "Appearance",
+ "Appearance": "Vzhled",
"Block chain information": "Informace o blockchainu",
"Block chain is up-to-date, twister is ready to use!": "Blockchain je aktuální, twister je připraven k použití!",
"Block generation": "Generování bloků ",
@@ -3280,8 +3310,8 @@ if(preferredLanguage == "cs"){
"Favorite": "Přidat k oblíbeným",
"File APIs not supported in this browser.": "Upozornění: váš webový prohlížeč nepodporuje File API.",
"Follow": "Sledovat",
- "Following config": "Following config",
- "Which way do you want to follow": "Which way do you want to follow",
+ "Following config": "Nastavení sledování",
+ "Which way do you want to follow": "Zvolte způsob sledování",
"Followed by": "tohoto uživatele sleduje",
"followed_by": "Uživatelé, které sleduje %{username}",
"Followers": "Sledující",
@@ -3303,19 +3333,19 @@ if(preferredLanguage == "cs"){
"Network status": "Stav sítě",
"New direct message...": "Nová přímá zpráva...",
"New Post...": "Nový příspěvek...",
- "You got": "You got",
- "in postboard": "in postboard",
- "in search result": "in search result",
- "in top trends": "in top trends",
+ "You got": "Máte",
+ "in postboard": "na nástěnce",
+ "in search result": "ve výsledcích hledání",
+ "in top trends": "v hlavních trendech",
"new_posts": "%{smart_count} nový příspěvek |||| %{smart_count} nové příspěvky |||| %{smart_count} nových příspěvků",
- "new_mentions": "%{smart_count} new mention |||| %{smart_count} new mentions",
- "new_direct_messages": "%{smart_count} new direct message |||| %{smart_count} new direct messages",
+ "new_mentions": "%{smart_count} novou zmínku |||| %{smart_count} nové zmínky |||| %{smart_count} nových zmínek",
+ "new_direct_messages": "%{smart_count} novou přímou zprávu |||| %{smart_count} nové přímé zprávy |||| %{smart_count} nových přímých zpráv",
"nobody": "nikdo", // used to promote a post without attaching the user
"Not available": "Tuto přezdívku již někdo používá", // username is not available
- "notify_desktop_error": "Twister cannot perform desktop notification: unknown error occured.",
- "notify_desktop_perm_denied": "Twister cannot perform desktop notification: permission denied.\n\nIf you want to get notifications, allow them for %{this_domain} in settings of your browser.",
- "notify_desktop_test": "All the twisters gonna twist.\nNow you are welcome too.",
- "notify_desktop_title": "Watch out, it's twister over here!",
+ "notify_desktop_error": "Twisteru se nepodařilo zobrazit upozornění na ploše: došlo k neznámé chybě.",
+ "notify_desktop_perm_denied": "Twisteru se nepodařilo zobrazit upozornění na ploše: přístup byl odepřen.\n\nPokud chcete používat upozornění na ploše, povolte je pro %{this_domain} v nastavení vašeho prohlížeče.",
+ "notify_desktop_test": "Twister to umí pořádně roztočit.\nKaždý je tu vítán.",
+ "notify_desktop_title": "Twister",
"Number of blocks in block chain:": "Počet bloků v blockchainu: ",
"Number of CPUs to use": "Kolik jader procesoru použít? ",
"Only alphanumeric and underscore allowed.": "Povolena jsou jen písmena, čísla a podtržítko.",
@@ -3353,7 +3383,7 @@ if(preferredLanguage == "cs"){
"Type message here": "Sem napište příspěvek",
"Unfollow": "Přestat sledovat",
"Update": "Aktualizovat",
- "Auto updating": "Auto updating",
+ "Auto updating": "Automatická aktualizace",
"Updating status...": "Aktualizuji stav...", // status of block chain
"user_not_yet_accepted": "Ostatní uzly ještě nepřijaly tohoto nového uživatele.\n" +
"Proto zatím není možné uložit profil nebo vkládat příspěvky.\n" +
@@ -3395,7 +3425,7 @@ if(preferredLanguage == "cs"){
"You have to log in to use direct messages.": "Pro používání přímých zpráv je třeba se přihlásit.",
"You have to log in to follow users.": "Pro sledování jiných uživatelů je třeba se přihlásit.",
"You are not following anyone because you are not logged in.": "Nikoho nesledujete, protože nejste přihlášen(a).",
- "You don't have any followers because you are not logged in.": "Nikdo vás nesleduje, protože nejste přihlášen(a).",
+ "You don't have any followers because you are not logged in.": "Nikdo vás nesleduje, protože nejste přihlášen(a).",
"No one can mention you because you are not logged in.": "Nikdo se o vás nemůže zmínit, protože nejste přihlášen(a).",
"You don't have any profile because you are not logged in.": "Nemáte žádný profil, protože nejste přihlášen(a).",
"Options": "Možnosti",
@@ -3409,7 +3439,7 @@ if(preferredLanguage == "cs"){
"Desktop notifications": "Upozornění na ploše",
"Sound notifications": "Zvuková upozornění",
"Volume": "Hlasitost",
- "Test": "Pokus",
+ "Test": "Zkouška",
"Send key": "Klávesa pro odeslání",
"Posts display": "Zobrazení příspěvků",
"Post editor": "Editor příspěvků",
@@ -3446,29 +3476,29 @@ if(preferredLanguage == "cs"){
"RTs those are close to original twist": "Přeposlání blízká původnímu příspěvku",
"Show if the original is older than": "Ukázat pokud je už originál starší než",
"hour(s)": "hodin",
- "second(s)": "vteřinou(ami)",
- "only positive numbers!": "povolena jsou jen čísla!",
- "Language filtering": "Language filtering",
- "By blacklist": "By blacklist",
- "By whitelist": "By whitelist",
- "Comma separated ISO 639-3 language codes": "Comma separated ISO 639-3 language codes",
- "Accuracy": "Accuracy",
- "Simulation mode": "Simulation mode",
- "This post is treated by language filter": "This post is %{treated} by language filter.",
- "blocked": "blocked",
- "passed": "passed",
- "not analyzed": "not analyzed",
- "Reason: this": "Reason: %{this}",
- "this doesnt contain that": "%{this} does not contain %{that}",
- "this is undefined": "%{this} is undefined",
- "blacklist": "blacklist",
- "whitelist": "whitelist",
- "language of this": "language of this",
- "its undefined language": "it is undefined language",
- "its this, blacklisted": "it is %{this}, blacklisted",
- "its this, whitelisted": "it is %{this}, whitelisted",
- "Most possible language: this": "Most possible language: %{this}",
- "Scope of usage": "Scope of usage",
+ "second(s)": "vteřin",
+ "only positive numbers!": "povolena jsou jen kladná čísla!",
+ "Language filtering": "Filtrování jazyků",
+ "By blacklist": "Černá listina",
+ "By whitelist": "Bílá listina",
+ "Comma separated ISO 639-3 language codes": "Kódy jazyků ve formátu ISO 639-3, oddělené čárkami",
+ "Accuracy": "Přesnost",
+ "Simulation mode": "Režim simulace",
+ "This post is treated by language filter": "Tento příspěvek %{treated} jazykovým filtrem.",
+ "blocked": "byl zablokován",
+ "passed": "prošel",
+ "not analyzed": "nebyl analyzován",
+ "Reason: this": "Důvod: %{this}",
+ "this doesnt contain that": "%{this} neobsahuje %{that}",
+ "this is undefined": "%{this} není definována",
+ "blacklist": "černá listina",
+ "whitelist": "bílá listina",
+ "language of this": "tento jazyk",
+ "its undefined language": "jazyk nelze určit",
+ "its this, blacklisted": "jazyk %{this} je na černé listině",
+ "its this, whitelisted": "jazyk %{this} je na bílé listině",
+ "Most possible language: this": "Nejpravděpodobnější jazyk: %{this}",
+ "Scope of usage": "Rozsah použití",
"Show with every user name": "Ukázat u každé přezdívky",
"Show at profile modal only": "Ukázat jen v okně profilu",
"Show if a user follows me": "Ukazovat, zda mně uživatel sleduje",
@@ -3501,6 +3531,22 @@ if(preferredLanguage == "cs"){
"Sound": "Zvuky",
"Users": "Uživatelé",
"Direct Message's copy to self": "Posílat kopie přímých zpráv sám sobě",
+ "New post": "Nový příspěvek",
+ "Search": "Hledat",
+ "Direct Msg": "Přímá zpráva",
+ "Traffic information": "Informace o provozu na síti",
+ "DHT Torrents:": "DHT Torrenty:",
+ "Peers:": "Uzly:",
+ "Peer List Size:": "Velikost seznamu uzlů:",
+ "Active Requests:": "Aktivní požadavky:",
+ "Download:": "Stahování:",
+ "Upload:": "Odesílání:",
+ "DHT Download:": "DHT - stahování:",
+ "DHT Upload:": "DHT - odesílání:",
+ "IP Overhead Download:": "IP Overhead - stahování:",
+ "IP Overhead Upload:": "IP Overhead - odesílání:",
+ "Payload Download:": "Data aplikace - stahování:",
+ "Payload Upload:": "Data aplikace - odesílání:",
};
}
@@ -3524,7 +3570,7 @@ var fixedLabels = [
"button",
".postboard-news",
".post-area-new textarea",
- ".refresh-users, .view-all-users",
+ ".refresh-toptrends, .refresh-users, .view-all-users",
".who-to-follow h3",
".userMenu-search-field",
"a.dropdown-menu-item, a.direct-messages",
diff --git a/js/jQueryPlugins.js b/js/jQueryPlugins.js
index 205ab12..7601966 100644
--- a/js/jQueryPlugins.js
+++ b/js/jQueryPlugins.js
@@ -11,4 +11,84 @@
});
return $(this);
}
-})(jQuery);
\ No newline at end of file
+})(jQuery);
+
+(function($) {
+ $.fn.caret = function(pos) {
+ var target = this[0];
+ var isContentEditable = target.contentEditable === 'true';
+ //get
+ if (arguments.length == 0) {
+ //HTML5
+ if (window.getSelection) {
+ //contenteditable
+ if (isContentEditable) {
+ target.focus();
+ var range1 = window.getSelection().getRangeAt(0),
+ range2 = range1.cloneRange();
+ range2.selectNodeContents(target);
+ range2.setEnd(range1.endContainer, range1.endOffset);
+ return range2.toString().length;
+ }
+ //textarea
+ return target.selectionStart;
+ }
+ //IE<9
+ if (document.selection) {
+ target.focus();
+ //contenteditable
+ if (isContentEditable) {
+ var range1 = document.selection.createRange(),
+ range2 = document.body.createTextRange();
+ range2.moveToElementText(target);
+ range2.setEndPoint('EndToEnd', range1);
+ return range2.text.length;
+ }
+ //textarea
+ var pos = 0,
+ range = target.createTextRange(),
+ range2 = document.selection.createRange().duplicate(),
+ bookmark = range2.getBookmark();
+ range.moveToBookmark(bookmark);
+ while (range.moveStart('character', -1) !== 0) pos++;
+ return pos;
+ }
+ // Addition for jsdom support
+ if (target.selectionStart)
+ return target.selectionStart;
+ //not supported
+ return 0;
+ }
+ //set
+ if (pos == -1)
+ pos = this[isContentEditable? 'text' : 'val']().length;
+ //HTML5
+ if (window.getSelection) {
+ //contenteditable
+ if (isContentEditable) {
+ target.focus();
+ window.getSelection().collapse(target.firstChild, pos);
+ }
+ //textarea
+ else
+ target.setSelectionRange(pos, pos);
+ }
+ //IE<9
+ else if (document.body.createTextRange) {
+ if (isContentEditable) {
+ var range = document.body.createTextRange();
+ range.moveToElementText(target);
+ range.moveStart('character', pos);
+ range.collapse(true);
+ range.select();
+ } else {
+ var range = target.createTextRange();
+ range.move('character', pos);
+ range.select();
+ }
+ }
+ if (!isContentEditable)
+ target.focus();
+ return pos;
+ }
+})(jQuery);
diff --git a/js/options.js b/js/options.js
index 1f7e88e..39246e0 100644
--- a/js/options.js
+++ b/js/options.js
@@ -20,15 +20,15 @@ var TwisterOptions = function()
}
this.soundNotifOptions = function() {
- $('#notifyForm select').each(function(){
- this.value = $.Options.getOption(this.id, "false");
+ $('#notifyForm select').each(function() {
+ this.value = $.Options.getOption(this.id, 'false');
});
var player = $('#player');
player[0].pause();
$('#player').empty();
- $('form#notifyForm').on('change','select',function(){
+ $('form#notifyForm').on('change', 'select', function() {
$.Options.setOption(this.id, this.value);
if(this.value == false) {player[0].pause(); return;}
@@ -46,10 +46,10 @@ var TwisterOptions = function()
this.volumeControl = function() {
var playerVol = $('#playerVol');
- playerVol[0].value = $.Options.getOption(playerVol[0].id, 1);
+ playerVol[0].value = this.getOption(playerVol[0].id, 1);
$('.volValue').text((playerVol[0].value * 100).toFixed());
- playerVol.on('change',function(){
+ playerVol.on('change', function() {
$.Options.setOption(this.id, this.value);
$('#player')[0].volume = (this.value);
$('.volValue').text((this.value * 100).toFixed());
@@ -57,8 +57,8 @@ var TwisterOptions = function()
}
this.DMsNotif = function() {
- var sndDM = $.Options.getOption('sndDM', "false");
- if( sndDM == "false") return;
+ var sndDM = this.getOption('sndDM', 'false');
+ if ( sndDM === 'false') return;
var player = $('#player');
$('#player').empty();
@@ -69,13 +69,13 @@ var TwisterOptions = function()
player.attr('type', 'audio/ogg');
player.attr('src', 'sound/'+sndDM+'.ogg');
}
- player[0].volume = $.Options.getOption('playerVol',1);
+ player[0].volume = this.getOption('playerVol',1);
player[0].play();
}
this.mensNotif = function() {
- var sndMention = $.Options.getOption('sndMention', "false");
- if(sndMention == "false") return;
+ var sndMention = this.getOption('sndMention', 'false');
+ if (sndMention === 'false') return;
var player = $('#playerSec');
$('#playerSec').empty();
@@ -86,23 +86,22 @@ var TwisterOptions = function()
player.attr('type', 'audio/ogg');
player.attr('src', 'sound/'+sndMention+'.ogg');
}
- player[0].volume = $.Options.getOption('playerVol',1);
+ player[0].volume = this.getOption('playerVol',1);
player[0].play();
}
this.getShowDesktopNotifPostsOpt = function() {
- return $.Options.getOption('showDesktopNotifPosts','enable');
+ return this.getOption('showDesktopNotifPosts', 'enable');
}
this.setShowDesktopNotifPostsOpt = function () {
function showDesktopNotifPostsDesc() {
- if ($.Options.getShowDesktopNotifPostsOpt() === 'enable') {
- $('#showDesktopNotifPostsDesc')[0].style.display= 'inline';
- } else {
- $('#showDesktopNotifPostsDesc')[0].style.display= 'none';
- }
+ if ($.Options.getShowDesktopNotifPostsOpt() === 'enable')
+ $('#showDesktopNotifPostsDesc').css('display', 'inline');
+ else
+ $('#showDesktopNotifPostsDesc').css('display', 'none');
}
- $('#showDesktopNotifPosts').val(this.getShowDesktopNotifPostsOpt());
+ $('#showDesktopNotifPosts').val( this.getShowDesktopNotifPostsOpt() );
showDesktopNotifPostsDesc();
$('#showDesktopNotifPosts').on('change', function() {
$.Options.setOption(this.id, this.value);
@@ -111,28 +110,26 @@ var TwisterOptions = function()
}
this.getShowDesktopNotifPostsTimerOpt = function () {
- return parseInt($.Options.getOption('showDesktopNotifPostsTimer', '6'));
+ return parseInt(this.getOption('showDesktopNotifPostsTimer', '6'));
}
this.setShowDesktopNotifPostsTimerOpt = function () {
- $('#showDesktopNotifPostsTimer')[0].value = this.getShowDesktopNotifPostsTimerOpt().toString();
-
- $('#showDesktopNotifPostsTimer').on('keyup', function () {setElemValNumeric(this, polyglot.t('second(s)'));});
+ $('#showDesktopNotifPostsTimer').val( this.getShowDesktopNotifPostsTimerOpt().toString() );
+ $('#showDesktopNotifPostsTimer').on('keyup', function () { setElemValNumeric(this, polyglot.t('second(s)')); });
}
this.getShowDesktopNotifPostsModalOpt = function() {
- return $.Options.getOption('showDesktopNotifPostsModal','enable');
+ return this.getOption('showDesktopNotifPostsModal', 'enable');
}
this.setShowDesktopNotifPostsModalOpt = function () {
function showDesktopNotifPostsModalDesc() {
- if ($.Options.getShowDesktopNotifPostsModalOpt() === 'enable') {
- $('#showDesktopNotifPostsModalDesc')[0].style.display= 'inline';
- } else {
- $('#showDesktopNotifPostsModalDesc')[0].style.display= 'none';
- }
+ if ($.Options.getShowDesktopNotifPostsModalOpt() === 'enable')
+ $('#showDesktopNotifPostsModalDesc').css('display', 'inline');
+ else
+ $('#showDesktopNotifPostsModalDesc').css('display', 'none');
}
- $('#showDesktopNotifPostsModal').val(this.getShowDesktopNotifPostsModalOpt());
+ $('#showDesktopNotifPostsModal').val( this.getShowDesktopNotifPostsModalOpt() );
showDesktopNotifPostsModalDesc();
$('#showDesktopNotifPostsModal').on('change', function() {
$.Options.setOption(this.id, this.value);
@@ -141,28 +138,26 @@ var TwisterOptions = function()
}
this.getShowDesktopNotifPostsModalTimerOpt = function () {
- return parseInt($.Options.getOption('showDesktopNotifPostsModalTimer', '6'));
+ return parseInt(this.getOption('showDesktopNotifPostsModalTimer', '6'));
}
this.setShowDesktopNotifPostsModalTimerOpt = function () {
- $('#showDesktopNotifPostsModalTimer')[0].value = this.getShowDesktopNotifPostsModalTimerOpt().toString();
-
- $('#showDesktopNotifPostsModalTimer').on('keyup', function () {setElemValNumeric(this, polyglot.t('second(s)'));});
+ $('#showDesktopNotifPostsModalTimer').val( this.getShowDesktopNotifPostsModalTimerOpt().toString() );
+ $('#showDesktopNotifPostsModalTimer').on('keyup', function () { setElemValNumeric(this, polyglot.t('second(s)')); });
}
this.getShowDesktopNotifMentionsOpt = function() {
- return $.Options.getOption('showDesktopNotifMentions','enable');
+ return this.getOption('showDesktopNotifMentions', 'enable');
}
this.setShowDesktopNotifMentionsOpt = function () {
function showDesktopNotifMentionsDesc() {
- if ($.Options.getShowDesktopNotifMentionsOpt() === 'enable') {
- $('#showDesktopNotifMentionsDesc')[0].style.display= 'inline';
- } else {
- $('#showDesktopNotifMentionsDesc')[0].style.display= 'none';
- }
+ if ($.Options.getShowDesktopNotifMentionsOpt() === 'enable')
+ $('#showDesktopNotifMentionsDesc').css('display', 'inline');
+ else
+ $('#showDesktopNotifMentionsDesc').css('display', 'none');
}
- $('#showDesktopNotifMentions').val(this.getShowDesktopNotifMentionsOpt());
+ $('#showDesktopNotifMentions').val( this.getShowDesktopNotifMentionsOpt() );
showDesktopNotifMentionsDesc();
$('#showDesktopNotifMentions').on('change', function() {
$.Options.setOption(this.id, this.value);
@@ -171,28 +166,26 @@ var TwisterOptions = function()
}
this.getShowDesktopNotifMentionsTimerOpt = function () {
- return parseInt($.Options.getOption('showDesktopNotifMentionsTimer', '60'));
+ return parseInt(this.getOption('showDesktopNotifMentionsTimer', '60'));
}
this.setShowDesktopNotifMentionsTimerOpt = function () {
- $('#showDesktopNotifMentionsTimer')[0].value = this.getShowDesktopNotifMentionsTimerOpt().toString();
-
+ $('#showDesktopNotifMentionsTimer').val( this.getShowDesktopNotifMentionsTimerOpt().toString() );
$('#showDesktopNotifMentionsTimer').on('keyup', function () {setElemValNumeric(this, polyglot.t('second(s)'));});
}
this.getShowDesktopNotifDMsOpt = function() {
- return $.Options.getOption('showDesktopNotifDMs','enable');
+ return this.getOption('showDesktopNotifDMs', 'enable');
}
this.setShowDesktopNotifDMsOpt = function () {
function showDesktopNotifDMsDesc() {
- if ($.Options.getShowDesktopNotifDMsOpt() === 'enable') {
- $('#showDesktopNotifDMsDesc')[0].style.display= 'inline';
- } else {
- $('#showDesktopNotifDMsDesc')[0].style.display= 'none';
- }
+ if ($.Options.getShowDesktopNotifDMsOpt() === 'enable')
+ $('#showDesktopNotifDMsDesc').css('display', 'inline');
+ else
+ $('#showDesktopNotifDMsDesc').css('display', 'none');
}
- $('#showDesktopNotifDMs').val(this.getShowDesktopNotifDMsOpt());
+ $('#showDesktopNotifDMs').val( this.getShowDesktopNotifDMsOpt() );
showDesktopNotifDMsDesc();
$('#showDesktopNotifDMs').on('change', function() {
$.Options.setOption(this.id, this.value);
@@ -201,13 +194,12 @@ var TwisterOptions = function()
}
this.getShowDesktopNotifDMsTimerOpt = function () {
- return parseInt($.Options.getOption('showDesktopNotifDMsTimer', '60'));
+ return parseInt(this.getOption('showDesktopNotifDMsTimer', '60'));
}
this.setShowDesktopNotifDMsTimerOpt = function () {
- $('#showDesktopNotifDMsTimer')[0].value = this.getShowDesktopNotifDMsTimerOpt().toString();
-
- $('#showDesktopNotifDMsTimer').on('keyup', function () {setElemValNumeric(this, polyglot.t('second(s)'));});
+ $('#showDesktopNotifDMsTimer').val( this.getShowDesktopNotifDMsTimerOpt().toString() );
+ $('#showDesktopNotifDMsTimer').on('keyup', function () { setElemValNumeric(this, polyglot.t('second(s)')); });
}
this.setTestDesktopNotif = function() {
@@ -216,159 +208,156 @@ var TwisterOptions = function()
})
}
- this.keysSendDefault = "ctrlenter";
+ this.keysSendDefault = 'ctrlenter';
this.keysSend = function() {
- $('#keysOpt select')[0].value = $.Options.getOption('keysSend',this.keysSendDefault);
-
- $('#keysOpt select').on('change', function(){
- $.Options.setOption(this.id, this.value);
- })
+ $('#keysOpt select').val( this.getOption('keysSend',this.keysSendDefault) );
+ $('#keysOpt select').on('change', function() { $.Options.setOption(this.id, this.value); });
}
this.keyEnterToSend = function() {
- return $.Options.getOption('keysSend',this.keysSendDefault) == "enter";
+ return this.getOption('keysSend', this.keysSendDefault) === 'enter';
}
this.setLang = function() {
- $('#language').val($.Options.getOption('locLang','auto'))
- $('#language').on('change', function(){
+ $('#language').val( this.getOption('locLang', 'auto') );
+ $('#language').on('change', function() {
$.Options.setOption('locLang', $(this).val());
+ if($(this).val() != 'auto') {
+ twisterRpc("setpreferredspamlang", [$(this).val()]);
+ }
location.reload();
})
}
this.getTheme = function() {
- return $.Options.getOption('theme','original');
+ return this.getOption('theme', 'original');
}
this.setTheme = function() {
- $('#theme').val(this.getTheme())
- $('#theme').on('change', function(){
+ $('#theme').val( this.getTheme() )
+ $('#theme').on('change', function() {
$.Options.setOption('theme', $(this).val());
location.reload();
});
}
this.getLineFeedsOpt = function() {
- return $.Options.getOption('displayLineFeeds',"disable");
+ return this.getOption('displayLineFeeds', 'disable');
}
this.setLineFeedsOpt = function() {
- $('#lineFeedsOpt select')[0].value = this.getLineFeedsOpt();
-
- $('#lineFeedsOpt select').on('change', function(){
- $.Options.setOption(this.id, this.value);
- })
+ $('#lineFeedsOpt select').val( this.getLineFeedsOpt() );
+ $('#lineFeedsOpt select').on('change', function() { $.Options.setOption(this.id, this.value); });
}
this.getShowPreviewOpt = function() {
- return $.Options.getOption('displayPreview',"disable");
+ return this.getOption('displayPreview', 'disable');
}
this.setShowPreviewOpt = function () {
- $('#showPreviewOpt select')[0].value = this.getShowPreviewOpt();
-
- $('#showPreviewOpt select').on('change', function(){
- $.Options.setOption(this.id, this.value);
- });
+ $('#showPreviewOpt select').val( this.getShowPreviewOpt() );
+ $('#showPreviewOpt select').on('change', function() { $.Options.setOption(this.id, this.value); });
}
this.getUnicodeConversionOpt = function () {
- return $.Options.getOption('unicodeConversion', "disable");
+ return this.getOption('unicodeConversion', 'disable');
}
this.setUnicodeConversionOpt = function () {
- $("#unicodeConversion")[0].value = this.getUnicodeConversionOpt();
+ $('#unicodeConversion').val( this.getUnicodeConversionOpt() );
- if (this.getUnicodeConversionOpt() === "custom")
- $("#unicodeConversionOpt .suboptions")[0].style.height = "230px";
+ if (this.getUnicodeConversionOpt() === 'custom')
+ $('#unicodeConversionOpt .suboptions').css('height', 'auto');
- $("#unicodeConversion").on('change', function () {
+ $('#unicodeConversion').on('change', function () {
$.Options.setOption(this.id, this.value);
- if (this.value === "custom")
- $("#unicodeConversionOpt .suboptions")[0].style.height = "230px";
+ if (this.value === 'custom')
+ $('#unicodeConversionOpt .suboptions').css('height', 'auto');
else
- $("#unicodeConversionOpt .suboptions")[0].style.height = "0px";
+ $('#unicodeConversionOpt .suboptions').css('height', '0px');
});
}
this.getConvertPunctuationsOpt = function() {
- return $.Options.getOption('convertPunctuationsOpt', false);
+ return this.getOption('convertPunctuationsOpt', false);
}
this.setConvertPunctuationsOpt = function () {
- $('#convertPunctuationsOpt')[0].checked = this.getConvertPunctuationsOpt();
-
- $('#convertPunctuationsOpt').on('change', function(){
- $.Options.setOption(this.id, this.checked);
- });
+ $('#convertPunctuationsOpt').prop('checked', this.getConvertPunctuationsOpt());
+ $('#convertPunctuationsOpt').on('change', function() { $.Options.setOption(this.id, this.checked); });
}
this.getConvertEmotionsOpt = function() {
- return $.Options.getOption('convertEmotionsOpt', false);
+ return this.getOption('convertEmotionsOpt', false);
}
this.setConvertEmotionsOpt = function () {
- $('#convertEmotionsOpt')[0].checked = this.getConvertEmotionsOpt();
-
- $('#convertEmotionsOpt').on('change', function(){
- $.Options.setOption(this.id, this.checked);
- });
+ $('#convertEmotionsOpt').prop('checked', this.getConvertEmotionsOpt());
+ $('#convertEmotionsOpt').on('change', function() { $.Options.setOption(this.id, this.checked); });
}
this.getConvertSignsOpt = function() {
- return $.Options.getOption('convertSignsOpt', false);
+ return this.getOption('convertSignsOpt', false);
}
this.setConvertSignsOpt = function () {
- $('#convertSignsOpt')[0].checked = this.getConvertSignsOpt();
-
- $('#convertSignsOpt').on('change', function(){
- $.Options.setOption(this.id, this.checked);
- });
+ $('#convertSignsOpt').prop('checked', this.getConvertSignsOpt());
+ $('#convertSignsOpt').on('change', function() { $.Options.setOption(this.id, this.checked); });
}
this.getConvertFractionsOpt = function() {
- return $.Options.getOption('convertFractionsOpt', false);
+ return this.getOption('convertFractionsOpt', false);
}
this.setConvertFractionsOpt = function () {
- $('#convertFractionsOpt')[0].checked = this.getConvertFractionsOpt();
-
- $('#convertFractionsOpt').on('change', function(){
- $.Options.setOption(this.id, this.checked);
- });
+ $('#convertFractionsOpt').prop('checked', this.getConvertFractionsOpt());
+ $('#convertFractionsOpt').on('change', function() { $.Options.setOption(this.id, this.checked); });
}
this.getUseProxyOpt = function () {
- return $.Options.getOption('useProxy', 'disable');
+ return this.getOption('useProxy', 'disable');
}
this.setUseProxyOpt = function () {
- $('#useProxy')[0].value = this.getUseProxyOpt();
+ $('#useProxy').val( this.getUseProxyOpt() );
if (this.getUseProxyOpt() === 'disable')
- $('#useProxyForImgOnly').attr('disabled','disabled');
+ $('#useProxyForImgOnly').attr('disabled', 'disabled');
$('#useProxy').on('change', function () {
$.Options.setOption(this.id, this.value);
-
if (this.value === 'disable')
- $('#useProxyForImgOnly').attr('disabled','disabled');
+ $('#useProxyForImgOnly').attr('disabled', 'disabled');
else
$('#useProxyForImgOnly').removeAttr('disabled');
});
}
this.getUseProxyForImgOnlyOpt = function () {
- return $.Options.getOption('useProxyForImgOnly', false);
+ return this.getOption('useProxyForImgOnly', false);
}
this.setUseProxyForImgOnlyOpt = function () {
- $('#useProxyForImgOnly')[0].checked = this.getUseProxyForImgOnlyOpt();
+ $('#useProxyForImgOnly').prop('checked', this.getUseProxyForImgOnlyOpt());
+ $('#useProxyForImgOnly').on('change', function () { $.Options.setOption(this.id, this.checked); });
+ }
+
+ this.getTopTrendsOpt = function() {
+ return this.getOption('TopTrends', 'enable');
+ }
- $('#useProxyForImgOnly').on('change', function () {
- $.Options.setOption(this.id, this.checked);
+ this.setTopTrendsOpt = function () {
+ function TopTrendsCfg() {
+ if ($.Options.getTopTrendsOpt() === 'enable')
+ $('#TopTrendsCont').show();
+ else
+ $('#TopTrendsCont').hide();
+ }
+ $('#TopTrends').val( this.getTopTrendsOpt() );
+ TopTrendsCfg();
+ $('#TopTrends').on('change', function() {
+ $.Options.setOption(this.id, this.value);
+ TopTrendsCfg();
});
}
@@ -378,13 +367,12 @@ var TwisterOptions = function()
this.setTopTrendsAutoUpdateOpt = function () {
function TopTrendsAutoUpdateCfg() {
- if ($.Options.getTopTrendsAutoUpdateOpt() === 'enable') {
- $('#TopTrendsAutoUpdateOpt')[0].style.display= 'inline';
- } else {
- $('#TopTrendsAutoUpdateOpt')[0].style.display= 'none';
- }
+ if ($.Options.getTopTrendsAutoUpdateOpt() === 'enable')
+ $('#TopTrendsAutoUpdateOpt').css('display', 'inline');
+ else
+ $('#TopTrendsAutoUpdateOpt').css('display', 'none');
}
- $('#TopTrendsAutoUpdate').val(this.getTopTrendsAutoUpdateOpt());
+ $('#TopTrendsAutoUpdate').val( this.getTopTrendsAutoUpdateOpt() );
TopTrendsAutoUpdateCfg();
$('#TopTrendsAutoUpdate').on('change', function() {
$.Options.setOption(this.id, this.value);
@@ -397,86 +385,77 @@ var TwisterOptions = function()
}
this.setTopTrendsAutoUpdateTimerOpt = function () {
- $('#TopTrendsAutoUpdateTimer')[0].value = this.getTopTrendsAutoUpdateTimerOpt().toString();
+ $('#TopTrendsAutoUpdateTimer').val( this.getTopTrendsAutoUpdateTimerOpt().toString() );
+ $('#TopTrendsAutoUpdateTimer').on('keyup', function () { setElemValNumeric(this, polyglot.t('second(s)')); });
+ }
- $('#TopTrendsAutoUpdateTimer').on('keyup', function () {setElemValNumeric(this, polyglot.t('second(s)'));});
+ this.getWhoToFollowOpt = function() {
+ return this.getOption('WhoToFollow', 'enable');
}
- this.getSplitPostsOpt = function (){
- return $.Options.getOption('splitPosts', 'disable');
+ this.setWhoToFollowOpt = function () {
+ $('#WhoToFollow').val(this.getWhoToFollowOpt());
+ $('#WhoToFollow').on('change', function() { $.Options.setOption(this.id, this.value); });
}
- this.setSplitPostsOpt = function () {
- $('#splitPosts')[0].value = this.getSplitPostsOpt();
+ this.getSplitPostsOpt = function () {
+ return this.getOption('splitPosts', 'disable');
+ }
- $('#splitPosts').on('change', function () {
- $.Options.setOption(this.id, this.value);
- });
+ this.setSplitPostsOpt = function () {
+ $('#splitPosts').val( this.getSplitPostsOpt() );
+ $('#splitPosts').on('change', function () { $.Options.setOption(this.id, this.value); });
}
this.getHideRepliesOpt = function () {
- return $.Options.getOption('hideReplies', 'following');
+ return this.getOption('hideReplies', 'following');
}
this.setHideRepliesOpt = function () {
- $('#hideReplies')[0].value = this.getHideRepliesOpt();
-
- $('#hideReplies').on('change', function () {
- $.Options.setOption(this.id, this.value);
- });
+ $('#hideReplies').val( this.getHideRepliesOpt() );
+ $('#hideReplies').on('change', function () { $.Options.setOption(this.id, this.value); });
}
this.getHideCloseRTsOpt = function () {
- return $.Options.getOption('hideCloseRTs', 'disable');
+ return this.getOption('hideCloseRTs', 'disable');
};
this.setHideCloseRTsOpt = function () {
- $('#hideCloseRTs')[0].value = this.getHideCloseRTsOpt();
-
- if (this.getHideCloseRTsOpt() === 'disable') {
- $('#hideCloseRTsDesc')[0].style.display = 'none';
- } else {
- $('#hideCloseRTsDesc')[0].style.display = 'inline';
+ function hideCloseRTsCfg() {
+ if ($.Options.getHideCloseRTsOpt() === 'disable')
+ $('#hideCloseRTsDesc').css('display', 'none');
+ else
+ $('#hideCloseRTsDesc').css('display', 'inline');
}
-
+ $('#hideCloseRTs').val( this.getHideCloseRTsOpt() );
+ hideCloseRTsCfg();
$('#hideCloseRTs').on('change', function () {
$.Options.setOption(this.id, this.value);
-
- if (this.value === 'disable') {
- $('#hideCloseRTsDesc')[0].style.display = 'none';
- } else {
- $('#hideCloseRTsDesc')[0].style.display = 'inline';
- }
+ hideCloseRTsCfg();
});
};
this.getHideCloseRTsHourOpt = function () {
- return parseInt($.Options.getOption('hideCloseRtsHour', '1'));
+ return parseInt(this.getOption('hideCloseRtsHour', '1'));
};
this.setHideCloseRTsHourOpt = function () {
- $('#hideCloseRtsHour')[0].value = this.getHideCloseRTsHourOpt().toString();
-
- $('#hideCloseRtsHour').on('keyup', function () {setElemValNumeric(this, polyglot.t('hour(s)'));});
- };
-
- this.getIsFollowingMeOpt = function () {
- return $.Options.getOption('isFollowingMe');
+ $('#hideCloseRtsHour').val( this.getHideCloseRTsHourOpt().toString() );
+ $('#hideCloseRtsHour').on('keyup', function () { setElemValNumeric(this, polyglot.t('hour(s)')); });
};
this.getFilterLangOpt = function() {
- return this.getOption('filterLang','disable');
+ return this.getOption('filterLang', 'disable');
}
this.setFilterLangOpt = function () {
function filterLangListCont() {
- if ( $.Options.getFilterLangOpt() !== 'disable' ) {
- $('#filterLangListCont')[0].style.display= 'block';
- } else {
- $('#filterLangListCont')[0].style.display= 'none';
- }
+ if ( $.Options.getFilterLangOpt() !== 'disable' )
+ $('#filterLangListCont').css('display', 'block');
+ else
+ $('#filterLangListCont').css('display', 'none');
}
- $('#filterLang').val(this.getFilterLangOpt());
+ $('#filterLang').val( this.getFilterLangOpt() );
filterLangListCont();
$('#filterLang').on('change', function() {
$.Options.setOption(this.id, this.value);
@@ -489,9 +468,9 @@ var TwisterOptions = function()
}
this.setFilterLangListOpt = function () {
- $('#filterLangList').val(this.getFilterLangListOpt());
+ $('#filterLangList').val( this.getFilterLangListOpt() );
- $('#filterLangList').on('keyup', function () {$.Options.setOption(this.id, this.value);});
+ $('#filterLangList').on('keyup', function () { $.Options.setOption(this.id, this.value); });
}
this.getFilterLangAccuracyOpt = function () {
@@ -499,8 +478,8 @@ var TwisterOptions = function()
}
this.setFilterLangAccuracyOpt = function () {
- $('#filterLangAccuracy').val(this.getFilterLangAccuracyOpt());
- $('#filterLangAccuracyVal').text(this.getFilterLangAccuracyOpt());
+ $('#filterLangAccuracy').val( this.getFilterLangAccuracyOpt() );
+ $('#filterLangAccuracyVal').text( this.getFilterLangAccuracyOpt() );
$('#filterLangAccuracy').on('change', function () {
$.Options.setOption(this.id, this.value);
$('#filterLangAccuracyVal').text(this.value);
@@ -513,8 +492,7 @@ var TwisterOptions = function()
this.setFilterLangForPostboardOpt = function () {
$('#filterLangForPostboard').prop('checked', this.getFilterLangForPostboardOpt());
-
- $('#filterLangForPostboard').on('click', function () {$.Options.setOption(this.id, this.checked);});
+ $('#filterLangForPostboard').on('click', function () { $.Options.setOption(this.id, this.checked); });
}
this.getFilterLangForSearchingOpt = function () {
@@ -523,8 +501,7 @@ var TwisterOptions = function()
this.setFilterLangForSearchingOpt = function () {
$('#filterLangForSearching').prop('checked', this.getFilterLangForSearchingOpt());
-
- $('#filterLangForSearching').on('click', function () {$.Options.setOption(this.id, this.checked);});
+ $('#filterLangForSearching').on('click', function () { $.Options.setOption(this.id, this.checked); });
}
this.getFilterLangForTopTrendsOpt = function () {
@@ -533,8 +510,7 @@ var TwisterOptions = function()
this.setFilterLangForTopTrendsOpt = function () {
$('#filterLangForTopTrends').prop('checked', this.getFilterLangForTopTrendsOpt());
-
- $('#filterLangForTopTrends').on('click', function () {$.Options.setOption(this.id, this.checked);});
+ $('#filterLangForTopTrends').on('click', function () { $.Options.setOption(this.id, this.checked); });
}
this.getFilterLangSimulateOpt = function () {
@@ -543,28 +519,25 @@ var TwisterOptions = function()
this.setFilterLangSimulateOpt = function () {
$('#filterLangSimulate').prop('checked', this.getFilterLangSimulateOpt());
-
- $('#filterLangSimulate').on('click', function () {$.Options.setOption(this.id, this.checked);});
+ $('#filterLangSimulate').on('click', function () { $.Options.setOption(this.id, this.checked); });
}
- this.setIsFollowingMeOpt = function () {
- $('#isFollowingMe')[0].value = this.getIsFollowingMeOpt();
+ this.getIsFollowingMeOpt = function () {
+ return this.getOption('isFollowingMe', 'in-profile');
+ };
- $('#isFollowingMe').on('change', function () {
- $.Options.setOption(this.id, this.value);
- });
+ this.setIsFollowingMeOpt = function () {
+ $('#isFollowingMe').val( this.getIsFollowingMeOpt() );
+ $('#isFollowingMe').on('change', function () { $.Options.setOption(this.id, this.value); });
};
this.getDMCopySelfOpt = function() {
- return $.Options.getOption('dmCopySelf',"enable");
+ return this.getOption('dmCopySelf', 'enable');
}
this.setDMCopySelfOpt = function () {
- $('#dmCopySelfOpt select')[0].value = this.getDMCopySelfOpt();
-
- $('#dmCopySelfOpt select').on('change', function(){
- $.Options.setOption(this.id, this.value);
- });
+ $('#dmCopySelfOpt select').val( this.getDMCopySelfOpt() );
+ $('#dmCopySelfOpt select').on('change', function() { $.Options.setOption(this.id, this.value); });
}
this.InitOptions = function() {
@@ -592,7 +565,9 @@ var TwisterOptions = function()
this.setUseProxyOpt();
this.setUseProxyForImgOnlyOpt();
this.setTopTrendsAutoUpdateOpt();
+ this.setTopTrendsOpt();
this.setTopTrendsAutoUpdateTimerOpt();
+ this.setWhoToFollowOpt();
this.setSplitPostsOpt();
this.setHideRepliesOpt();
this.setHideCloseRTsHourOpt();
diff --git a/js/twister_following.js b/js/twister_following.js
index 71308c4..6cda347 100644
--- a/js/twister_following.js
+++ b/js/twister_following.js
@@ -441,7 +441,8 @@ function getRandomFollowSuggestion(cbFunc, cbArg) {
var i = parseInt( Math.random() * followingUsers.length );
if ( (i < followingUsers.length && followingUsers[i] == defaultScreenName) ||
- typeof(twisterFollowingO.followingsFollowings[followingUsers[i]]) === 'undefined') {
+ typeof(twisterFollowingO) === 'undefined' ||
+ typeof(twisterFollowingO.followingsFollowings[followingUsers[i]]) === 'undefined') {
setTimeout(function() {getRandomFollowSuggestion(cbFunc, cbArg);}, 500);
return;
@@ -562,7 +563,7 @@ function showFollowingUsers(){
}
function processSuggestion(arg, suggestion, followedBy) {
- var dashboard = $(".follow-suggestions");
+ var dashboard = $('.module.who-to-follow .follow-suggestions');
if( suggestion ) {
var item = $("#follow-suggestion-template").clone(true);
item.removeAttr("id");
diff --git a/js/twister_timeline.js b/js/twister_timeline.js
index fa928c5..c016166 100644
--- a/js/twister_timeline.js
+++ b/js/twister_timeline.js
@@ -189,44 +189,42 @@ function showPosts(req, posts)
var streamItemsParent = $.MAL.getStreamPostsParent();
for( var i = 0; i < posts.length; i++ ) {
- if (req.users.indexOf(posts[i]['userpost']['n']) > -1 || req.getspam) { // FIXME maybe it's unecessary check but currently we got unwanted adverting posts which are coming with requested ones from 'getposts' sometimes
- var post = posts[i];
- //console.log(post);
- var streamPost = postToElem(post, "original", req.getspam);
- var timePost = post["userpost"]["time"];
- streamPost.attr("data-time",timePost);
-
- // post will only be shown if appended to the stream list
- var streamPostAppended = false;
-
- // insert the post in timeline ordered by (you guessed) time
- // FIXME: lame! searching everything everytime. please optimize!
- var streamItems = streamItemsParent.children();
- if( streamItems.length == 0) {
- // timeline is empty
- streamItemsParent.append( streamPost );
- streamPostAppended = true;
- } else {
- var j = 0;
- for( j = 0; j < streamItems.length; j++) {
- var streamItem = streamItems.eq(j);
- var timeItem = streamItem.attr("data-time");
- if( timeItem == undefined ||
- timePost > parseInt(timeItem) ) {
- // this post in stream is older, so post must be inserted above
- streamItem.before(streamPost);
- streamPostAppended = true;
- break;
- }
+ var post = posts[i];
+ //console.log(post);
+ var streamPost = postToElem(post, "original", req.getspam);
+ var timePost = post["userpost"]["time"];
+ streamPost.attr("data-time",timePost);
+
+ // post will only be shown if appended to the stream list
+ var streamPostAppended = false;
+
+ // insert the post in timeline ordered by (you guessed) time
+ // FIXME: lame! searching everything everytime. please optimize!
+ var streamItems = streamItemsParent.children();
+ if( streamItems.length == 0) {
+ // timeline is empty
+ streamItemsParent.append( streamPost );
+ streamPostAppended = true;
+ } else {
+ var j = 0;
+ for( j = 0; j < streamItems.length; j++) {
+ var streamItem = streamItems.eq(j);
+ var timeItem = streamItem.attr("data-time");
+ if( timeItem == undefined ||
+ timePost > parseInt(timeItem) ) {
+ // this post in stream is older, so post must be inserted above
+ streamItem.before(streamPost);
+ streamPostAppended = true;
+ break;
}
}
- if (!streamPostAppended)
- streamItemsParent.append( streamPost );
-
- streamPostAppended = true;
- streamPost.show();
- req.reportProcessedPost(post["userpost"]["n"],post["userpost"]["k"], streamPostAppended);
}
+ if (!streamPostAppended)
+ streamItemsParent.append( streamPost );
+
+ streamPostAppended = true;
+ streamPost.show();
+ req.reportProcessedPost(post["userpost"]["n"],post["userpost"]["k"], streamPostAppended);
}
}
diff --git a/licenses/caret.license b/licenses/caret.license
new file mode 100644
index 0000000..0a66b06
--- /dev/null
+++ b/licenses/caret.license
@@ -0,0 +1,30 @@
+Copyright (c) 2009, Gideon Sireling
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ * Neither the name of Gideon Sireling nor the names of other
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/licenses/franc.license b/licenses/franc.license
new file mode 100644
index 0000000..1dab815
--- /dev/null
+++ b/licenses/franc.license
@@ -0,0 +1,25 @@
+(The MIT License)
+
+Copyright (c) 2014-2015 Titus Wormer
+Copyright (c) 2008 Kent S Johnson
+Copyright (c) 2006 Jacob R Rideout
+Copyright (c) 2004 Maciej Ceglowski
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/licenses/notify.js.license b/licenses/notify.js.license
new file mode 100644
index 0000000..b5cf4a5
--- /dev/null
+++ b/licenses/notify.js.license
@@ -0,0 +1,9 @@
+Copyright (c) 2014 Alex Gibson
+
+http://alxgbsn.co.uk/
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction except as noted below, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sublicense, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
diff --git a/options.html b/options.html
index c308014..36eaba2 100644
--- a/options.html
+++ b/options.html
@@ -29,8 +29,8 @@
-
-
+
+
@@ -302,16 +303,35 @@