فهرست منبع

Merge branch 'r4sas-master'

El RIDO 9 سال پیش
والد
کامیت
3d6676eee8
11فایلهای تغییر یافته به همراه193 افزوده شده و 14 حذف شده
  1. 4 4
      i18n/pl.json
  2. 157 0
      i18n/ru.json
  3. 4 2
      js/privatebin.js
  4. 3 1
      lib/I18n.php
  5. 1 1
      tpl/bootstrap-compact.php
  6. 1 1
      tpl/bootstrap-dark-page.php
  7. 1 1
      tpl/bootstrap-dark.php
  8. 1 1
      tpl/bootstrap-page.php
  9. 1 1
      tpl/bootstrap.php
  10. 1 1
      tpl/page.php
  11. 19 1
      tst/I18nTest.php

+ 4 - 4
i18n/pl.json

@@ -59,11 +59,11 @@
         "Przełącz nawigację",
     "%d seconds": ["%d second", "%d second", "%d second"],
     "%d minutes": ["%d minut", "%d minut", "%d minut"],
-    "%d hours": ["%d godzina", "%d godzina", "godzinę"],
+    "%d hours": ["%d godzina", "%d godzina", "%d godzinę"],
     "%d days": ["%d dzień", "%d dzień", "%d dzień"],
-    "%d weeks": ["%d tydzień", "%d tydzień", "tydzień"],
-    "%d months": ["%d miesiąc", "%d miesiąc", "miesiąc"],
-    "%d years": ["%d rok", "%d rok", "rok"],
+    "%d weeks": ["%d tydzień", "%d tydzień", "%d tydzień"],
+    "%d months": ["%d miesiąc", "%d miesiąc", "%d miesiąc"],
+    "%d years": ["%d rok", "%d rok", "%d rok"],
     "Never":
         "nigdy",
     "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":

+ 157 - 0
i18n/ru.json

