aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2016-06-12 22:21:57 +0200
committerGravatar GitHub <noreply@github.com> 2016-06-12 22:21:57 +0200
commit7bc2ff45009a601550d77007c94ec23e2ced8f19 (patch)
tree8f175b55e291a152d2811d85f4a6d085f18f6849 /app
parent8dcc0fd65a36adedb12e5d54bafb39e7e553d38b (diff)
parent17de4363b5b0ab3f3ddc703ccf98332770040e17 (diff)
Merge pull request #1165 from FreshRSS/dev1.3.2-beta
Release 1.3.2-beta
Diffstat (limited to 'app')
-rwxr-xr-xapp/Controllers/entryController.php1
-rwxr-xr-xapp/Controllers/feedController.php3
-rwxr-xr-xapp/Controllers/indexController.php64
-rw-r--r--app/FreshRSS.php37
-rw-r--r--app/Models/CategoryDAO.php2
-rw-r--r--app/Models/Themes.php4
-rw-r--r--app/i18n/cz/gen.php4
-rw-r--r--app/i18n/de/gen.php4
-rw-r--r--app/i18n/en/gen.php4
-rw-r--r--app/i18n/fr/gen.php4
-rw-r--r--app/i18n/it/gen.php5
-rw-r--r--app/i18n/nl/gen.php4
-rw-r--r--app/i18n/ru/admin.php183
-rw-r--r--app/i18n/ru/conf.php174
-rw-r--r--app/i18n/ru/feedback.php110
-rw-r--r--app/i18n/ru/gen.php185
-rw-r--r--app/i18n/ru/index.php61
-rw-r--r--app/i18n/ru/install.php113
-rw-r--r--app/i18n/ru/sub.php62
-rw-r--r--app/i18n/tr/gen.php4
-rw-r--r--app/i18n/tr/install.php4
-rw-r--r--app/install.php4
-rw-r--r--app/layout/layout.phtml40
-rwxr-xr-xapp/views/entry/bookmark.phtml1
-rwxr-xr-xapp/views/entry/read.phtml1
-rw-r--r--app/views/helpers/feed/update.phtml2
-rw-r--r--app/views/update/checkInstall.phtml2
27 files changed, 995 insertions, 87 deletions
diff --git a/app/Controllers/entryController.php b/app/Controllers/entryController.php
index 1d9989f40..bff1073ef 100755
--- a/app/Controllers/entryController.php
+++ b/app/Controllers/entryController.php
@@ -46,6 +46,7 @@ class FreshRSS_entry_Controller extends Minz_ActionController {
if ($id === false) {
// id is false? It MUST be a POST request!
if (!Minz_Request::isPost()) {
+ Minz_Request::bad(_t('feedback.access.not_found'), array('c' => 'index', 'a' => 'index'));
return;
}
diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php
index b559d3c22..6a8aa01cf 100755
--- a/app/Controllers/feedController.php
+++ b/app/Controllers/feedController.php
@@ -114,6 +114,8 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
Minz_Request::bad(_t('feedback.sub.feed.invalid_url', $url), $url_redirect);
}
+ $feed->_httpAuth($http_auth);
+
try {
$feed->load(true);
} catch (FreshRSS_Feed_Exception $e) {
@@ -140,7 +142,6 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
}
$feed->_category($cat);
- $feed->_httpAuth($http_auth);
// Call the extension hook
$name = $feed->name();
diff --git a/app/Controllers/indexController.php b/app/Controllers/indexController.php
index baaf99065..7e626720e 100755
--- a/app/Controllers/indexController.php
+++ b/app/Controllers/indexController.php
@@ -32,42 +32,44 @@ class FreshRSS_index_Controller extends Minz_ActionController {
Minz_Error::error(404);
}
- try {
- $entries = $this->listEntriesByContext();
-
- $nb_entries = count($entries);
- if ($nb_entries > FreshRSS_Context::$number) {
- // We have more elements for pagination
- $last_entry = array_pop($entries);
- FreshRSS_Context::$next_id = $last_entry->id();
- }
+ $this->view->callbackBeforeContent = function() {
+ try {
+ $entries = $this->listEntriesByContext();
+
+ $nb_entries = count($entries);
+ if ($nb_entries > FreshRSS_Context::$number) {
+ // We have more elements for pagination
+ $last_entry = array_pop($entries);
+ FreshRSS_Context::$next_id = $last_entry->id();
+ }
- $first_entry = $nb_entries > 0 ? $entries[0] : null;
- FreshRSS_Context::$id_max = $first_entry === null ?
- (time() - 1) . '000000' :
- $first_entry->id();
- if (FreshRSS_Context::$order === 'ASC') {
- // In this case we do not know but we guess id_max
- $id_max = (time() - 1) . '000000';
- if (strcmp($id_max, FreshRSS_Context::$id_max) > 0) {
- FreshRSS_Context::$id_max = $id_max;
+ $first_entry = $nb_entries > 0 ? $entries[0] : null;
+ FreshRSS_Context::$id_max = $first_entry === null ?
+ (time() - 1) . '000000' :
+ $first_entry->id();
+ if (FreshRSS_Context::$order === 'ASC') {
+ // In this case we do not know but we guess id_max
+ $id_max = (time() - 1) . '000000';
+ if (strcmp($id_max, FreshRSS_Context::$id_max) > 0) {
+ FreshRSS_Context::$id_max = $id_max;
+ }
}
- }
- $this->view->entries = $entries;
- } catch (FreshRSS_EntriesGetter_Exception $e) {
- Minz_Log::notice($e->getMessage());
- Minz_Error::error(404);
- }
+ $this->view->entries = $entries;
+ } catch (FreshRSS_EntriesGetter_Exception $e) {
+ Minz_Log::notice($e->getMessage());
+ Minz_Error::error(404);
+ }
- $this->view->categories = FreshRSS_Context::$categories;
+ $this->view->categories = FreshRSS_Context::$categories;
- $this->view->rss_title = FreshRSS_Context::$name . ' | ' . Minz_View::title();
- $title = FreshRSS_Context::$name;
- if (FreshRSS_Context::$get_unread > 0) {
- $title = '(' . FreshRSS_Context::$get_unread . ') ' . $title;
- }
- Minz_View::prependTitle($title . ' · ');
+ $this->view->rss_title = FreshRSS_Context::$name . ' | ' . Minz_View::title();
+ $title = FreshRSS_Context::$name;
+ if (FreshRSS_Context::$get_unread > 0) {
+ $title = '(' . FreshRSS_Context::$get_unread . ') ' . $title;
+ }
+ Minz_View::prependTitle($title . ' · ');
+ };
}
/**
diff --git a/app/FreshRSS.php b/app/FreshRSS.php
index bafa970da..4933892bc 100644
--- a/app/FreshRSS.php
+++ b/app/FreshRSS.php
@@ -34,7 +34,7 @@ class FreshRSS extends Minz_FrontController {
// Auth has to be initialized before using currentUser session parameter
// because it's this part which create this parameter.
- $this->initAuth();
+ self::initAuth();
// Then, register the user configuration and use the configuration setter
// created above.
@@ -46,10 +46,8 @@ class FreshRSS extends Minz_FrontController {
// Finish to initialize the other FreshRSS / Minz components.
FreshRSS_Context::init();
- $this->initI18n();
- FreshRSS_Share::load(join_path(DATA_PATH, 'shares.php'));
- $this->loadStylesAndScripts();
- $this->loadNotifications();
+ self::initI18n();
+ self::loadNotifications();
// Enable extensions for the current (logged) user.
if (FreshRSS_Auth::hasAccess()) {
$ext_list = FreshRSS_Context::$user_conf->extensions_enabled;
@@ -57,7 +55,7 @@ class FreshRSS extends Minz_FrontController {
}
}
- private function initAuth() {
+ private static function initAuth() {
FreshRSS_Auth::init();
if (Minz_Request::isPost() && !is_referer_from_same_domain()) {
// Basic protection against XSRF attacks
@@ -74,12 +72,12 @@ class FreshRSS extends Minz_FrontController {
}
}
- private function initI18n() {
+ private static function initI18n() {
Minz_Session::_param('language', FreshRSS_Context::$user_conf->language);
Minz_Translate::init(FreshRSS_Context::$user_conf->language);
}
- private function loadStylesAndScripts() {
+ public static function loadStylesAndScripts() {
$theme = FreshRSS_Themes::load(FreshRSS_Context::$user_conf->theme);
if ($theme) {
foreach($theme['files'] as $file) {
@@ -91,9 +89,9 @@ class FreshRSS extends Minz_FrontController {
$filename = $file;
}
$filetime = @filemtime(PUBLIC_PATH . '/themes/' . $theme_id . '/' . $filename);
- Minz_View::appendStyle(Minz_Url::display(
- '/themes/' . $theme_id . '/' . $filename . '?' . $filetime
- ));
+ $url = '/themes/' . $theme_id . '/' . $filename . '?' . $filetime;
+ header('Link: <' . Minz_Url::display($url, '', 'root') . '>;rel=preload', false); //HTTP2
+ Minz_View::appendStyle(Minz_Url::display($url));
}
}
@@ -110,6 +108,14 @@ class FreshRSS extends Minz_FrontController {
}
}
+ private static function loadNotifications() {
+ $notif = Minz_Session::param('notification');
+ if ($notif) {
+ Minz_View::_param('notification', $notif);
+ Minz_Session::_param('notification');
+ }
+ }
+
public static function preLayout() {
switch (Minz_Request::controllerName()) {
case 'index':
@@ -123,13 +129,8 @@ class FreshRSS extends Minz_FrontController {
break;
}
header("X-Content-Type-Options: nosniff");
- }
- private function loadNotifications() {
- $notif = Minz_Session::param('notification');
- if ($notif) {
- Minz_View::_param('notification', $notif);
- Minz_Session::_param('notification');
- }
+ FreshRSS_Share::load(join_path(DATA_PATH, 'shares.php'));
+ self::loadStylesAndScripts();
}
}
diff --git a/app/Models/CategoryDAO.php b/app/Models/CategoryDAO.php
index b5abac519..fc431553e 100644
--- a/app/Models/CategoryDAO.php
+++ b/app/Models/CategoryDAO.php
@@ -103,7 +103,7 @@ class FreshRSS_CategoryDAO extends Minz_ModelPdo implements FreshRSS_Searchable
. ($details ? 'f.* ' : 'f.id, f.name, f.url, f.website, f.priority, f.error, f.cache_nbEntries, f.cache_nbUnreads ')
. 'FROM `' . $this->prefix . 'category` c '
. 'LEFT OUTER JOIN `' . $this->prefix . 'feed` f ON f.category=c.id '
- . 'GROUP BY f.id '
+ . 'GROUP BY f.id, c_id '
. 'ORDER BY c.name, f.name';
$stm = $this->bd->prepare($sql);
$stm->execute();
diff --git a/app/Models/Themes.php b/app/Models/Themes.php
index e3b260261..5a6ec0a05 100644
--- a/app/Models/Themes.php
+++ b/app/Models/Themes.php
@@ -116,7 +116,3 @@ class FreshRSS_Themes extends Minz_Model {
'<img class="icon" src="' . Minz_Url::display($url) . '" alt="' . $alts[$name] . '" />';
}
}
-
-function _i($icon, $url_only = false) {
- return FreshRSS_Themes::icon($icon, $url_only);
-}
diff --git a/app/i18n/cz/gen.php b/app/i18n/cz/gen.php
index 78ec80f68..5e15ae6f9 100644
--- a/app/i18n/cz/gen.php
+++ b/app/i18n/cz/gen.php
@@ -122,6 +122,7 @@ return array(
'fr' => 'Français',
'it' => 'Italiano',
'nl' => 'Nederlands',
+ 'ru' => 'Русский',
'tr' => 'Türkçe',
),
'menu' => array(
@@ -164,7 +165,8 @@ return array(
'print' => 'Tisk',
'shaarli' => 'Shaarli',
'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'wallabag' => 'wallabag v1',
+ 'wallabagv2' => 'wallabag v2',
'jdh' => 'Journal du hacker',
),
'short' => array(
diff --git a/app/i18n/de/gen.php b/app/i18n/de/gen.php
index bd0ba08cc..4b85c722a 100644
--- a/app/i18n/de/gen.php
+++ b/app/i18n/de/gen.php
@@ -122,6 +122,7 @@ return array(
'fr' => 'Français',
'it' => 'Italiano',
'nl' => 'Nederlands',
+ 'ru' => 'Русский',
'tr' => 'Türkçe',
),
'menu' => array(
@@ -164,7 +165,8 @@ return array(
'print' => 'Drucken',
'shaarli' => 'Shaarli',
'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'wallabag' => 'wallabag v1',
+ 'wallabagv2' => 'wallabag v2',
'jdh' => 'Journal du hacker',
),
'short' => array(
diff --git a/app/i18n/en/gen.php b/app/i18n/en/gen.php
index 6fb33a4db..ba4e2f86c 100644
--- a/app/i18n/en/gen.php
+++ b/app/i18n/en/gen.php
@@ -122,6 +122,7 @@ return array(
'fr' => 'Français',
'it' => 'Italiano',
'nl' => 'Nederlands',
+ 'ru' => 'Русский',
'tr' => 'Türkçe',
),
'menu' => array(
@@ -164,7 +165,8 @@ return array(
'print' => 'Print',
'shaarli' => 'Shaarli',
'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'wallabag' => 'wallabag v1',
+ 'wallabagv2' => 'wallabag v2',
'jdh' => 'Journal du hacker',
),
'short' => array(
diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php
index 6b7056f92..031098aa2 100644
--- a/app/i18n/fr/gen.php
+++ b/app/i18n/fr/gen.php
@@ -122,6 +122,7 @@ return array(
'fr' => 'Français',
'it' => 'Italiano',
'nl' => 'Nederlands',
+ 'ru' => 'Русский',
'tr' => 'Türkçe',
),
'menu' => array(
@@ -164,7 +165,8 @@ return array(
'print' => 'Imprimer',
'shaarli' => 'Shaarli',
'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'wallabag' => 'wallabag v1',
+ 'wallabagv2' => 'wallabag v2',
'jdh' => 'Journal du hacker',
),
'short' => array(
diff --git a/app/i18n/it/gen.php b/app/i18n/it/gen.php
index 2efbef167..d24377593 100644
--- a/app/i18n/it/gen.php
+++ b/app/i18n/it/gen.php
@@ -122,6 +122,7 @@ return array(
'fr' => 'Français',
'it' => 'Italiano',
'nl' => 'Nederlands',
+ 'ru' => 'Русский',
'tr' => 'Türkçe',
),
'menu' => array(
@@ -160,10 +161,12 @@ return array(
'email' => 'Email',
'facebook' => 'Facebook',
'g+' => 'Google+',
+ 'movim' => 'Movim',
'print' => 'Stampa',
'shaarli' => 'Shaarli',
'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'wallabag' => 'wallabag v1',
+ 'wallabagv2' => 'wallabag v2',
'jdh' => 'Journal du hacker',
),
'short' => array(
diff --git a/app/i18n/nl/gen.php b/app/i18n/nl/gen.php
index 1cafaf82a..24cba574e 100644
--- a/app/i18n/nl/gen.php
+++ b/app/i18n/nl/gen.php
@@ -122,6 +122,7 @@ return array(
'fr' => 'Français',
'it' => 'Italiano',
'nl' => 'Nederlands',
+ 'ru' => 'Русский',
'tr' => 'Türkçe',
),
'menu' => array(
@@ -164,7 +165,8 @@ return array(
'print' => 'Print',
'shaarli' => 'Shaarli',
'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'wallabag' => 'wallabag v1',
+ 'wallabagv2' => 'wallabag v2',
'jdh' => 'Journal du hacker',
),
'short' => array(
diff --git a/app/i18n/ru/admin.php b/app/i18n/ru/admin.php
new file mode 100644
index 000000000..dfea5b3cb
--- /dev/null
+++ b/app/i18n/ru/admin.php
@@ -0,0 +1,183 @@
+<?php
+
+return array(
+ 'auth' => array(
+ 'allow_anonymous' => 'Разрешить анонимное чтение статей для пользователя по умолчанию (%s)',
+ 'allow_anonymous_refresh' => 'Разрешить анонимное обновление статей',
+ 'api_enabled' => 'Включить доступ к <abbr>API</abbr> <small>(необходимо для мобильных приложений)</small>',
+ 'form' => 'На основе веб-формы (традиционный, необходим JavaScript)',
+ 'http' => 'HTTP (для продвинутых пользователей - по HTTPS)',
+ 'none' => 'Без аутентификации (небезопасный)',
+ 'persona' => 'Mozilla Persona (новый, необходим JavaScript)',
+ 'title' => 'Аутентификации',
+ 'title_reset' => 'Сброс аутентицикации',
+ 'token' => 'Токен аутентификации',
+ 'token_help' => 'Разрешает доступ к RSS ленте пользователя по умолчанию без аутентификации:',
+ 'type' => 'Метод аутентификации',
+ 'unsafe_autologin' => 'Разрешить небезопасный автоматический вход с использованием следующего формата: ',
+ ),
+ 'check_install' => array(
+ 'cache' => array(
+ 'nok' => 'Проверьте права доступа к папке <em>./data/cache</em>. Сервер HTTP должен иметь права на запись в эту папку',
+ 'ok' => 'Права на <em>./data/cache</em> в порядке.',
+ ),
+ 'categories' => array(
+ 'nok' => 'Таблица категорий настроена неправильно.',
+ 'ok' => 'Таблица категорий настроена правильно.',
+ ),
+ 'connection' => array(
+ 'nok' => 'Подключение к базе данных не может быть установлено.',
+ 'ok' => 'Подключение к базе данных в порядке.',
+ ),
+ 'ctype' => array(
+ 'nok' => 'У вас не установлена библиотека для проверки типов символов (php-ctype).',
+ 'ok' => 'У вас не установлена библиотека для проверки типов символов (ctype).',
+ ),
+ 'curl' => array(
+ 'nok' => 'У вас не установлено расширение cURL (пакет php5-curl).',
+ 'ok' => 'У вас установлено расширение cURL.',
+ ),
+ 'data' => array(
+ 'nok' => 'Проверьте права доступа к папке <em>./data</em> . Сервер HTTP должен иметь права на запись в эту папку.',
+ 'ok' => 'Права на <em>./data/</em> в порядке.',
+ ),
+ 'database' => 'Установка базы данных',
+ 'dom' => array(
+ 'nok' => 'У вас не установлена библиотека для просмотра DOM (пакет php-xml).',
+ 'ok' => 'У вас установлена библиотека для просмотра DOM.',
+ ),
+ 'entries' => array(
+ 'nok' => 'Таблица статей (entry) неправильно настроена.',
+ 'ok' => 'Таблица статей (entry) настроена правильно.',
+ ),
+ 'favicons' => array(
+ 'nok' => 'Проверьте права доступа к папке <em>./data/favicons</em> . Сервер HTTP должен иметь права на запись в эту папку.',
+ 'ok' => 'Права на папку значков в порядке.',
+ ),
+ 'feeds' => array(
+ 'nok' => 'Таблица подписок (feed) неправильно настроена.',
+ 'ok' => 'Таблица подписок (feed) настроена правильно.',
+ ),
+ 'files' => 'Установка файлов',
+ 'json' => array(
+ 'nok' => 'У вас не установлена библиотека для работы с JSON (пакет php5-json).',
+ 'ok' => 'У вас установлена библиотека для работы с JSON.',
+ ),
+ 'minz' => array(
+ 'nok' => 'У вас не установлен фрейворк Minz.',
+ 'ok' => 'У вас установлен фрейворк Minz.',
+ ),
+ 'pcre' => array(
+ 'nok' => 'У вас не установлена необходимая библиотека для работы с регулярными выражениями (php-pcre).',
+ 'ok' => 'У вас установлена необходимая библиотека для работы с регулярными выражениями (PCRE).',
+ ),
+ 'pdo' => array(
+ 'nok' => 'У вас не установлен PDO или один из необходимых драйверов (pdo_mysql, pdo_sqlite).',
+ 'ok' => 'У вас установлен PDO и как минимум один из поддерживаемых драйверов (pdo_mysql, pdo_sqlite).',
+ ),
+ 'persona' => array(
+ 'nok' => 'Проверьте права доступа к папке <em>./data/persona</em> . Сервер HTTP должен иметь права на запись в эту папку.',
+ 'ok' => 'Права на папку Mozilla Persona в порядке.',
+ ),
+ 'php' => array(
+ '_' => 'PHP installation',
+ 'nok' => 'У вас установлен PHP версии %s, но FreshRSS необходима версия не ниже %s.',
+ 'ok' => 'У вас установлен PHP версии %s, который совместим с FreshRSS.',
+ ),
+ 'tables' => array(
+ 'nok' => 'В базе данных отсуствует одна или больше таблица.',
+ 'ok' => 'Все таблицы есть в базе данных.',
+ ),
+ 'title' => 'Проверка установки и настройки',
+ 'tokens' => array(
+ 'nok' => 'Проверьте права доступа к папке <em>./data/tokens</em> . Сервер HTTP должен иметь права на запись в эту папку.',
+ 'ok' => 'Права на папку tokens в порядке.',
+ ),
+ 'users' => array(
+ 'nok' => 'Проверьте права доступа к папке <em>./data/users</em> . Сервер HTTP должен иметь права на запись в эту папку.',
+ 'ok' => 'Права на папку users в порядке.',
+ ),
+ 'zip' => array(
+ 'nok' => 'You lack ZIP extension (php5-zip package).',
+ 'ok' => 'You have ZIP extension.',
+ ),
+ ),
+ 'extensions' => array(
+ 'disabled' => 'Отключены',
+ 'empty_list' => 'Расширения не установлены',
+ 'enabled' => 'Включены',
+ 'no_configure_view' => 'Это расширение нельзя настроить.',
+ 'system' => array(
+ '_' => 'Системные расширения',
+ 'no_rights' => 'Системные расширения (у вас нет к ним доступа)',
+ ),
+ 'title' => 'Расширения',
+ 'user' => 'Расширения пользователя',
+ ),
+ 'stats' => array(
+ '_' => 'Статистика',
+ 'all_feeds' => 'Все подписки',
+ 'category' => 'Категория',
+ 'entry_count' => 'Количество статей',
+ 'entry_per_category' => 'Статей в категории',
+ 'entry_per_day' => 'Статей за день (за последние 30 дней)',
+ 'entry_per_day_of_week' => 'За неделю (в среднем - %.2f сообщений)',
+ 'entry_per_hour' => 'За час (в среднем - %.2f сообщений)',
+ 'entry_per_month' => 'За месяц (в среднем - %.2f сообщений)',
+ 'entry_repartition' => 'Перерасределение статей',
+ 'feed' => 'Подписка',
+ 'feed_per_category' => 'Подписок в категории',
+ 'idle' => 'Неактивные подписки',
+ 'main' => 'Основная статистика',
+ 'main_stream' => 'Основной поток',
+ 'menu' => array(
+ 'idle' => 'Неактивные подписки',
+ 'main' => 'Основная статистика',
+ 'repartition' => 'Перерасределение статей',
+ ),
+ 'no_idle' => 'Нет неактивных подписок!',
+ 'number_entries' => 'статей: %d',
+ 'percent_of_total' => '%% от всего',
+ 'repartition' => 'Перераспределение статей',
+ 'status_favorites' => 'Избранное',
+ 'status_read' => 'Читать',
+ 'status_total' => 'Всего',
+ 'status_unread' => 'Не прочитано',
+ 'title' => 'Статистика',
+ 'top_feed' => '10 лучших подписок',
+ ),
+ 'system' => array(
+ '_' => 'Системные настройки',
+ 'auto-update-url' => 'Адрес сервера для автоматического обновления',
+ 'instance-name' => 'Название этого сервера',
+ 'max-categories' => 'Количество категорий на пользователя',
+ 'max-feeds' => 'Количество статей на пользователя',
+ 'registration' => array(
+ 'help' => '0 означает неограниченное количество пользователей',
+ 'number' => 'Максимальное количество пользователей',
+ ),
+ ),
+ 'update' => array(
+ '_' => 'Обновление системы',
+ 'apply' => 'Применить',
+ 'check' => 'Проверить обновления',
+ 'current_version' => 'Ваша текущая версия FreshRSS: %s.',
+ 'last' => 'Последняя проверка: %s',
+ 'none' => 'Нечего обновлять',
+ 'title' => 'Обновить систему',
+ ),
+ 'user' => array(
+ 'articles_and_size' => '%s статей (%s)',
+ 'create' => 'Создать нового пользователя',
+ 'email_persona' => 'Адрес электронной почты для входа<br /><small>(for <a href="https://persona.org/" rel="external">Mozilla Persona</a>)</small>',
+ 'language' => 'Язык',
+ 'number' => 'На данный момент создан %d аккаунт',
+ 'numbers' => 'На данный момент аккаунтов создано: %d',
+ 'password_form' => 'Пароль<br /><small>(для входа через Веб-форму)</small>',
+ 'password_format' => 'Минимум 7 символов',
+ 'title' => 'Управление пользователями',
+ 'user_list' => 'Список пользователей',
+ 'username' => 'Имя пользователя',
+ 'users' => 'Пользователи',
+ ),
+);
diff --git a/app/i18n/ru/conf.php b/app/i18n/ru/conf.php
new file mode 100644
index 000000000..e502e9a43
--- /dev/null
+++ b/app/i18n/ru/conf.php
@@ -0,0 +1,174 @@
+<?php
+
+return array(
+ 'archiving' => array(
+ '_' => 'Архивация',
+ 'advanced' => 'Продвинутые настройки',
+ 'delete_after' => 'Удалять статьи после',
+ 'help' => 'Каждую подписку можно настроить более гибко',
+ 'keep_history_by_feed' => 'Minimum number of articles to keep by feed',
+ 'optimize' => 'Оптимизировать базу данных',
+ 'optimize_help' => 'To do occasionally to reduce the size of the database',
+ 'purge_now' => 'Очистить сейчас',
+ 'title' => 'Архивация',
+ 'ttl' => 'Не обновлять чаще чем',
+ ),
+ 'display' => array(
+ '_' => 'Display',
+ 'icon' => array(
+ 'bottom_line' => 'Bottom line',
+ 'entry' => 'Article icons',
+ 'publication_date' => 'Date of publication',
+ 'related_tags' => 'Related tags',
+ 'sharing' => 'Sharing',
+ 'top_line' => 'Top line',
+ ),
+ 'language' => 'Язык',
+ 'notif_html5' => array(
+ 'seconds' => 'seconds (0 means no timeout)',
+ 'timeout' => 'HTML5 notification timeout',
+ ),
+ 'theme' => 'Тема',
+ 'title' => 'Display',
+ 'width' => array(
+ 'content' => 'Content width',
+ 'large' => 'Large',
+ 'medium' => 'Medium',
+ 'no_limit' => 'No limit',
+ 'thin' => 'Thin',
+ ),
+ ),
+ 'query' => array(
+ '_' => 'User queries',
+ 'deprecated' => 'This query is no longer valid. The referenced category or feed has been deleted.',
+ 'filter' => 'Filter applied:',
+ 'get_all' => 'Display all articles',
+ 'get_category' => 'Display "%s" category',
+ 'get_favorite' => 'Display favorite articles',
+ 'get_feed' => 'Display "%s" feed',
+ 'no_filter' => 'No filter',
+ 'none' => 'You haven’t created any user query yet.',
+ 'number' => 'Query n°%d',
+ 'order_asc' => 'Display oldest articles first',
+ 'order_desc' => 'Display newest articles first',
+ 'search' => 'Search for "%s"',
+ 'state_0' => 'Display all articles',
+ 'state_1' => 'Display read articles',
+ 'state_2' => 'Display unread articles',
+ 'state_3' => 'Display all articles',
+ 'state_4' => 'Display favorite articles',
+ 'state_5' => 'Display read favorite articles',
+ 'state_6' => 'Display unread favorite articles',
+ 'state_7' => 'Display favorite articles',
+ 'state_8' => 'Display not favorite articles',
+ 'state_9' => 'Display read not favorite articles',
+ 'state_10' => 'Display unread not favorite articles',
+ 'state_11' => 'Display not favorite articles',
+ 'state_12' => 'Display all articles',
+ 'state_13' => 'Display read articles',
+ 'state_14' => 'Display unread articles',
+ 'state_15' => 'Display all articles',
+ 'title' => 'User queries',
+ ),
+ 'profile' => array(
+ '_' => 'Profile management',
+ 'delete' => array(
+ '_' => 'Account deletion',
+ 'warn' => 'Your account and all the related data will be deleted.',
+ ),
+ 'email_persona' => 'Login email address<br /><small>(for <a href="https://persona.org/" rel="external">Mozilla Persona</a>)</small>',
+ 'password_api' => 'Password API<br /><small>(e.g., for mobile apps)</small>',
+ 'password_form' => 'Password<br /><small>(for the Web-form login method)</small>',
+ 'password_format' => 'At least 7 characters',
+ 'title' => 'Profile',
+ ),
+ 'reading' => array(
+ '_' => 'Reading',
+ 'after_onread' => 'After “mark all as read”,',
+ 'articles_per_page' => 'Number of articles per page',
+ 'auto_load_more' => 'Load next articles at the page bottom',
+ 'auto_remove_article' => 'Hide articles after reading',
+ 'mark_updated_article_unread' => 'Mark updated articles as unread',
+ 'confirm_enabled' => 'Display a confirmation dialog on “mark all as read” actions',
+ 'display_articles_unfolded' => 'Show articles unfolded by default',
+ 'display_categories_unfolded' => 'Show categories folded by default',
+ 'hide_read_feeds' => 'Hide categories & feeds with no unread article (does not work with “Show all articles” configuration)',
+ 'img_with_lazyload' => 'Use "lazy load" mode to load pictures',
+ 'jump_next' => 'jump to next unread sibling (feed or category)',
+ 'number_divided_when_reader' => 'Divided by 2 in the reading view.',
+ 'read' => array(
+ 'article_open_on_website' => 'when article is opened on its original website',
+ 'article_viewed' => 'when article is viewed',
+ 'scroll' => 'while scrolling',
+ 'upon_reception' => 'upon reception of the article',
+ 'when' => 'Mark article as read…',
+ ),
+ 'show' => array(
+ '_' => 'Articles to display',
+ 'adaptive' => 'Adjust showing',
+ 'all_articles' => 'Show all articles',
+ 'unread' => 'Show only unread',
+ ),
+ 'sort' => array(
+ '_' => 'Sort order',
+ 'newer_first' => 'Newer first',
+ 'older_first' => 'Oldest first',
+ ),
+ 'sticky_post' => 'Stick the article to the top when opened',
+ 'title' => 'Reading',
+ 'view' => array(
+ 'default' => 'Default view',
+ 'global' => 'Global view',
+ 'normal' => 'Normal view',
+ 'reader' => 'Reading view',
+ ),
+ ),
+ 'sharing' => array(
+ '_' => 'Sharing',
+ 'blogotext' => 'Blogotext',
+ 'diaspora' => 'Diaspora*',
+ 'email' => 'Email',
+ 'facebook' => 'Facebook',
+ 'g+' => 'Google+',
+ 'more_information' => 'More information',
+ 'print' => 'Print',
+ 'shaarli' => 'Shaarli',
+ 'share_name' => 'Share name to display',
+ 'share_url' => 'Share URL to use',
+ 'title' => 'Sharing',
+ 'twitter' => 'Twitter',
+ 'wallabag' => 'wallabag',
+ ),
+ 'shortcut' => array(
+ '_' => 'Shortcuts',
+ 'article_action' => 'Article actions',
+ 'auto_share' => 'Share',
+ 'auto_share_help' => 'If there is only one sharing mode, it is used. Else modes are accessible by their number.',
+ 'close_dropdown' => 'Close menus',
+ 'collapse_article' => 'Collapse',
+ 'first_article' => 'Skip to the first article',
+ 'focus_search' => 'Access search box',
+ 'help' => 'Display documentation',
+ 'javascript' => 'JavaScript must be enabled in order to use shortcuts',
+ 'last_article' => 'Skip to the last article',
+ 'load_more' => 'Load more articles',
+ 'mark_read' => 'Mark as read',
+ 'mark_favorite' => 'Mark as favourite',
+ 'navigation' => 'Navigation',
+ 'navigation_help' => 'With the "Shift" modifier, navigation shortcuts apply on feeds.<br/>With the "Alt" modifier, navigation shortcuts apply on categories.',
+ 'next_article' => 'Skip to the next article',
+ 'other_action' => 'Other actions',
+ 'previous_article' => 'Skip to the previous article',
+ 'see_on_website' => 'See on original website',
+ 'shift_for_all_read' => '+ <code>shift</code> to mark all articles as read',
+ 'title' => 'Shortcuts',
+ 'user_filter' => 'Access user filters',
+ 'user_filter_help' => 'If there is only one user filter, it is used. Else filters are accessible by their number.',
+ ),
+ 'user' => array(
+ 'articles_and_size' => '%s articles (%s)',
+ 'current' => 'Current user',
+ 'is_admin' => 'is administrator',
+ 'users' => 'Users',
+ ),
+);
diff --git a/app/i18n/ru/feedback.php b/app/i18n/ru/feedback.php
new file mode 100644
index 000000000..c9189c0d0
--- /dev/null
+++ b/app/i18n/ru/feedback.php
@@ -0,0 +1,110 @@
+<?php
+
+return array(
+ 'admin' => array(
+ 'optimization_complete' => 'Optimisation complete',
+ ),
+ 'access' => array(
+ 'denied' => 'You don’t have permission to access this page',
+ 'not_found' => 'You are looking for a page which doesn’t exist',
+ ),
+ 'auth' => array(
+ 'form' => array(
+ 'not_set' => 'A problem occured during authentication system configuration. Please retry later.',
+ 'set' => 'Form is now your default authentication system.',
+ ),
+ 'login' => array(
+ 'invalid' => 'Login is invalid',
+ 'success' => 'You are connected',
+ ),
+ 'logout' => array(
+ 'success' => 'You are disconnected',
+ ),
+ 'no_password_set' => 'Administrator password hasn’t been set. This feature isn’t available.',
+ 'not_persona' => 'Only Persona system can be reset.',
+ ),
+ 'conf' => array(
+ 'error' => 'An error occurred during configuration saving',
+ 'query_created' => 'Query "%s" has been created.',
+ 'shortcuts_updated' => 'Shortcuts have been updated',
+ 'updated' => 'Configuration has been updated',
+ ),
+ 'extensions' => array(
+ 'already_enabled' => '%s is already enabled',
+ 'disable' => array(
+ 'ko' => '%s cannot be disabled. <a href="%s">Check FressRSS logs</a> for details.',
+ 'ok' => '%s is now disabled',
+ ),
+ 'enable' => array(
+ 'ko' => '%s cannot be enabled. <a href="%s">Check FressRSS logs</a> for details.',
+ 'ok' => '%s is now enabled',
+ ),
+ 'no_access' => 'You have no access on %s',
+ 'not_enabled' => '%s is not enabled yet',
+ 'not_found' => '%s does not exist',
+ ),
+ 'import_export' => array(
+ 'export_no_zip_extension' => 'Zip extension is not present on your server. Please try to export files one by one.',
+ 'feeds_imported' => 'Your feeds have been imported and will now be updated',
+ 'feeds_imported_with_errors' => 'Your feeds have been imported but some errors occurred',
+ 'file_cannot_be_uploaded' => 'File cannot be uploaded!',
+ 'no_zip_extension' => 'Zip extension is not present on your server.',
+ 'zip_error' => 'An error occured during Zip import.',
+ ),
+ 'sub' => array(
+ 'actualize' => 'Actualise',
+ 'category' => array(
+ 'created' => 'Category %s has been created.',
+ 'deleted' => 'Category has been deleted.',
+ 'emptied' => 'Category has been emptied',
+ 'error' => 'Category cannot be updated',
+ 'name_exists' => 'Category name already exists.',
+ 'no_id' => 'You must precise the id of the category.',
+ 'no_name' => 'Category name cannot be empty.',
+ 'not_delete_default' => 'You cannot delete the default category!',
+ 'not_exist' => 'The category does not exist!',
+ 'over_max' => 'You have reached your limit of categories (%d)',
+ 'updated' => 'Category has been updated.',
+ ),
+ 'feed' => array(
+ 'actualized' => '<em>%s</em> has been updated',
+ 'actualizeds' => 'RSS feeds have been updated',
+ 'added' => 'RSS feed <em>%s</em> has been added',
+ 'already_subscribed' => 'You have already subscribed to <em>%s</em>',
+ 'deleted' => 'Feed has been deleted',
+ 'error' => 'Feed cannot be updated',
+ 'internal_problem' => 'The RSS feed could not be added. <a href="%s">Check FressRSS logs</a> for details.',
+ 'invalid_url' => 'URL <em>%s</em> is invalid',
+ 'marked_read' => 'Feeds have been marked as read',
+ 'n_actualized' => '%d feeds have been updated',
+ 'n_entries_deleted' => '%d articles have been deleted',
+ 'no_refresh' => 'There is no feed to refresh…',
+ 'not_added' => '<em>%s</em> could not be added',
+ 'over_max' => 'You have reached your limit of feeds (%d)',
+ 'updated' => 'Feed has been updated',
+ ),
+ 'purge_completed' => 'Purge completed (%d articles deleted)',
+ ),
+ 'update' => array(
+ 'can_apply' => 'FreshRSS will now be updated to the <strong>version %s</strong>.',
+ 'error' => 'The update process has encountered an error: %s',
+ 'file_is_nok' => 'Check permissions on <em>%s</em> directory. HTTP server must have rights to write into',
+ 'finished' => 'Update completed!',
+ 'none' => 'No update to apply',
+ 'server_not_found' => 'Update server cannot be found. [%s]',
+ ),
+ 'user' => array(
+ 'created' => array(
+ '_' => 'User %s has been created',
+ 'error' => 'User %s cannot be created',
+ ),
+ 'deleted' => array(
+ '_' => 'User %s has been deleted',
+ 'error' => 'User %s cannot be deleted',
+ ),
+ ),
+ 'profile' => array(
+ 'error' => 'Your profile cannot be modified',
+ 'updated' => 'Your profile has been modified',
+ ),
+);
diff --git a/app/i18n/ru/gen.php b/app/i18n/ru/gen.php
new file mode 100644
index 000000000..b8e8511d9
--- /dev/null
+++ b/app/i18n/ru/gen.php
@@ -0,0 +1,185 @@
+<?php
+
+return array(
+ 'action' => array(
+ 'actualize' => 'Actualize',
+ 'back_to_rss_feeds' => '← Go back to your RSS feeds',
+ 'cancel' => 'Cancel',
+ 'create' => 'Create',
+ 'disable' => 'Disable',
+ 'empty' => 'Empty',
+ 'enable' => 'Enable',
+ 'export' => 'Export',
+ 'filter' => 'Filter',
+ 'import' => 'Import',
+ 'manage' => 'Manage',
+ 'mark_read' => 'Mark as read',
+ 'mark_favorite' => 'Mark as favourite',
+ 'remove' => 'Remove',
+ 'see_website' => 'See website',
+ 'submit' => 'Submit',
+ 'truncate' => 'Delete all articles',
+ ),
+ 'auth' => array(
+ 'email' => 'Email address',
+ 'keep_logged_in' => 'Keep me logged in <small>(1 month)</small>',
+ 'login' => 'Login',
+ 'login_persona' => 'Login with Persona',
+ 'login_persona_problem' => 'Connection problem with Persona?',
+ 'logout' => 'Logout',
+ 'password' => array(
+ '_' => 'Password',
+ 'format' => '<small>At least 7 characters</small>',
+ ),
+ 'registration' => array(
+ '_' => 'New account',
+ 'ask' => 'Create an account?',
+ 'title' => 'Account creation',
+ ),
+ 'reset' => 'Authentication reset',
+ 'username' => array(
+ '_' => 'Username',
+ 'admin' => 'Administrator username',
+ 'format' => '<small>maximum 16 alphanumeric characters</small>',
+ ),
+ 'will_reset' => 'Authentication system will be reset: a form will be used instead of Persona.',
+ ),
+ 'date' => array(
+ 'Apr' => '\\A\\p\\r\\i\\l',
+ 'Aug' => '\\A\\u\\g\\u\\s\\t',
+ 'Dec' => '\\D\\e\\c\\e\\m\\b\\e\\r',
+ 'Feb' => '\\F\\e\\b\\r\\u\\a\\r\\y',
+ 'Jan' => '\\J\\a\\n\\u\\a\\r\\y',
+ 'Jul' => '\\J\\u\\l\\y',
+ 'Jun' => '\\J\\u\\n\\e',
+ 'Mar' => '\\M\\a\\r\\c\\h',
+ 'May' => '\\M\\a\\y',
+ 'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r',
+ 'Oct' => '\\O\\c\\t\\o\\b\\e\\r',
+ 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r',
+ 'apr' => 'apr',
+ 'april' => 'Apr',
+ 'aug' => 'aug',
+ 'august' => 'Aug',
+ 'before_yesterday' => 'Before yesterday',
+ 'dec' => 'dec',
+ 'december' => 'Dec',
+ 'feb' => 'feb',
+ 'february' => 'Feb',
+ 'format_date' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y',
+ 'format_date_hour' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y \\a\\t H\\:i',
+ 'fri' => 'Fri',
+ 'jan' => 'jan',
+ 'january' => 'Jan',
+ 'jul' => 'jul',
+ 'july' => 'Jul',
+ 'jun' => 'jun',
+ 'june' => 'Jun',
+ 'last_3_month' => 'Last three months',
+ 'last_6_month' => 'Last six months',
+ 'last_month' => 'Last month',
+ 'last_week' => 'Last week',
+ 'last_year' => 'Last year',
+ 'mar' => 'mar',
+ 'march' => 'Mar',
+ 'may' => 'May',
+ 'mon' => 'Mon',
+ 'month' => 'months',
+ 'nov' => 'nov',
+ 'november' => 'Nov',
+ 'oct' => 'oct',
+ 'october' => 'Oct',
+ 'sat' => 'Sat',
+ 'sep' => 'sep',
+ 'september' => 'Sep',
+ 'sun' => 'Sun',
+ 'thu' => 'Thu',
+ 'today' => 'Today',
+ 'tue' => 'Tue',
+ 'wed' => 'Wed',
+ 'yesterday' => 'Yesterday',
+ ),
+ 'freshrss' => array(
+ '_' => 'FreshRSS',
+ 'about' => 'About FreshRSS',
+ ),
+ 'js' => array(
+ 'category_empty' => 'Empty category',
+ 'confirm_action' => 'Are you sure you want to perform this action? It cannot be cancelled!',
+ 'confirm_action_feed_cat' => 'Are you sure you want to perform this action? You will lose related favorites and user queries. It cannot be cancelled!',
+ 'feedback' => array(
+ 'body_new_articles' => 'There are %%d new articles to read on FreshRSS.',
+ 'request_failed' => 'A request has failed, it may have been caused by Internet connection problems.',
+ 'title_new_articles' => 'FreshRSS: new articles!',
+ ),
+ 'new_article' => 'There are new available articles, click to refresh the page.',
+ 'should_be_activated' => 'JavaScript must be enabled',
+ ),
+ 'lang' => array(
+ 'cz' => 'Čeština',
+ 'de' => 'Deutsch',
+ 'en' => 'English',
+ 'fr' => 'Français',
+ 'it' => 'Italiano',
+ 'nl' => 'Nederlands',
+ 'ru' => 'Русский',
+ 'tr' => 'Türkçe',
+ ),
+ 'menu' => array(
+ 'about' => 'About',
+ 'admin' => 'Administration',
+ 'archiving' => 'Archiving',
+ 'authentication' => 'Authentication',
+ 'check_install' => 'Installation checking',
+ 'configuration' => 'Configuration',
+ 'display' => 'Display',
+ 'extensions' => 'Extensions',
+ 'logs' => 'Logs',
+ 'queries' => 'User queries',
+ 'reading' => 'Reading',
+ 'search' => 'Search words or #tags',
+ 'sharing' => 'Sharing',
+ 'shortcuts' => 'Shortcuts',
+ 'stats' => 'Statistics',
+ 'system' => 'System configuration',
+ 'update' => 'Update',
+ 'user_management' => 'Manage users',
+ 'user_profile' => 'Profile',
+ ),
+ 'pagination' => array(
+ 'first' => 'First',
+ 'last' => 'Last',
+ 'load_more' => 'Load more articles',
+ 'mark_all_read' => 'Mark all as read',
+ 'next' => 'Next',
+ 'nothing_to_load' => 'There are no more articles',
+ 'previous' => 'Previous',
+ ),
+ 'share' => array(
+ 'blogotext' => 'Blogotext',
+ 'diaspora' => 'Diaspora*',
+ 'email' => 'Email',
+ 'facebook' => 'Facebook',
+ 'g+' => 'Google+',
+ 'jdh' => 'Journal du hacker',
+ 'movim' => 'Movim',
+ 'print' => 'Print',
+ 'shaarli' => 'Shaarli',
+ 'twitter' => 'Twitter',
+ 'wallabag' => 'wallabag v1',
+ 'wallabagv2' => 'wallabag v2',
+ ),
+ 'short' => array(
+ 'attention' => 'Warning!',
+ 'blank_to_disable' => 'Leave blank to disable',
+ 'by_author' => 'By <em>%s</em>',
+ 'by_default' => 'By default',
+ 'damn' => 'Damn!',
+ 'default_category' => 'Uncategorized',
+ 'no' => 'No',
+ 'not_applicable' => 'Not available',
+ 'ok' => 'Ok!',
+ 'or' => 'or',
+ 'yes' => 'Yes',
+ ),
+);
diff --git a/app/i18n/ru/index.php b/app/i18n/ru/index.php
new file mode 100644
index 000000000..80fa3d950
--- /dev/null
+++ b/app/i18n/ru/index.php
@@ -0,0 +1,61 @@
+<?php
+
+return array(
+ 'about' => array(
+ '_' => 'About',
+ 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
+ 'bugs_reports' => 'Bugs reports',
+ 'credits' => 'Credits',
+ 'credits_content' => 'Some design elements come from <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> although FreshRSS doesn’t use this framework. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Icons</a> come from <a href="https://www.gnome.org/">GNOME project</a>. <em>Open Sans</em> font police has been created by <a href="https://www.google.com/webfonts/specimen/Open+Sans">Steve Matteson</a>. Favicons are collected with <a href="https://getfavicon.appspot.com/">getFavicon API</a>. FreshRSS is based on <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, a PHP framework.',
+ 'freshrss_description' => 'FreshRSS is a RSS feeds aggregator to self-host like <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> or <a href="http://projet.idleman.fr/leed/">Leed</a>. It is light and easy to take in hand while being powerful and configurable tool.',
+ 'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">on Github</a>',
+ 'license' => 'License',
+ 'project_website' => 'Project website',
+ 'title' => 'About',
+ 'version' => 'Version',
+ 'website' => 'Website',
+ ),
+ 'feed' => array(
+ 'add' => 'You may add some feeds.',
+ 'empty' => 'There is no article to show.',
+ 'rss_of' => 'RSS feed of %s',
+ 'title' => 'Your RSS feeds',
+ 'title_global' => 'Global view',
+ 'title_fav' => 'Your favourites',
+ ),
+ 'log' => array(
+ '_' => 'Logs',
+ 'clear' => 'Clear the logs',
+ 'empty' => 'Log file is empty',
+ 'title' => 'Logs',
+ ),
+ 'menu' => array(
+ 'about' => 'About FreshRSS',
+ 'add_query' => 'Add a query',
+ 'before_one_day' => 'Before one day',
+ 'before_one_week' => 'Before one week',
+ 'favorites' => 'Favourites (%s)',
+ 'global_view' => 'Global view',
+ 'main_stream' => 'Main stream',
+ 'mark_all_read' => 'Mark all as read',
+ 'mark_cat_read' => 'Mark category as read',
+ 'mark_feed_read' => 'Mark feed as read',
+ 'newer_first' => 'Newer first',
+ 'non-starred' => 'Show all but favorites',
+ 'normal_view' => 'Normal view',
+ 'older_first' => 'Oldest first',
+ 'queries' => 'User queries',
+ 'read' => 'Show only read',
+ 'reader_view' => 'Reading view',
+ 'rss_view' => 'RSS feed',
+ 'search_short' => 'Search',
+ 'starred' => 'Show only favorites',
+ 'stats' => 'Statistics',
+ 'subscription' => 'Subscriptions management',
+ 'unread' => 'Show only unread',
+ ),
+ 'share' => 'Share',
+ 'tag' => array(
+ 'related' => 'Related tags',
+ ),
+);
diff --git a/app/i18n/ru/install.php b/app/i18n/ru/install.php
new file mode 100644
index 000000000..c838b2eba
--- /dev/null
+++ b/app/i18n/ru/install.php
@@ -0,0 +1,113 @@
+<?php
+
+return array(
+ 'action' => array(
+ 'finish' => 'Завершить установку',
+ 'fix_errors_before' => 'Пожалуйста, исправьте ошибки прежде чем переходить к следующему этапу.',
+ 'keep_install' => 'Сохранить предыдущую установку',
+ 'next_step' => 'Перейти к следующему этапу',
+ 'reinstall' => 'Переустановить FreshRSS',
+ ),
+ 'auth' => array(
+ 'email_persona' => 'Почта (логин) для <br /><small>(for <a href="https://persona.org/" rel="external">Mozilla Persona</a>)</small>',
+ 'form' => 'Вэб-форма (традиционный, необходим JavaScript)',
+ 'http' => 'HTTP (для продвинутых пользователей с HTTPS)',
+ 'none' => 'Никакого (опасно)',
+ 'password_form' => 'Пароль<br /><small>(для метода аутентификации на Вэб-формах)</small>',
+ 'password_format' => 'Как минимум 7 букв',
+ 'persona' => 'Mozilla Persona (современный, необходим JavaScript)',
+ 'type' => 'Метод аутентификации',
+ ),
+ 'bdd' => array(
+ '_' => 'База данных',
+ 'conf' => array(
+ '_' => 'Конфигурация базы данныхDatabase configuration',
+ 'ko' => 'Проверьте конфигурацию базы данных.',
+ 'ok' => 'Конфигурация базы данных сохранена.',
+ ),
+ 'host' => 'Хост',
+ 'prefix' => 'Префикс таблицы',
+ 'password' => 'Пароль HTTP',
+ 'type' => 'Тип базы данных',
+ 'username' => 'Имя пользователя HTTP',
+ ),
+ 'check' => array(
+ '_' => 'Проверки',
+ 'already_installed' => 'Обнаружена предыдущая установка FreshRSS!',
+ 'cache' => array(
+ 'nok' => 'Проверьте права доступа к папке <em>./data/cache</em> . Сервер HTTP должен иметь права на запись в эту папку.',
+ 'ok' => 'Права на папку кэша в порядке.',
+ ),
+ 'ctype' => array(
+ 'nok' => 'У вас не установлена необходимая библиотека для проверки типов символов (php-ctype).',
+ 'ok' => 'У вас установлена необходимая библиотека для проверки типов символов (ctype).',
+ ),
+ 'curl' => array(
+ 'nok' => 'У вас нет расширения cURL (пакет php5-curl).',
+ 'ok' => 'У вас установлено расширение cURL.',
+ ),
+ 'data' => array(
+ 'nok' => 'Проверьте права доступа к папке <em>./data</em> . Сервер HTTP должен иметь права на запись в эту папку.',
+ 'ok' => 'Права на <em>./data/</em> в порядке.',
+ ),
+ 'dom' => array(
+ 'nok' => 'У вас не установлена необходимая библиотека для просмотра DOM (пакет php-xml).',
+ 'ok' => 'У вас установлена необходимая библиотека для просмотра DOM.',
+ ),
+ 'favicons' => array(
+ 'nok' => 'Проверьте права доступа к папке <em>./data/favicons</em> . Сервер HTTP должен иметь права на запись в эту папку.',
+ 'ok' => 'Права на папку значков в порядке.',
+ ),
+ 'http_referer' => array(
+ 'nok' => 'Убедитесь, что вы не изменяете ваш HTTP REFERER.',
+ 'ok' => 'Ваш HTTP REFERER известен и соотвествует вашему серверу.',
+ ),
+ 'minz' => array(
+ 'nok' => 'У вас не установлен фрейворк Minz.',
+ 'ok' => 'У вас установлен фрейворк Minz.',
+ ),
+ 'pcre' => array(
+ 'nok' => 'У вас не установлена необходимая библиотека для работы с регулярными выражениями (php-pcre).',
+ 'ok' => 'У вас установлена необходимая библиотека для работы с регулярными выражениями (PCRE).',
+ ),
+ 'pdo' => array(
+ 'nok' => 'У вас не установлен PDO или один из необходимых драйверов (pdo_mysql, pdo_sqlite).',
+ 'ok' => 'У вас установлен PDO и как минимум один из поддерживаемых драйверов (pdo_mysql, pdo_sqlite).',
+ ),
+ 'persona' => array(
+ 'nok' => 'Проверьте права доступа к папке <em>./data/persona</em> . Сервер HTTP должен иметь права на запись в эту папку.',
+ 'ok' => 'Права на папку Mozilla Persona в порядке.',
+ ),
+ 'php' => array(
+ 'nok' => 'У вас установлен PHP версии %s, но FreshRSS необходима версия не ниже %s.',
+ 'ok' => 'У вас установлен PHP версии %s, который совместим с FreshRSS.',
+ ),
+ 'users' => array(
+ 'nok' => 'Проверьте права доступа к папке <em>./data/users</em> . Сервер HTTP должен иметь права на запись в эту папку.',
+ 'ok' => 'Права на папку users в порядке.',
+ ),
+ ),
+ 'conf' => array(
+ '_' => 'Общие настройки',
+ 'ok' => 'Общие настройки были сохранены.',
+ ),
+ 'congratulations' => 'Поздравляем!',
+ 'default_user' => 'Имя пользователя по умолчанию <small>(максимум 16 латинских букв и/или цифр)</small>',
+ 'delete_articles_after' => 'Удалять статьи после',
+ 'fix_errors_before' => 'Пожалуйста, исправьте ошибки прежде чем переходить к следующему этапу..',
+ 'javascript_is_better' => 'FreshRSS принесёт больше удовольствия, если включить JavaScript',
+ 'js' => array(
+ 'confirm_reinstall' => 'Переустанавливая FreshRSS, вы потеряете предыдущую конфигурацию. Вы хотите продолжить?',
+ ),
+ 'language' => array(
+ '_' => 'Язык',
+ 'choose' => 'Выберите язык для FreshRSS',
+ 'defined' => 'Язык выбран.',
+ ),
+ 'not_deleted' => 'Что-то пошло не так; удалите файл <em>%s</em> вручную.',
+ 'ok' => 'Установка успешна.',
+ 'step' => '%d этап',
+ 'steps' => 'Этапы',
+ 'title' => 'Установка · FreshRSS',
+ 'this_is_the_end' => 'Это конец',
+);
diff --git a/app/i18n/ru/sub.php b/app/i18n/ru/sub.php
new file mode 100644
index 000000000..aaaa02827
--- /dev/null
+++ b/app/i18n/ru/sub.php
@@ -0,0 +1,62 @@
+<?php
+
+return array(
+ 'category' => array(
+ '_' => 'Category',
+ 'add' => 'Add a category',
+ 'empty' => 'Empty category',
+ 'new' => 'New category',
+ ),
+ 'feed' => array(
+ 'add' => 'Add a RSS feed',
+ 'advanced' => 'Advanced',
+ 'archiving' => 'Archivage',
+ 'auth' => array(
+ 'configuration' => 'Login',
+ 'help' => 'Connection allows to access HTTP protected RSS feeds',
+ 'http' => 'HTTP Authentication',
+ 'password' => 'HTTP password',
+ 'username' => 'HTTP username',
+ ),
+ 'css_help' => 'Retrieves truncated RSS feeds (caution, requires more time!)',
+ 'css_path' => 'Articles CSS path on original website',
+ 'description' => 'Description',
+ 'empty' => 'This feed is empty. Please verify that it is still maintained.',
+ 'error' => 'This feed has encountered a problem. Please verify that it is always reachable then actualize it.',
+ 'in_main_stream' => 'Show in main stream',
+ 'informations' => 'Information',
+ 'keep_history' => 'Minimum number of articles to keep',
+ 'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',
+ 'no_selected' => 'No feed selected.',
+ 'number_entries' => '%d articles',
+ 'stats' => 'Statistics',
+ 'think_to_add' => 'You may add some feeds.',
+ 'title' => 'Title',
+ 'title_add' => 'Add a RSS feed',
+ 'ttl' => 'Do not automatically refresh more often than',
+ 'url' => 'Feed URL',
+ 'validator' => 'Check the validity of the feed',
+ 'website' => 'Website URL',
+ 'pubsubhubbub' => 'Instant notification with PubSubHubbub',
+ ),
+ 'import_export' => array(
+ 'export' => 'Export',
+ 'export_opml' => 'Export list of feeds (OPML)',
+ 'export_starred' => 'Export your favourites',
+ 'feed_list' => 'List of %s articles',
+ 'file_to_import' => 'File to import<br />(OPML, Json or Zip)',
+ 'file_to_import_no_zip' => 'File to import<br />(OPML or Json)',
+ 'import' => 'Import',
+ 'starred_list' => 'List of favourite articles',
+ 'title' => 'Import / export',
+ ),
+ 'menu' => array(
+ 'bookmark' => 'Subscribe (FreshRSS bookmark)',
+ 'import_export' => 'Import / export',
+ 'subscription_management' => 'Subscriptions management',
+ ),
+ 'title' => array(
+ '_' => 'Subscriptions management',
+ 'feed_management' => 'RSS feeds management',
+ ),
+);
diff --git a/app/i18n/tr/gen.php b/app/i18n/tr/gen.php
index f987a8e6c..492e2cb9b 100644
--- a/app/i18n/tr/gen.php
+++ b/app/i18n/tr/gen.php
@@ -122,6 +122,7 @@ return array(
'fr' => 'Français',
'it' => 'Italiano',
'nl' => 'Nederlands',
+ 'ru' => 'Русский',
'tr' => 'Türkçe',
),
'menu' => array(
@@ -164,7 +165,8 @@ return array(
'print' => 'Print',
'shaarli' => 'Shaarli',
'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'wallabag' => 'wallabag v1',
+ 'wallabagv2' => 'wallabag v2',
'jdh' => 'Journal du hacker',
),
'short' => array(
diff --git a/app/i18n/tr/install.php b/app/i18n/tr/install.php
index d4c7c4cd5..85134845b 100644
--- a/app/i18n/tr/install.php
+++ b/app/i18n/tr/install.php
@@ -63,8 +63,8 @@ return array(
'ok' => 'HTTP REFERER ve sunucunuz arası iletişim sorunsuz.',
),
'json' => array(
- 'nok' => 'You lack a recommended library to parse JSON.',
- 'ok' => 'You have a recommended library to parse JSON.',
+ 'nok' => 'Tavsiye edilen JSON çözümleme kütüphanesi eksik.',
+ 'ok' => 'Tavsiye edilen JSON çözümleme kütüphanesi sorunsuz.',
),
'minz' => array(
'nok' => 'Minz framework eksik.',
diff --git a/app/install.php b/app/install.php
index b47effc84..062f66814 100644
--- a/app/install.php
+++ b/app/install.php
@@ -309,7 +309,7 @@ function checkStep0() {
}
function checkStep1() {
- $php = version_compare(PHP_VERSION, '5.2.1') >= 0;
+ $php = version_compare(PHP_VERSION, '5.3.0') >= 0;
$minz = file_exists(join_path(LIB_PATH, 'Minz'));
$curl = extension_loaded('curl');
$pdo_mysql = extension_loaded('pdo_mysql');
@@ -536,7 +536,7 @@ function printStep1() {
<?php if ($res['php'] == 'ok') { ?>
<p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.php.ok', PHP_VERSION); ?></p>
<?php } else { ?>
- <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.php.nok', PHP_VERSION, '5.2.1'); ?></p>
+ <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.php.nok', PHP_VERSION, '5.3.0'); ?></p>
<?php } ?>
<?php if ($res['minz'] == 'ok') { ?>
diff --git a/app/layout/layout.phtml b/app/layout/layout.phtml
index 99a3717bc..6906fa05f 100644
--- a/app/layout/layout.phtml
+++ b/app/layout/layout.phtml
@@ -1,17 +1,32 @@
-<?php
- FreshRSS::preLayout();
-?>
+<?php FreshRSS::preLayout(); ?>
<!DOCTYPE html>
<html lang="<?php echo FreshRSS_Context::$user_conf->language; ?>" xml:lang="<?php echo FreshRSS_Context::$user_conf->language; ?>">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="initial-scale=1.0" />
- <?php echo self::headTitle(); ?>
<?php echo self::headStyle(); ?>
<script id="jsonVars" type="application/json">
<?php $this->renderHelper('javascript_vars'); ?>
</script>
<?php echo self::headScript(); ?>
+ <link rel="shortcut icon" id="favicon" type="image/x-icon" sizes="16x16 64x64" href="<?php echo Minz_Url::display('/favicon.ico'); ?>" />
+ <link rel="icon msapplication-TileImage apple-touch-icon" type="image/png" sizes="256x256" href="<?php echo Minz_Url::display('/themes/icons/favicon-256.png'); ?>" />
+ <link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('starred', true); ?>">
+ <link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('non-starred', true); ?>">
+ <link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('read', true); ?>">
+ <link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('unread', true); ?>">
+ <link rel="apple-touch-icon" href="<?php echo Minz_Url::display('/themes/icons/apple-touch-icon.png'); ?>">
+ <meta name="apple-mobile-web-app-capable" content="yes" />
+ <meta name="apple-mobile-web-app-status-bar-style" content="black" />
+ <meta name="apple-mobile-web-app-title" content="<?php echo FreshRSS_Context::$system_conf->title; ?>">
+ <meta name="msapplication-TileColor" content="#FFF" />
+<?php
+ flush();
+ if (isset($this->callbackBeforeContent)) {
+ call_user_func($this->callbackBeforeContent);
+ }
+?>
+ <?php echo self::headTitle(); ?>
<?php
$url_base = Minz_Request::currentRequest();
if (FreshRSS_Context::$next_id !== '') {
@@ -20,26 +35,13 @@
$url_next['params']['ajax'] = 1;
?>
<link id="prefetch" rel="next prefetch" href="<?php echo Minz_Url::display($url_next); ?>" />
-<?php } ?>
- <link rel="shortcut icon" id="favicon" type="image/x-icon" sizes="16x16 64x64" href="<?php echo Minz_Url::display('/favicon.ico'); ?>" />
- <link rel="icon msapplication-TileImage apple-touch-icon" type="image/png" sizes="256x256" href="<?php echo Minz_Url::display('/themes/icons/favicon-256.png'); ?>" />
<?php
- if (isset($this->rss_title)) {
+ } if (isset($this->rss_title)) {
$url_rss = $url_base;
$url_rss['a'] = 'rss';
?>
<link rel="alternate" type="application/rss+xml" title="<?php echo $this->rss_title; ?>" href="<?php echo Minz_Url::display($url_rss); ?>" />
-<?php } ?>
- <link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('starred', true); ?>">
- <link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('non-starred', true); ?>">
- <link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('read', true); ?>">
- <link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('unread', true); ?>">
- <link rel="apple-touch-icon" href="<?php echo Minz_Url::display('/themes/icons/apple-touch-icon.png'); ?>">
- <meta name="apple-mobile-web-app-capable" content="yes" />
- <meta name="apple-mobile-web-app-status-bar-style" content="black" />
- <meta name="apple-mobile-web-app-title" content="<?php echo FreshRSS_Context::$system_conf->title; ?>">
- <meta name="msapplication-TileColor" content="#FFF" />
-<?php if (FreshRSS_Context::$system_conf->allow_robots) { ?>
+<?php } if (FreshRSS_Context::$system_conf->allow_robots) { ?>
<meta name="description" content="<?php echo htmlspecialchars(FreshRSS_Context::$name . ' | ' . FreshRSS_Context::$description, ENT_COMPAT, 'UTF-8'); ?>" />
<?php } else { ?>
<meta name="robots" content="noindex,nofollow" />
diff --git a/app/views/entry/bookmark.phtml b/app/views/entry/bookmark.phtml
index c346d2c4c..6b5a4ed03 100755
--- a/app/views/entry/bookmark.phtml
+++ b/app/views/entry/bookmark.phtml
@@ -13,4 +13,5 @@ $url = Minz_Url::display(array(
'params' => Minz_Request::params(),
));
+FreshRSS::loadStylesAndScripts();
echo json_encode(array('url' => str_ireplace('&amp;', '&', $url), 'icon' => _i(Minz_Request::param('is_favorite') ? 'non-starred' : 'starred')));
diff --git a/app/views/entry/read.phtml b/app/views/entry/read.phtml
index fabdec9e0..7d0e3de82 100755
--- a/app/views/entry/read.phtml
+++ b/app/views/entry/read.phtml
@@ -13,4 +13,5 @@ $url = Minz_Url::display(array(
'params' => Minz_Request::params(),
));
+FreshRSS::loadStylesAndScripts();
echo json_encode(array('url' => str_ireplace('&amp;', '&', $url), 'icon' => _i(Minz_Request::param('is_read') ? 'unread' : 'read')));
diff --git a/app/views/helpers/feed/update.phtml b/app/views/helpers/feed/update.phtml
index 12f485ec3..72084d8fa 100644
--- a/app/views/helpers/feed/update.phtml
+++ b/app/views/helpers/feed/update.phtml
@@ -48,7 +48,7 @@
<a class="btn" target="_blank" href="<?php echo $this->feed->url(); ?>"><?php echo _i('link'); ?></a>
</div>
- <a class="btn" target="_blank" href="http://validator.w3.org/feed/check.cgi?url=<?php echo $this->feed->url(); ?>"><?php echo _t('sub.feed.validator'); ?></a>
+ <a class="btn" target="_blank" href="http://validator.w3.org/feed/check.cgi?url=<?php echo rawurlencode(htmlspecialchars_decode($this->feed->url(), ENT_QUOTES)); ?>"><?php echo _t('sub.feed.validator'); ?></a>
</div>
</div>
<div class="form-group">
diff --git a/app/views/update/checkInstall.phtml b/app/views/update/checkInstall.phtml
index a92860c7e..ed3858b56 100644
--- a/app/views/update/checkInstall.phtml
+++ b/app/views/update/checkInstall.phtml
@@ -9,7 +9,7 @@
<p class="alert <?php echo $status ? 'alert-success' : 'alert-error'; ?>">
<?php
if ($key === 'php') {
- echo _t('admin.check_install.' . $key . '.' . ($status ? 'ok' : 'nok'), PHP_VERSION, '5.2.1');
+ echo _t('admin.check_install.' . $key . '.' . ($status ? 'ok' : 'nok'), PHP_VERSION, '5.3.0');
} else {
echo _t('admin.check_install.' . $key . '.' . ($status ? 'ok' : 'nok'));
}