shift
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/sources/app/i18n/ru/feedback.php b/sources/app/i18n/ru/feedback.php
new file mode 100755
index 0000000..c9189c0
--- /dev/null
+++ b/sources/app/i18n/ru/feedback.php
@@ -0,0 +1,110 @@
+ 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. Check FressRSS logs for details.',
+ 'ok' => '%s is now disabled',
+ ),
+ 'enable' => array(
+ 'ko' => '%s cannot be enabled. Check FressRSS logs 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' => '%s has been updated',
+ 'actualizeds' => 'RSS feeds have been updated',
+ 'added' => 'RSS feed %s has been added',
+ 'already_subscribed' => 'You have already subscribed to %s',
+ 'deleted' => 'Feed has been deleted',
+ 'error' => 'Feed cannot be updated',
+ 'internal_problem' => 'The RSS feed could not be added. Check FressRSS logs for details.',
+ 'invalid_url' => 'URL %s 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' => '%s 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 version %s.',
+ 'error' => 'The update process has encountered an error: %s',
+ 'file_is_nok' => 'Check permissions on %s 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/sources/app/i18n/ru/gen.php b/sources/app/i18n/ru/gen.php
new file mode 100755
index 0000000..b8e8511
--- /dev/null
+++ b/sources/app/i18n/ru/gen.php
@@ -0,0 +1,185 @@
+ 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 (1 month)',
+ 'login' => 'Login',
+ 'login_persona' => 'Login with Persona',
+ 'login_persona_problem' => 'Connection problem with Persona?',
+ 'logout' => 'Logout',
+ 'password' => array(
+ '_' => 'Password',
+ 'format' => 'At least 7 characters',
+ ),
+ 'registration' => array(
+ '_' => 'New account',
+ 'ask' => 'Create an account?',
+ 'title' => 'Account creation',
+ ),
+ 'reset' => 'Authentication reset',
+ 'username' => array(
+ '_' => 'Username',
+ 'admin' => 'Administrator username',
+ 'format' => 'maximum 16 alphanumeric characters',
+ ),
+ '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 %s',
+ 'by_default' => 'By default',
+ 'damn' => 'Damn!',
+ 'default_category' => 'Uncategorized',
+ 'no' => 'No',
+ 'not_applicable' => 'Not available',
+ 'ok' => 'Ok!',
+ 'or' => 'or',
+ 'yes' => 'Yes',
+ ),
+);
diff --git a/sources/app/i18n/ru/index.php b/sources/app/i18n/ru/index.php
new file mode 100755
index 0000000..80fa3d9
--- /dev/null
+++ b/sources/app/i18n/ru/index.php
@@ -0,0 +1,61 @@
+ array(
+ '_' => 'About',
+ 'agpl3' => 'AGPL 3',
+ 'bugs_reports' => 'Bugs reports',
+ 'credits' => 'Credits',
+ 'credits_content' => 'Some design elements come from Bootstrap although FreshRSS doesn’t use this framework. Icons come from GNOME project. Open Sans font police has been created by Steve Matteson. Favicons are collected with getFavicon API. FreshRSS is based on Minz, a PHP framework.',
+ 'freshrss_description' => 'FreshRSS is a RSS feeds aggregator to self-host like Kriss Feed or Leed. It is light and easy to take in hand while being powerful and configurable tool.',
+ 'github' => 'on Github',
+ '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/sources/app/i18n/ru/install.php b/sources/app/i18n/ru/install.php
new file mode 100755
index 0000000..c838b2e
--- /dev/null
+++ b/sources/app/i18n/ru/install.php
@@ -0,0 +1,113 @@
+ array(
+ 'finish' => 'Завершить установку',
+ 'fix_errors_before' => 'Пожалуйста, исправьте ошибки прежде чем переходить к следующему этапу.',
+ 'keep_install' => 'Сохранить предыдущую установку',
+ 'next_step' => 'Перейти к следующему этапу',
+ 'reinstall' => 'Переустановить FreshRSS',
+ ),
+ 'auth' => array(
+ 'email_persona' => 'Почта (логин) для shift
tuşu ile tüm makaleler okundu olarak işaretlenir',
+ 'title' => 'Kısayollar',
+ 'user_filter' => 'Kullanıcı filtrelerine eriş',
+ 'user_filter_help' => 'Eğer tek filtre varsa o kullanılır. Yoksa filtrelerin kendi numaralarıyla kullanılır.',
+ ),
+ 'user' => array(
+ 'articles_and_size' => '%s makale (%s)',
+ 'current' => 'Mevcut kullanıcı',
+ 'is_admin' => 'yöneticidir',
+ 'users' => 'Kullanıcılar',
+ ),
+);
diff --git a/sources/app/i18n/tr/feedback.php b/sources/app/i18n/tr/feedback.php
new file mode 100755
index 0000000..0572c6d
--- /dev/null
+++ b/sources/app/i18n/tr/feedback.php
@@ -0,0 +1,110 @@
+ array(
+ 'optimization_complete' => 'Optimizasyon tamamlandı',
+ ),
+ 'access' => array(
+ 'denied' => 'Bu sayfaya erişim yetkiniz yok',
+ 'not_found' => 'Varolmayan bir sayfa arıyorsunuz',
+ ),
+ 'auth' => array(
+ 'form' => array(
+ 'not_set' => 'Sistem yapılandırma kimlik doğrulaması sırasında hata oldu. Lütfen daha sonra tekrar deneyin.',
+ 'set' => 'Kimlik doğrulama sistemi tamamnaldı.',
+ ),
+ 'login' => array(
+ 'invalid' => 'Giriş geçersiz',
+ 'success' => 'Bağlantı kuruldu',
+ ),
+ 'logout' => array(
+ 'success' => 'Bağlantı koptu',
+ ),
+ 'no_password_set' => 'Yönetici şifresi ayarlanmadı. Bu özellik kullanıma uygun değil.',
+ 'not_persona' => 'Sadece Persona sistem sıfırlanabilir.',
+ ),
+ 'conf' => array(
+ 'error' => 'Yapılandırma ayarları kaydedilirken hata oluştu',
+ 'query_created' => 'Sorgu "%s" oluşturuldu.',
+ 'shortcuts_updated' => 'Kısayollar yenilendi',
+ 'updated' => 'Yapılandırm ayarları yenilendi',
+ ),
+ 'extensions' => array(
+ 'already_enabled' => '%s zaten aktif',
+ 'disable' => array(
+ 'ko' => '%s gösterilemiyor. Detaylar için FressRSS log kayıtlarını kontrol edin.',
+ 'ok' => '%s pasif',
+ ),
+ 'enable' => array(
+ 'ko' => '%s aktifleştirilemiyor. Detaylar için FressRSS log kayıtlarını kontrol edin.',
+ 'ok' => '%s aktif',
+ ),
+ 'no_access' => '%s de yetkiniz yok',
+ 'not_enabled' => '%s henüz aktif değil',
+ 'not_found' => '%s bulunmamaktadır',
+ ),
+ 'import_export' => array(
+ 'export_no_zip_extension' => 'Zip eklentisi mevcut sunucunuzda yer almıyor. Lütfen başka dosya formatında dışarı aktarmayı deneyin.',
+ 'feeds_imported' => 'Akışlarınız içe aktarıldı ve şimdi güncellenecek',
+ 'feeds_imported_with_errors' => 'Akışlarınız içeri aktarıldı ama bazı hatalar meydana geldi',
+ 'file_cannot_be_uploaded' => 'Dosya yüklenemedi!',
+ 'no_zip_extension' => 'Zip eklentisi mevcut sunucunuzda yer almıyor.',
+ 'zip_error' => 'Zip içe aktarımı sırasında hata meydana geldi.',
+ ),
+ 'sub' => array(
+ 'actualize' => 'Güncelleme',
+ 'category' => array(
+ 'created' => 'Kategori %s oluşturuldu.',
+ 'deleted' => 'Kategori silindi.',
+ 'emptied' => 'Kategori boşaltıldı',
+ 'error' => 'Kategori güncellenemedi',
+ 'name_exists' => 'Kategori ismi zaten bulunmakta.',
+ 'no_id' => 'Kategori id sinden emin olmalısınız.',
+ 'no_name' => 'Kategori ismi boş olamaz.',
+ 'not_delete_default' => 'Öntanımlı kategoriyi silemezsiniz!',
+ 'not_exist' => 'Kategori bulunmamakta!',
+ 'over_max' => 'Kategori limitini aştınız (%d)',
+ 'updated' => 'Karegori güncellendi.',
+ ),
+ 'feed' => array(
+ 'actualized' => '%s güncellendi',
+ 'actualizeds' => 'RSS akışları güncellendi',
+ 'added' => '%s RSS akışı eklendi',
+ 'already_subscribed' => '%s için zaten aboneliğiniz bulunmakta',
+ 'deleted' => 'Akış silindi',
+ 'error' => 'Akış güncellenemiyor',
+ 'internal_problem' => 'RSS akışı eklenemiyor. Detaylar için FressRSS log kayıtlarını kontrol edin.',
+ 'invalid_url' => 'URL %s geçersiz',
+ 'marked_read' => 'Akışlar okundu olarak işaretlendi',
+ 'n_actualized' => '%d akışları güncellendi',
+ 'n_entries_deleted' => '%d makaleleri silindi',
+ 'no_refresh' => 'Yenilenecek akış yok…',
+ 'not_added' => '%s eklenemedi',
+ 'over_max' => 'Akış limitini aştınız (%d)',
+ 'updated' => 'Akış güncellendi',
+ ),
+ 'purge_completed' => 'Temizleme tamamlandı (%d makale silindi)',
+ ),
+ 'update' => array(
+ 'can_apply' => 'FreshRSS %s versiyonuna güncellenecek.',
+ 'error' => 'Güncelleme işlemi sırasında hata: %s',
+ 'file_is_nok' => '%s klasör yetkisini kontrol edin. HTTP yazma yetkisi olmalı',
+ 'finished' => 'Güncelleme tamamlandı!',
+ 'none' => 'Güncelleme yok',
+ 'server_not_found' => 'Güncelleme sunucusu bulunamadı. [%s]',
+ ),
+ 'user' => array(
+ 'created' => array(
+ '_' => '%s kullanıcısı oluşturuldu',
+ 'error' => '%s kullanıcısı oluşturulamadı',
+ ),
+ 'deleted' => array(
+ '_' => '%s kullanıcısı silindi',
+ 'error' => '%s kullanıcısı silinemedi',
+ ),
+ ),
+ 'profile' => array(
+ 'error' => 'Profiliniz düzenlenemedi',
+ 'updated' => 'Profiliniz düzenlendi',
+ ),
+);
diff --git a/sources/app/i18n/tr/gen.php b/sources/app/i18n/tr/gen.php
new file mode 100755
index 0000000..492e2cb
--- /dev/null
+++ b/sources/app/i18n/tr/gen.php
@@ -0,0 +1,185 @@
+ array(
+ 'actualize' => 'Yenile',
+ 'back_to_rss_feeds' => '← RSS akışlarınız için geri gidin',
+ 'cancel' => 'İptal',
+ 'create' => 'Oluştur',
+ 'disable' => 'Pasif',
+ 'empty' => 'Boş',
+ 'enable' => 'Aktif',
+ 'export' => 'Dışa Aktar',
+ 'filter' => 'Filtrele',
+ 'import' => 'İçe Aktar',
+ 'manage' => 'Yönet',
+ 'mark_read' => 'Okundu olarak işaretle',
+ 'mark_favorite' => 'Favoriye ekle',
+ 'remove' => 'Sil',
+ 'see_website' => 'Siteyi gör',
+ 'submit' => 'Onayla',
+ 'truncate' => 'Tüm makaleleri sil',
+ ),
+ 'auth' => array(
+ 'email' => 'Email adresleri',
+ 'keep_logged_in' => '(1 ay) oturumu açık tut',
+ 'login' => 'Giriş',
+ 'login_persona' => 'Persona ile giriş yap',
+ 'login_persona_problem' => 'Persona ile bağlantı sorununuz mu var ?',
+ 'logout' => 'Çıkış',
+ 'password' => array(
+ '_' => 'Şifre',
+ 'format' => 'En az 7 karakter',
+ ),
+ 'registration' => array(
+ '_' => 'Yeni hesap',
+ 'ask' => 'Yeni bir hesap oluştur',
+ 'title' => 'Hesap oluşturma',
+ ),
+ 'reset' => 'Kimlik doğrulama sıfırla',
+ 'username' => array(
+ '_' => 'Kullancı adı',
+ 'admin' => 'Yönetici kullanıcı adı',
+ 'format' => 'en fazla 16 alfanümerik karakter',
+ ),
+ 'will_reset' => 'Kimlik doğrulama sistemi sıfırlanacak: Persone yerine bir form kullanılacak.',
+ ),
+ 'date' => array(
+ 'Apr' => '\\N\\i\\s\\a\\n',
+ 'Aug' => '\\A\\ğ\\u\\s\\t\\o\\s',
+ 'Dec' => '\\A\\r\\a\\l\\ı\\k',
+ 'Feb' => '\\Ş\\u\\b\\a\\t',
+ 'Jan' => '\\O\\c\\a\\k',
+ 'Jul' => '\\T\\e\\m\\m\\u\\z',
+ 'Jun' => '\\H\\a\\z\\i\\r\\a\\n',
+ 'Mar' => '\\M\\a\\r\\t',
+ 'May' => '\\M\\a\\y\\ı\\s',
+ 'Nov' => '\\K\\a\\s\\ı\\m',
+ 'Oct' => '\\E\\k\\i\\m',
+ 'Sep' => '\\E\\y\\l\\ü\\l',
+ 'apr' => 'nis',
+ 'april' => 'Nis',
+ 'aug' => 'ağu',
+ 'august' => 'Ağu',
+ 'before_yesterday' => 'Dünden önceki gün',
+ 'dec' => 'ara',
+ 'december' => 'Ara',
+ 'feb' => 'şub',
+ 'february' => 'Şub',
+ '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' => 'Cum',
+ 'jan' => 'oca',
+ 'january' => 'Oca',
+ 'jul' => 'tem',
+ 'july' => 'Tem',
+ 'jun' => 'haz',
+ 'june' => 'Haz',
+ 'last_3_month' => 'Son 3 ay',
+ 'last_6_month' => 'Son 6 ay',
+ 'last_month' => 'Geçen ay',
+ 'last_week' => 'Geçen hafta',
+ 'last_year' => 'Geçen yıl',
+ 'mar' => 'mar',
+ 'march' => 'Mar',
+ 'may' => 'May',
+ 'mon' => 'Pzt',
+ 'month' => 'ay',
+ 'nov' => 'kas',
+ 'november' => 'Kas',
+ 'oct' => 'ekm',
+ 'october' => 'Ekm',
+ 'sat' => 'Cts',
+ 'sep' => 'eyl',
+ 'september' => 'Eyl',
+ 'sun' => 'Pzr',
+ 'thu' => 'Per',
+ 'today' => 'Bugün',
+ 'tue' => 'Sal',
+ 'wed' => 'Çar',
+ 'yesterday' => 'Dün',
+ ),
+ 'freshrss' => array(
+ '_' => 'FreshRSS',
+ 'about' => 'FreshRSS hakkında',
+ ),
+ 'js' => array(
+ 'category_empty' => 'Boş kategori',
+ 'confirm_action' => 'Bunu yapmak istediğinize emin misiniz ? Daha sonra iptal edilemez!',
+ 'confirm_action_feed_cat' => 'Bunu yapmak istediğinize emin misiniz ? Favorileriniz ve sorgularınız silinecek. Daha sonra iptal edilemez!',
+ 'feedback' => array(
+ 'body_new_articles' => 'FreshRSS de okunmaz üzere %%d yeni makale var.',
+ 'request_failed' => 'Hata. İnternet bağlantınızı kontrol edin.',
+ 'title_new_articles' => 'FreshRSS: yeni makaleler!',
+ ),
+ 'new_article' => 'Yeni makaleler mevcut. Sayfayı yenilemek için tıklayın.',
+ 'should_be_activated' => 'JavaScript aktif olmalıdır.',
+ ),
+ 'lang' => array(
+ 'cz' => 'Čeština',
+ 'de' => 'Deutsch',
+ 'en' => 'English',
+ 'fr' => 'Français',
+ 'it' => 'Italiano',
+ 'nl' => 'Nederlands',
+ 'ru' => 'Русский',
+ 'tr' => 'Türkçe',
+ ),
+ 'menu' => array(
+ 'about' => 'Hakkında',
+ 'admin' => 'Yönetim',
+ 'archiving' => 'Arşiv',
+ 'authentication' => 'Kimlik doğrulama',
+ 'check_install' => 'Kurulum kontrolü',
+ 'configuration' => 'Yapılandırma',
+ 'display' => 'Görünüm',
+ 'extensions' => 'Eklentiler',
+ 'logs' => 'Log kayıtları',
+ 'queries' => 'Kullanıcı sorguları',
+ 'reading' => 'Okuma',
+ 'search' => 'Kelime veya #etiket ara',
+ 'sharing' => 'Paylaşım',
+ 'shortcuts' => 'Kısayollar',
+ 'stats' => 'İstatistikler',
+ 'system' => 'Sistem yapılandırması',
+ 'update' => 'Güncelleme',
+ 'user_management' => 'Kullanıcıları yönet',
+ 'user_profile' => 'Profil',
+ ),
+ 'pagination' => array(
+ 'first' => 'İlk',
+ 'last' => 'Son',
+ 'load_more' => 'Daha fazla makale yükle',
+ 'mark_all_read' => 'Tümünü okundu say',
+ 'next' => 'Sonraki',
+ 'nothing_to_load' => 'Başka makale yok',
+ 'previous' => 'Önceki',
+ ),
+ 'share' => array(
+ 'blogotext' => 'Blogotext',
+ 'diaspora' => 'Diaspora*',
+ 'email' => 'Email',
+ 'facebook' => 'Facebook',
+ 'g+' => 'Google+',
+ 'movim' => 'Movim',
+ 'print' => 'Print',
+ 'shaarli' => 'Shaarli',
+ 'twitter' => 'Twitter',
+ 'wallabag' => 'wallabag v1',
+ 'wallabagv2' => 'wallabag v2',
+ 'jdh' => 'Journal du hacker',
+ ),
+ 'short' => array(
+ 'attention' => 'Tehlike!',
+ 'blank_to_disable' => 'Devredışı bırakmak için boş bırakın',
+ 'by_author' => '%s tarafından',
+ 'by_default' => 'Öntanımlı',
+ 'damn' => 'Hay aksi!',
+ 'default_category' => 'Kategorisiz',
+ 'no' => 'Hayır',
+ 'not_applicable' => 'Uygun değil',
+ 'ok' => 'Tamam!',
+ 'or' => 'ya da',
+ 'yes' => 'Evet',
+ ),
+);
diff --git a/sources/app/i18n/tr/index.php b/sources/app/i18n/tr/index.php
new file mode 100755
index 0000000..9912203
--- /dev/null
+++ b/sources/app/i18n/tr/index.php
@@ -0,0 +1,61 @@
+ array(
+ '_' => 'Hakkında',
+ 'agpl3' => 'AGPL 3',
+ 'bugs_reports' => 'Hata raporu',
+ 'credits' => 'Tanıtım',
+ 'credits_content' => 'Bu frameworkü kullanmamasına rağmen FreshRSS bazı tasarım ögelerini Bootstrap dan almıştır. İkonlar GNOME projesinden alınmıştır. Open Sans yazı tipi Steve Matteson tarafından oluşturulmuştur. Site ikonları getFavicon API ile oluşturuldu. FreshRSS bir PHP framework olan Minz i temel alır.',
+ 'freshrss_description' => 'FreshRSS Kriss Feed veya Leed gibi kendi hostunuzda çalışan bir RSS akış toplayıcısıdır. Güçlü ve yapılandırılabilir araçlarıyla basit ve kullanımı kolay bir uygulamadır.',
+ 'github' => 'Github sayfası',
+ 'license' => 'Lisans',
+ 'project_website' => 'Proje sayfası',
+ 'title' => 'Hakkında',
+ 'version' => 'Versiyon',
+ 'website' => 'Website',
+ ),
+ 'feed' => array(
+ 'add' => 'Akış ekleyebilirsin.',
+ 'empty' => 'Gösterilecek makale yok.',
+ 'rss_of' => 'RSS feed of %s',
+ 'title' => 'RSS akışlarınız',
+ 'title_global' => 'Global görünüm',
+ 'title_fav' => 'Favorilerin',
+ ),
+ 'log' => array(
+ '_' => 'Log Kayıtları',
+ 'clear' => 'Log kayıt dosyasını temizle',
+ 'empty' => 'Log kayır dosyası boş',
+ 'title' => 'Log Kayıtları',
+ ),
+ 'menu' => array(
+ 'about' => 'FreshRSS hakkında',
+ 'add_query' => 'Sorgu ekle',
+ 'before_one_day' => 'Bir gün önce',
+ 'before_one_week' => 'Bir hafta önce',
+ 'favorites' => 'Favoriler (%s)',
+ 'global_view' => 'Global görünüm',
+ 'main_stream' => 'Ana akış',
+ 'mark_all_read' => 'Hepsini okundu olarak işaretle',
+ 'mark_cat_read' => 'Kategoriyi okundu olarak işaretle',
+ 'mark_feed_read' => 'Akışı okundu olarak işaretle',
+ 'newer_first' => 'Önce yeniler',
+ 'non-starred' => 'Favori dışındakileri göster',
+ 'normal_view' => 'Normal görünüm',
+ 'older_first' => 'Önce eskiler',
+ 'queries' => 'Kullanıcı sorguları',
+ 'read' => 'Okunmuşları göster',
+ 'reader_view' => 'Okuma görünümü',
+ 'rss_view' => 'RSS akışı',
+ 'search_short' => 'Ara',
+ 'starred' => 'Favorileri göster',
+ 'stats' => 'İstatistikler',
+ 'subscription' => 'Abonelik yönetimi',
+ 'unread' => 'Okunmamışları göster',
+ ),
+ 'share' => 'Share',
+ 'tag' => array(
+ 'related' => 'İlgili etiketler',
+ ),
+);
diff --git a/sources/app/i18n/tr/install.php b/sources/app/i18n/tr/install.php
new file mode 100755
index 0000000..8513484
--- /dev/null
+++ b/sources/app/i18n/tr/install.php
@@ -0,0 +1,121 @@
+ array(
+ 'finish' => 'Kurulumu tamamla',
+ 'fix_errors_before' => 'Lütfen sonraki adıma geçmek için hataları düzeltin.',
+ 'keep_install' => 'Önceki kuruluma devam et',
+ 'next_step' => 'Sonraki adım',
+ 'reinstall' => 'FreshRSS i yeniden yükle',
+ ),
+ 'auth' => array(
+ 'email_persona' => 'Giriş email adresi-
+
@@ -553,6 +558,12 @@ function printStep1() {
+ +
+ +
+ +
@@ -571,6 +582,12 @@ function printStep1() {
+ +
+ +
+ +
@@ -616,27 +633,6 @@ function printStep1() { - @@ -674,17 +670,17 @@ function printStep2() {
- | - | - | + | + | + | + | |
---|---|---|---|---|---|---|---|
repartition['total']; ?> | -repartition['read']; ?> | -repartition['unread']; ?> | -repartition['favorite']; ?> | +repartition['total']; ?> | +repartition['read']; ?> | +repartition['unread']; ?> | +repartition['favorite']; ?> |
800,
# SimplePie HTTP request timeout in seconds.
- 'timeout' => 10,
+ 'timeout' => 15,
# If a user has not used FreshRSS for more than x seconds,
# then its feeds are not refreshed anymore.
diff --git a/sources/data/force-https.default.txt b/sources/data/force-https.default.txt
new file mode 100755
index 0000000..0446200
--- /dev/null
+++ b/sources/data/force-https.default.txt
@@ -0,0 +1,7 @@
+dailymotion.com
+feedburner.com
+gravatar.com
+gstatic.com
+tumblr.com
+wordpress.com
+youtube.com
diff --git a/sources/data/shares.php b/sources/data/shares.php
index ed06007..1295a26 100755
--- a/sources/data/shares.php
+++ b/sources/data/shares.php
@@ -38,6 +38,15 @@ return array(
'help' => 'http://www.wallabag.org/',
'form' => 'advanced',
),
+ 'wallabagv2' => array(
+ 'url' => '~URL~/bookmarklet?url=~LINK~',
+ 'transform' => array(
+ 'link' => array('rawurlencode'),
+ 'title' => array(),
+ ),
+ 'help' => 'http://www.wallabag.org/',
+ 'form' => 'advanced',
+ ),
'diaspora' => array(
'url' => '~URL~/bookmarklet?url=~LINK~&title=~TITLE~',
'transform' => array('rawurlencode'),
@@ -45,7 +54,7 @@ return array(
'form' => 'advanced',
),
'movim' => array(
- 'url' => '~URL~/index.php/share/~LINK~',
+ 'url' => '~URL~/?share/~LINK~',
'transform' => array('rawurlencode', 'urlencode'),
'help' => 'https://github.com/edhelas/movim',
'form' => 'advanced',
@@ -75,4 +84,9 @@ return array(
'transform' => array(),
'form' => 'simple',
),
+ 'jdh' => array(
+ 'url' => 'https://www.journalduhacker.net/stories/new?url=~LINK~&title=~TITLE~',
+ 'transform' => array('rawurlencode'),
+ 'form' => 'simple',
+ ),
);
diff --git a/sources/lib/Favicon/DataAccess.php b/sources/lib/Favicon/DataAccess.php
index 2bfdf64..17f26b3 100755
--- a/sources/lib/Favicon/DataAccess.php
+++ b/sources/lib/Favicon/DataAccess.php
@@ -15,7 +15,8 @@ class DataAccess {
public function retrieveHeader($url) {
$this->set_context();
- return @get_headers($url, TRUE);
+ $headers = @get_headers($url, 1);
+ return array_change_key_case($headers);
}
public function saveCache($file, $data) {
diff --git a/sources/lib/Favicon/Favicon.php b/sources/lib/Favicon/Favicon.php
index 7ea6ccf..1912050 100755
--- a/sources/lib/Favicon/Favicon.php
+++ b/sources/lib/Favicon/Favicon.php
@@ -99,7 +99,7 @@ class Favicon
switch ($status) {
case '301':
case '302':
- $url = $headers['Location'];
+ $url = isset($headers['location']) ? $headers['location'] : '';
break;
default:
$loop = FALSE;
diff --git a/sources/lib/Minz/Request.php b/sources/lib/Minz/Request.php
index effb994..f80b707 100755
--- a/sources/lib/Minz/Request.php
+++ b/sources/lib/Minz/Request.php
@@ -84,6 +84,17 @@ class Minz_Request {
self::magicQuotesOff();
}
+ /**
+ * Return true if the request is over HTTPS, false otherwise (HTTP)
+ */
+ public static function isHttps() {
+ if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
+ return strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https';
+ } else {
+ return isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on';
+ }
+ }
+
/**
* Try to guess the base URL from $_SERVER information
*
@@ -92,11 +103,7 @@ class Minz_Request {
public static function guessBaseUrl() {
$url = 'http';
- if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
- $https = strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https';
- } else {
- $https = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on';
- }
+ $https = self::isHttps();
if (!empty($_SERVER['HTTP_HOST'])) {
$host = $_SERVER['HTTP_HOST'];
@@ -130,12 +137,11 @@ class Minz_Request {
/**
* Return the base_url from configuration and add a suffix if given.
*
- * @param $base_url_suffix a string to add at base_url (default: empty string)
* @return the base_url with a suffix.
*/
- public static function getBaseUrl($base_url_suffix = '') {
+ public static function getBaseUrl() {
$conf = Minz_Configuration::get('system');
- $url = rtrim($conf->base_url, '/\\') . $base_url_suffix;
+ $url = rtrim($conf->base_url, '/\\');
return filter_var($url, FILTER_SANITIZE_URL);
}
diff --git a/sources/lib/Minz/Session.php b/sources/lib/Minz/Session.php
index 057e774..c94f2b6 100755
--- a/sources/lib/Minz/Session.php
+++ b/sources/lib/Minz/Session.php
@@ -59,18 +59,21 @@ class Minz_Session {
}
}
+ public static function getCookieDir() {
+ // Get the script_name (e.g. /p/i/index.php) and keep only the path.
+ $cookie_dir = empty($_SERVER['REQUEST_URI']) ? '/' : $_SERVER['REQUEST_URI'];
+ if (substr($cookie_dir, -1) !== '/') {
+ $cookie_dir = dirname($cookie_dir) . '/';
+ }
+ return $cookie_dir;
+ }
/**
* Spécifie la durée de vie des cookies
* @param $l la durée de vie
*/
public static function keepCookie($l) {
- // Get the script_name (e.g. /p/i/index.php) and keep only the path.
- $cookie_dir = empty($_SERVER['REQUEST_URI']) ? '/' : $_SERVER['REQUEST_URI'];
- if (substr($cookie_dir, -1) !== '/') {
- $cookie_dir = dirname($cookie_dir) . '/';
- }
- session_set_cookie_params($l, $cookie_dir, '', false, true);
+ session_set_cookie_params($l, self::getCookieDir(), '', Minz_Request::isHttps(), true);
}
@@ -83,11 +86,11 @@ class Minz_Session {
}
public static function deleteLongTermCookie($name) {
- setcookie($name, '', 1, '', '', false, true);
+ setcookie($name, '', 1, '', '', Minz_Request::isHttps(), true);
}
public static function setLongTermCookie($name, $value, $expire) {
- setcookie($name, $value, $expire, '', '', false, true);
+ setcookie($name, $value, $expire, '', '', Minz_Request::isHttps(), true);
}
public static function getLongTermCookie($name) {
diff --git a/sources/lib/Minz/Url.php b/sources/lib/Minz/Url.php
index 4279b04..c7c6712 100755
--- a/sources/lib/Minz/Url.php
+++ b/sources/lib/Minz/Url.php
@@ -24,10 +24,16 @@ class Minz_Url {
$url_string = '';
if ($absolute) {
- $url_string = Minz_Request::getBaseUrl(PUBLIC_TO_INDEX_PATH);
- if ($url_string === PUBLIC_TO_INDEX_PATH) {
+ $url_string = Minz_Request::getBaseUrl();
+ if ($url_string == '') {
$url_string = Minz_Request::guessBaseUrl();
}
+ if ($isArray) {
+ $url_string .= PUBLIC_TO_INDEX_PATH;
+ }
+ if ($absolute === 'root') {
+ $url_string = parse_url($url_string, PHP_URL_PATH);
+ }
} else {
$url_string = $isArray ? '.' : PUBLIC_RELATIVE;
}
diff --git a/sources/lib/SimplePie/SimplePie.php b/sources/lib/SimplePie/SimplePie.php
index 6c0962a..8af55c9 100755
--- a/sources/lib/SimplePie/SimplePie.php
+++ b/sources/lib/SimplePie/SimplePie.php
@@ -1123,6 +1123,7 @@ class SimplePie
$this->strip_attributes(false);
$this->add_attributes(false);
$this->set_image_handler(false);
+ $this->set_https_domains(array());
}
}
@@ -1233,6 +1234,19 @@ class SimplePie
$this->sanitize->set_url_replacements($element_attribute);
}
+ /**
+ * Set the list of domains for which force HTTPS.
+ * @see SimplePie_Sanitize::set_https_domains()
+ * FreshRSS
+ */
+ public function set_https_domains($domains = array())
+ {
+ if (is_array($domains))
+ {
+ $this->sanitize->set_https_domains($domains);
+ }
+ }
+
/**
* Set the handler to enable the display of cached images.
*
@@ -1654,6 +1668,7 @@ class SimplePie
$locate = null;
}
+ $file->body = trim($file->body);
$this->raw_data = $file->body;
$this->permanent_url = $file->permanent_url;
$headers = $file->headers;
diff --git a/sources/lib/SimplePie/SimplePie/Item.php b/sources/lib/SimplePie/SimplePie/Item.php
index 27e9345..19ba7c8 100755
--- a/sources/lib/SimplePie/SimplePie/Item.php
+++ b/sources/lib/SimplePie/SimplePie/Item.php
@@ -2877,6 +2877,7 @@ class SimplePie_Item
$width = null;
$url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0]));
+ $url = $this->feed->sanitize->https_url($url); //FreshRSS
if (isset($enclosure[0]['attribs']['']['type']))
{
$type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
diff --git a/sources/lib/SimplePie/SimplePie/Misc.php b/sources/lib/SimplePie/SimplePie/Misc.php
index 9e7ac4f..2d154cb 100755
--- a/sources/lib/SimplePie/SimplePie/Misc.php
+++ b/sources/lib/SimplePie/SimplePie/Misc.php
@@ -80,8 +80,8 @@ class SimplePie_Misc
public static function absolutize_url($relative, $base)
{
if (substr($relative, 0, 2) === '//')
- {//Allow protocol-relative URLs "//www.example.net" which will pick HTTP or HTTPS automatically
- return $relative;
+ {//Protocol-relative URLs "//www.example.net"
+ return 'https:' . $relative;
}
$iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative);
if ($iri === false)
diff --git a/sources/lib/SimplePie/SimplePie/Sanitize.php b/sources/lib/SimplePie/SimplePie/Sanitize.php
index a6863ec..bdc6011 100755
--- a/sources/lib/SimplePie/SimplePie/Sanitize.php
+++ b/sources/lib/SimplePie/SimplePie/Sanitize.php
@@ -73,6 +73,15 @@ class SimplePie_Sanitize
var $force_fsockopen = false;
var $replace_url_attributes = null;
+ /**
+ * List of domains for which force HTTPS.
+ * @see SimplePie_Sanitize::set_https_domains()
+ * Array is tree split at DNS levels. Example:
+ * array('biz' => true, 'com' => array('example' => true), 'net' => array('example') => array('www' => true))
+ * FreshRSS
+ */
+ var $https_domains = array('com' => array('dailymotion' => true, 'youtube' => true));
+
public function __construct()
{
// Set defaults
@@ -242,6 +251,71 @@ class SimplePie_Sanitize
$this->replace_url_attributes = (array) $element_attribute;
}
+ /**
+ * Set the list of domains for which force HTTPS.
+ * @see SimplePie_Misc::https_url()
+ * Example array('biz', 'example.com', 'example.org', 'www.example.net');
+ * FreshRSS
+ */
+ public function set_https_domains($domains)
+ {
+ $this->https_domains = array();
+ foreach ($domains as $domain)
+ {
+ $domain = trim($domain, ". \t\n\r\0\x0B");
+ $segments = array_reverse(explode('.', $domain));
+ $node =& $this->https_domains;
+ foreach ($segments as $segment)
+ {//Build a tree
+ if ($node === true)
+ {
+ break;
+ }
+ if (!isset($node[$segment]))
+ {
+ $node[$segment] = array();
+ }
+ $node =& $node[$segment];
+ }
+ $node = true;
+ }
+ }
+
+ /**
+ * Check if the domain is in the list of forced HTTPS
+ * FreshRSS
+ */
+ protected function is_https_domain($domain)
+ {
+ $domain = trim($domain, '. ');
+ $segments = array_reverse(explode('.', $domain));
+ $node =& $this->https_domains;
+ foreach ($segments as $segment)
+ {//Explore the tree
+ if (isset($node[$segment]))
+ {
+ $node =& $node[$segment];
+ }
+ else
+ {
+ break;
+ }
+ }
+ return $node === true;
+ }
+
+ /**
+ * Force HTTPS for selected Web sites
+ * FreshRSS
+ */
+ public function https_url($url)
+ {
+ return (strtolower(substr($url, 0, 7)) === 'http://') &&
+ $this->is_https_domain(parse_url($url, PHP_URL_HOST)) ?
+ substr_replace($url, 's', 4, 0) : //Add the 's' to HTTPS
+ $url;
+ }
+
public function sanitize($data, $type, $base = '')
{
$data = trim($data);
@@ -451,7 +525,8 @@ class SimplePie_Sanitize
if ($element->hasAttribute($attribute))
{
$value = $this->registry->call('Misc', 'absolutize_url', array($element->getAttribute($attribute), $this->base));
- if ($value !== false)
+ $value = $this->https_url($value); //FreshRSS
+ if ($value)
{
$element->setAttribute($attribute, $value);
}
diff --git a/sources/lib/lib_opml.php b/sources/lib/lib_opml.php
index 02ae5f5..66b8543 100755
--- a/sources/lib/lib_opml.php
+++ b/sources/lib/lib_opml.php
@@ -105,6 +105,10 @@ function libopml_parse_outline($outline_xml, $strict = true) {
);
}
+ if (empty($outline['text']) && isset($outline['title'])) {
+ $outline['text'] = $outline['title'];
+ }
+
foreach ($outline_xml->children() as $key => $value) {
// An outline may contain any number of outline children
if ($key === 'outline') {
diff --git a/sources/lib/lib_rss.php b/sources/lib/lib_rss.php
index 2a23fca..f89baf9 100755
--- a/sources/lib/lib_rss.php
+++ b/sources/lib/lib_rss.php
@@ -1,20 +1,49 @@
decode($var));
+ function json_decode($var, $assoc = false) {
+ $JSON = new Services_JSON($assoc ? SERVICES_JSON_LOOSE_TYPE : 0);
+ return $JSON->decode($var);
}
}
if (!function_exists('json_encode')) {
require_once('JSON.php');
function json_encode($var) {
- $JSON = new Services_JSON;
+ $JSON = new Services_JSON();
return $JSON->encodeUnsafe($var);
}
}
+if (!function_exists('array_replace_recursive')) { //PHP 5.2
+ function arr_recurse($array, $array1) {
+ foreach ($array1 as $key => $value) {
+ if (!isset($array[$key]) || (isset($array[$key]) && !is_array($array[$key]))) {
+ $array[$key] = array(); //create new key in $array, if it is empty or not an array
+ }
+ if (is_array($value)) {
+ $value = arr_recurse($array[$key], $value); // overwrite the value in the base array
+ }
+ $array[$key] = $value;
+ }
+ return $array;
+ }
+ function array_replace_recursive($array, $array1) { //http://php.net/manual/function.array-replace-recursive.php#92574
+ // handle the arguments, merge one by one
+ $args = func_get_args();
+ $array = $args[0];
+ if (!is_array($array)) {
+ return $array;
+ }
+ for ($i = 1; $i < count($args); $i++) {
+ if (is_array($args[$i])) {
+ $array = arr_recurse($array, $args[$i]);
+ }
+ }
+ return $array;
+ }
+}
+
/**
* Build a directory path by concatenating a list of directory names.
*
@@ -180,7 +209,7 @@ function customSimplePie() {
$simplePie->strip_attributes(array_merge($simplePie->strip_attributes, array(
'autoplay', 'onload', 'onunload', 'onclick', 'ondblclick', 'onmousedown', 'onmouseup',
'onmouseover', 'onmousemove', 'onmouseout', 'onfocus', 'onblur',
- 'onkeypress', 'onkeydown', 'onkeyup', 'onselect', 'onchange', 'seamless')));
+ 'onkeypress', 'onkeydown', 'onkeyup', 'onselect', 'onchange', 'seamless', 'sizes', 'srcset')));
$simplePie->add_attributes(array(
'img' => array('lazyload' => '', 'postpone' => ''), //http://www.w3.org/TR/resource-priorities/
'audio' => array('lazyload' => '', 'postpone' => '', 'preload' => 'none'),
@@ -209,6 +238,16 @@ function customSimplePie() {
'src',
),
));
+ $https_domains = array();
+ $force = @file(DATA_PATH . '/force-https.default.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+ if (is_array($force)) {
+ $https_domains = array_merge($https_domains, $force);
+ }
+ $force = @file(DATA_PATH . '/force-https.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+ if (is_array($force)) {
+ $https_domains = array_merge($https_domains, $force);
+ }
+ $simplePie->set_https_domains($https_domains);
return $simplePie;
}
@@ -509,3 +548,7 @@ function base64url_encode($data) {
function base64url_decode($data) {
return base64_decode(strtr($data, '-_', '+/'));
}
+
+function _i($icon, $url_only = false) {
+ return FreshRSS_Themes::icon($icon, $url_only);
+}
diff --git a/sources/p/.htaccess b/sources/p/.htaccess
index 2b1e27a..4321c82 100755
--- a/sources/p/.htaccess
+++ b/sources/p/.htaccess
@@ -6,13 +6,8 @@ FileETag None
AddDefaultCharset UTF-8
","
"],col:[2,"
"],tr:[2,"","
"],td:[3,"
"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1>$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1>$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b","