@@ -0,0 +1,157 @@
+{
+    "en": "ru",
+    "Paste does not exist, has expired or has been deleted.":
+        "Запись не существует, просрочена или была удалена.",
+    "PrivateBin requires php 5.3.0 or above to work. Sorry.":
+        "Для работы PrivateBin требуется PHP 5.3.0 или выше. Извините.",
+    "PrivateBin requires configuration section [%s] to be present in configuration file.":
+        "PrivateBin необходимо наличие секции [%s] в конфигурационном файле.",
+    "Please wait %d seconds between each post.":
+        ["Пожалуйста ожидайте %d секунду между каждыми записями.", "Пожалуйста ожидайте %d секунды между каждыми записями.", "Пожалуйста ожидайте %d секунд между каждыми записями."],
+    "Paste is limited to %s of encrypted data.":
+        "Размер записи ограничен %s зашифрованных данных.",
+    "Invalid data.":
+        "Неверные данные.",
+    "You are unlucky. Try again.":
+        "Вам не повезло. Попробуйте еще раз.",
+    "Error saving comment. Sorry.":
+        "Ошибка при сохранении комментария. Извините.",
+    "Error saving paste. Sorry.":
+        "Ошибка при сохранении записи. Извините.",
+    "Invalid paste ID.":
+        "Неверный ID записи.",
+    "Paste is not of burn-after-reading type.":
+        "Тип записи не \"Удалить после прочтения\".",
+    "Wrong deletion token. Paste was not deleted.":
+        "Неверный ключ удаления записи. Запись не удалена",
+    "Paste was properly deleted.":
+        "Запись была успешно удалена.",
+    "PrivateBin": "PrivateBin",
+    "PrivateBin is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
+        "PrivateBin это минималистичный Open Source проект для создания заметок, где сервер не знает ничего о сохраняемых данных. Данные шифруются/расшифровываются <i>в браузере</i> с использованием 256 битного шифрования AES. Подробнее можно узнать на <a href=\"https://privatebin.info/\">сайте проекта</a>.",
+    "Because ignorance is bliss":
+        "Потому что неведение - благо",
+    "JavaScript is required for PrivateBin to work.<br />Sorry for the inconvenience.":
+        "Для работы PrivateBin требуется включенный JavaScript.<br />Приносим извинения за неудобства..",
+    "PrivateBin requires a modern browser to work.":
+        "Для работы PrivateBin требуется более современный браузер.",
+    "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
+        "До сих пор используете Internet Explorer? Пожалейте себя, перейдите на более современный браузер:",
+    "New":
+        "Новая запись",
+    "Send":
+        "Отправить",
+    "Clone":
+        "Дублировать",
+    "Raw text":
+        "Исходный текст",
+    "Expires":
+        "Удалить через",
+    "Burn after reading":
+        "Удалить после прочтения",
+    "Open discussion":
+        "Открыть обсуждение",
+    "Password (recommended)":
+        "Пароль (рекомендуется)",
+    "Discussion":
+        "Обсуждение",
+    "Toggle navigation":
+        "Переключить навигацию",
+    "%d seconds": ["%d секунду", "%d секунды", "%d секунд"],
+    "%d minutes": ["%d минуту", "%d минуты", "%d минут"],
+    "%d hours": ["%d час", "%d часа", "%d часов"],
+    "%d days": ["%d день", "%d дня", "%d дней"],
+    "%d weeks": ["%d неделю", "%d недели", "%d недель"],
+    "%d months": ["%d месяц", "%d месяца", "%d месяцев"],
+    "%d years": ["%d год", "%d года", "%d лет"],
+    "Never":
+        "Никогда",
+    "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
+        "Примечание: Этот сервис тестовый: Данные могут быть удалены в любое время. Котята умрут, если вы будете злоупотреблять серсисом.",
+    "This document will expire in %d seconds.":
+        ["Документ будет удален через %d секунду.", "Документ будет удален через %d секунды.", "Документ будет удален через %d секунд."],
+    "This document will expire in %d minutes.":
+        ["Документ будет удален через %d минуту.", "Документ будет удален через %d минуты.", "Документ будет удален через %d минут."],
+    "This document will expire in %d hours.":
+        ["Документ будет удален через %d час.", "Документ будет удален через %d часа.", "Документ будет удален через %d часов."],
+    "This document will expire in %d days.":
+        ["Документ будет удален через %d день.", "Документ будет удален через %d дня.", "Документ будет удален через %d дней."],
+    "This document will expire in %d months.":
+        ["Документ будет удален через %d месяц.", "Документ будет удален через %d месяца.", "Документ будет удален через %d месяцев."],
+    "Please enter the password for this paste:":
+        "Пожалуйста введите пароль от записи:",
+    "Could not decrypt data (Wrong key?)":
+        "Невозможно расшифровать данные (Неверный ключ?)",
+    "Could not delete the paste, it was not stored in burn after reading mode.":
+        "Невозможно удалить запись, она не была сохранена в режиме удаления после прочтения",
+    "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
+        "ТОЛЬКО ДЛЯ ВАШИХ ГЛАЗ. Не закрывайте это окно, это сообщение не может быть показано снова.",
+    "Could not decrypt comment; Wrong key?":
+        "Невозможно расшифровать комментарий; Неверный ключ?",
+    "Reply":
+        "Ответить",
+    "Anonymous":
+        "Аноним",
+    "Anonymous avatar (Vizhash of the IP address)":
+        "Анонимный аватар (Vizhash IP адреса)",
+    "Add comment":
+        "Добавить комментарий",
+    "Optional nickname...":
+        "Опциональный никнейм...",
+    "Post comment":
+        "Отправить комментарий",
+    "Sending comment...":
+        "Отправка комментария...",
+    "Comment posted.":
+        "Комментарий опубликован.",
+    "Could not refresh display: %s":
+        "Невозможно обновить данные: %s",
+    "unknown status":
+        "неизвестная причина",
+    "server error or not responding":
+        "ошибка сервера или нет ответа",
+    "Could not post comment: %s":
+        "Не удалось опубликовать комментарий: %s",
+    "Sending paste (Please move your mouse for more entropy)...":
+        "Отправка записи (Пожалуйста двигайте мышкой для большей энтропии)...",
+    "Sending paste...":
+        "Отправка записи...",
+    "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
+        "Ссылка на запись <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Нажмите [Ctrl]+[c] чтобы скопировать ссылку)</span>",
+    "Delete data":
+        "Удалить запись",
+    "Could not create paste: %s":
+        "Не удалось опубликовать запись: %s",
+    "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
+        "Невозможно расшифровать запись: Ключ расшифровки отсутствует в ссылке (Может быть вы используете сокращатель ссылок, который удаляет часть ссылки?)",
+    "B": "байт",
+    "KiB": "Кбайт",
+    "MiB": "Мбайт",
+    "GiB": "Гбайт",
+    "TiB": "Тбайт",
+    "PiB": "Пбайт",
+    "EiB": "Эбайт",
+    "ZiB": "Збайт",
+    "YiB": "Йбайт",
+    "Format": "Формат",
+    "Plain Text": "Обычный текст",
+    "Source Code": "Исходный код",
+    "Markdown": "Язык разметки",
+    "Download attachment": "Скачать прикрепленный файл",
+    "Cloned file attached.": "Дубль файла прикреплен.",
+    "Attach a file": "Прикрепить файл",
+    "Remove attachment": "Удалить вложение",
+    "Your browser does not support uploading encrypted files. Please use a newer browser.":
+        "Ваш браузер не поддерживает отправку зашифрованных файлов. Используйте более новый браузер.",
+    "Invalid attachment.": "Неизвестное вложение.",
+    "Options": "Опции",
+    "Shorten URL": "Короткая ссылка",
+    "Editor": "Редактор",
+    "Preview": "Предпросмотр",
+    "PrivateBin requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
+        "Переменная PATH необходима PrivateBin в конце \"%s\". Пожалуйста обновите переменную PATH в вашем index.php.",
+    "Decrypt":
+        "Расшифровать",
+    "Enter password":
+        "Введите пароль"
+}

+ 4 - 2
js/privatebin.js

@@ -328,7 +328,7 @@ $(function() {
         /**
          * supported languages, minus the built in 'en'
          */
-        supportedLanguages: ['de', 'fr', 'it', 'pl', 'sl', 'zh'],
+        supportedLanguages: ['de', 'fr', 'it', 'pl', 'ru', 'sl', 'zh'],
 
         /**
          * translate a string, alias for translate()
@@ -413,7 +413,9 @@ $(function() {
                 case 'zh':
                     return (n > 1 ? 1 : 0);
                 case 'pl':
-                    return (n === 1 ? 0 : n%10 >= 2 && n %10 <=4 && (n%100 < 10 || n%100 >= 20) ? 1 : 2);
+                    return (n === 1 ? 0 : (n%10 >= 2 && n %10 <=4 && (n%100 < 10 || n%100 >= 20) ? 1 : 2));
+                case 'ru':
+                    return (n % 10 === 1 && n % 100 !== 11 ? 0 : (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2));
                 // en, de
                 default:
                     return (n !== 1 ? 1 : 0);

+ 3 - 1
lib/I18n.php

@@ -298,7 +298,9 @@ class I18n
             case 'zh':
                 return $n > 1 ? 1 : 0;
             case 'pl':
-                return $n == 1 ? 0 : $n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2;
+                return $n == 1 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);
+            case 'ru':
+                return $n % 10 == 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);
             // en, de
             default:
                 return $n != 1 ? 1 : 0;

+ 1 - 1
tpl/bootstrap-compact.php

@@ -52,7 +52,7 @@ if ($MARKDOWN):
 <?php
 endif;
 ?>
-		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-aKd7/5EFMPmeZTmL0Iyttt6sbukO9E40bUink8A/IJmrncCh1upGLlkhti7ygO+hq/ocgLJ0kKoxZETzTgNEww==" crossorigin="anonymous"></script>
+		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-V/iOsbg0tz5cbcOCtBOgY+uK/X92E8EQLlW6L7OYvzLSYOO1YfPVupEbYEWgOj9KllOLrIsN8Oe+MfBsnFSW2g==" crossorigin="anonymous"></script>
 		<!--[if lt IE 10]>
 		<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
 		<![endif]-->

+ 1 - 1
tpl/bootstrap-dark-page.php

@@ -52,7 +52,7 @@ if ($MARKDOWN):
 <?php
 endif;
 ?>
-		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-aKd7/5EFMPmeZTmL0Iyttt6sbukO9E40bUink8A/IJmrncCh1upGLlkhti7ygO+hq/ocgLJ0kKoxZETzTgNEww==" crossorigin="anonymous"></script>
+		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-V/iOsbg0tz5cbcOCtBOgY+uK/X92E8EQLlW6L7OYvzLSYOO1YfPVupEbYEWgOj9KllOLrIsN8Oe+MfBsnFSW2g==" crossorigin="anonymous"></script>
 		<!--[if lt IE 10]>
 		<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
 		<![endif]-->

+ 1 - 1
tpl/bootstrap-dark.php

@@ -53,7 +53,7 @@ if ($MARKDOWN):
 <?php
 endif;
 ?>
-		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-aKd7/5EFMPmeZTmL0Iyttt6sbukO9E40bUink8A/IJmrncCh1upGLlkhti7ygO+hq/ocgLJ0kKoxZETzTgNEww==" crossorigin="anonymous"></script>
+		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-V/iOsbg0tz5cbcOCtBOgY+uK/X92E8EQLlW6L7OYvzLSYOO1YfPVupEbYEWgOj9KllOLrIsN8Oe+MfBsnFSW2g==" crossorigin="anonymous"></script>
 		<!--[if lt IE 10]>
 		<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
 		<![endif]-->

+ 1 - 1
tpl/bootstrap-page.php

@@ -52,7 +52,7 @@ if ($MARKDOWN):
 <?php
 endif;
 ?>
-		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-aKd7/5EFMPmeZTmL0Iyttt6sbukO9E40bUink8A/IJmrncCh1upGLlkhti7ygO+hq/ocgLJ0kKoxZETzTgNEww==" crossorigin="anonymous"></script>
+		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-V/iOsbg0tz5cbcOCtBOgY+uK/X92E8EQLlW6L7OYvzLSYOO1YfPVupEbYEWgOj9KllOLrIsN8Oe+MfBsnFSW2g==" crossorigin="anonymous"></script>
 		<!--[if lt IE 10]>
 		<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
 		<![endif]-->

+ 1 - 1
tpl/bootstrap.php

@@ -53,7 +53,7 @@ if ($MARKDOWN):
 <?php
 endif;
 ?>
-		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-aKd7/5EFMPmeZTmL0Iyttt6sbukO9E40bUink8A/IJmrncCh1upGLlkhti7ygO+hq/ocgLJ0kKoxZETzTgNEww==" crossorigin="anonymous"></script>
+		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-V/iOsbg0tz5cbcOCtBOgY+uK/X92E8EQLlW6L7OYvzLSYOO1YfPVupEbYEWgOj9KllOLrIsN8Oe+MfBsnFSW2g==" crossorigin="anonymous"></script>
 		<!--[if lt IE 10]>
 		<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
 		<![endif]-->

+ 1 - 1
tpl/page.php

@@ -47,7 +47,7 @@ if ($MARKDOWN):
 <?php
 endif;
 ?>
-		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-aKd7/5EFMPmeZTmL0Iyttt6sbukO9E40bUink8A/IJmrncCh1upGLlkhti7ygO+hq/ocgLJ0kKoxZETzTgNEww==" crossorigin="anonymous"></script>
+		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-V/iOsbg0tz5cbcOCtBOgY+uK/X92E8EQLlW6L7OYvzLSYOO1YfPVupEbYEWgOj9KllOLrIsN8Oe+MfBsnFSW2g==" crossorigin="anonymous"></script>
 		<!--[if lt IE 10]>
 		<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
 		<![endif]-->

+ 19 - 1
tst/I18nTest.php

@@ -63,7 +63,25 @@ class I18nTest extends PHPUnit_Framework_TestCase
         $_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'pl;q=0.8,en-GB;q=0.6,en-US;q=0.4,en;q=0.2';
         I18n::loadTranslations();
         $this->assertEquals('pl', I18n::_('en'), 'browser language pl');
-        $this->assertEquals('2 godzina', I18n::_('%d hours', 2), 'hours in polish');
+        $this->assertEquals('1 godzina', I18n::_('%d hours', 1), '1 hour in polish');
+        $this->assertEquals('2 godzina', I18n::_('%d hours', 2), '2 hours in polish');
+        $this->assertEquals('12 godzinę', I18n::_('%d hours', 12), '12 hours in polish');
+        $this->assertEquals('22 godzina', I18n::_('%d hours', 22), '22 hours in polish');
+        $this->assertEquals('1 minut',  I18n::_('%d minutes', 1), '1 minute in polish');
+        $this->assertEquals('3 minut',  I18n::_('%d minutes', 3), '3 minutes in polish');
+        $this->assertEquals('13 minut',  I18n::_('%d minutes', 13), '13 minutes in polish');
+        $this->assertEquals('23 minut',  I18n::_('%d minutes', 23), '23 minutes in polish');
+    }
+
+    public function testBrowserLanguageRuDetection()
+    {
+        $_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'ru;q=0.8,en-GB;q=0.6,en-US;q=0.4,en;q=0.2';
+        I18n::loadTranslations();
+        $this->assertEquals('ru', I18n::_('en'), 'browser language ru');
+        $this->assertEquals('1 минуту',  I18n::_('%d minutes', 1), '1 minute in russian');
+        $this->assertEquals('3 минуты',  I18n::_('%d minutes', 3), '3 minutes in russian');
+        $this->assertEquals('10 минут',  I18n::_('%d minutes', 10), '10 minutes in russian');
+        $this->assertEquals('21 минуту',  I18n::_('%d minutes', 21), '21 minutes in russian');
     }
 
     public function testBrowserLanguageAnyDetection()