aboutsummaryrefslogtreecommitdiff
path: root/app/i18n/zh-TW
diff options
context:
space:
mode:
authorGravatar Alexis Degrugillier <aledeg@users.noreply.github.com> 2025-10-06 15:09:01 -0400
committerGravatar GitHub <noreply@github.com> 2025-10-06 21:09:01 +0200
commitb6f4276c6cc2e5a53f0a4afb1536960427fa995e (patch)
tree8ac7062239b9fa4d3cdb1a9d106db6ada1676a77 /app/i18n/zh-TW
parentaeecba7b30cf04a53fc23f7ed7a8c5ce12cb11a6 (diff)
Change regional language codes (#8065)
* Change regional language codes According to `ISO-639-1` and `ISO-3166-1 alpha-2` recommendations, regional languages must be written with the language code in lowercase and the region in uppercase. For instance, we should have `en-US` instead of `en-us`. Folders have been updated to reflect those recommendations and regional language codes have been updated in the translation files. * Update README files * Fix configuration for typos * Revert language order in documentation * Remove unnecessary code * Change language configuration getter * Fix phpstan error * Fix typo * Add types * escape regex * Move language logic to avoid magic or deprecated methods * Minor fix on regex
Diffstat (limited to 'app/i18n/zh-TW')
-rw-r--r--app/i18n/zh-TW/admin.php240
-rw-r--r--app/i18n/zh-TW/api.php33
-rw-r--r--app/i18n/zh-TW/conf.php372
-rw-r--r--app/i18n/zh-TW/feedback.php152
-rw-r--r--app/i18n/zh-TW/gen.php277
-rw-r--r--app/i18n/zh-TW/index.php110
-rw-r--r--app/i18n/zh-TW/install.php128
-rw-r--r--app/i18n/zh-TW/sub.php307
-rw-r--r--app/i18n/zh-TW/user.php54
9 files changed, 1673 insertions, 0 deletions
diff --git a/app/i18n/zh-TW/admin.php b/app/i18n/zh-TW/admin.php
new file mode 100644
index 000000000..e19660e39
--- /dev/null
+++ b/app/i18n/zh-TW/admin.php
@@ -0,0 +1,240 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its *
+ * state. When there is no comment, it means the entry is fully translated. *
+ * The recognized comments are (comment matching is case-insensitive): *
+ * + TODO: the entry has never been translated. *
+ * + DIRTY: the entry has been translated but needs to be updated. *
+ * + IGNORE: the entry does not need to be translated. *
+ * When a comment is not recognized, it is discarded. *
+ ******************************************************************************/
+
+return array(
+ 'auth' => array(
+ 'allow_anonymous' => '允許匿名閱讀預設使用者(%s)的文章',
+ 'allow_anonymous_refresh' => '允許匿名刷新文章',
+ 'api_enabled' => '允許 <abbr>API</abbr> 訪問 <small>(用於手機應用 and sharing user queries)</small>', // DIRTY
+ 'form' => '網頁表單(傳統方式, 需要 JavaScript)',
+ 'http' => 'HTTP (advanced: managed by Web server, OIDC, SSO…)', // TODO
+ 'none' => '無認證(危險)',
+ 'title' => '認證',
+ 'token' => '主要驗證權杖',
+ 'token_help' => '允許存取使用者的所有 RSS 輸出以及重整源而無需身份驗證:',
+ 'type' => '認證方式',
+ 'unsafe_autologin' => '允許不安全的自動登入方式:',
+ ),
+ 'check_install' => array(
+ 'cache' => array(
+ 'nok' => '請檢查 <em>./data/cache</em> 目錄權限。HTTP 伺服器必須有其寫入權限。',
+ 'ok' => 'cache 目錄權限正常',
+ ),
+ 'categories' => array(
+ 'nok' => 'Category 表配置錯誤',
+ 'ok' => 'Category 表正常',
+ ),
+ 'connection' => array(
+ 'nok' => '資料庫連接失敗',
+ 'ok' => '資料庫連接正常',
+ ),
+ 'ctype' => array(
+ 'nok' => '找不到字元類型檢測庫(php-ctype)',
+ 'ok' => '已找到字元類型檢測庫 (php-ctype)',
+ ),
+ 'curl' => array(
+ 'nok' => '找不到 cURL 庫(php-cURL)',
+ 'ok' => '已找到 cURL 庫(php-cURL)',
+ ),
+ 'data' => array(
+ 'nok' => '請檢查 <em>./data</em> 目錄權限。HTTP 伺服器必須有其寫入權限。',
+ 'ok' => 'data 目錄權限正常',
+ ),
+ 'database' => '資料庫相關',
+ 'dom' => array(
+ 'nok' => '找不到用於瀏覽 DOM 的庫(php-xml)',
+ 'ok' => '已找到用於瀏覽 DOM 的庫(php-xml)',
+ ),
+ 'entries' => array(
+ 'nok' => 'Entry 表配置錯誤',
+ 'ok' => 'Entry 表正常',
+ ),
+ 'favicons' => array(
+ 'nok' => '請檢查 <em>./data/favicons</em> 目錄權限。HTTP 伺服器必須有其寫入權限。',
+ 'ok' => 'favicons 目錄權限正常',
+ ),
+ 'feeds' => array(
+ 'nok' => 'Feed 表配置錯誤',
+ 'ok' => 'Feed 表正常',
+ ),
+ 'fileinfo' => array(
+ 'nok' => '找不到 fileinfo 庫(php-fileinfo)',
+ 'ok' => '已找到 fileinfo 庫(php-fileinfo)',
+ ),
+ 'files' => '文件相關',
+ 'json' => array(
+ 'nok' => '找不到 JSON 擴展(php-json )',
+ 'ok' => '已找到 JSON 擴展(php-json)',
+ ),
+ 'mbstring' => array(
+ 'nok' => '找不到推薦的 Unicode 解析庫(mbstring)',
+ 'ok' => '已找到推薦的 Unicode 解析庫(mbstring)',
+ ),
+ 'pcre' => array(
+ 'nok' => '找不到正則表達式解析庫(php-pcre)',
+ 'ok' => '已找到正則表達式解析庫(php-pcre)',
+ ),
+ 'pdo' => array(
+ 'nok' => '找不到 PDO 或支持的驅動(pdo_mysql、pdo_sqlite、pdo_pgsql)',
+ 'ok' => '已找到 PDO 和支持的至少一種驅動(pdo_mysql、pdo_sqlite、pdo_pgsql)',
+ ),
+ 'php' => array(
+ '_' => 'PHP 相關',
+ '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' => '找不到 ZIP 擴展(php-zip)',
+ 'ok' => '已找到 ZIP 擴展',
+ ),
+ ),
+ 'extensions' => array(
+ 'author' => '作者',
+ 'community' => '可用的社群擴充功能',
+ 'description' => '描述',
+ 'disabled' => '已禁用',
+ 'empty_list' => '沒有已安裝的擴充功能',
+ 'empty_list_help' => 'Check the logs to determine the reason behind the empty extension list.', // TODO
+ 'enabled' => '已啟用',
+ 'latest' => '已安裝',
+ 'name' => '名稱',
+ 'no_configure_view' => '此擴充功能不能配置。',
+ 'system' => array(
+ '_' => '系統擴充功能',
+ 'no_rights' => '系統擴充功能(你無權修改)',
+ ),
+ 'title' => '擴充功能',
+ 'update' => '更新可用',
+ 'user' => '用戶擴充功能',
+ 'version' => '版本',
+ ),
+ 'stats' => array(
+ '_' => '統計',
+ 'all_feeds' => '所有訂閱源',
+ 'category' => '分類',
+ 'entry_count' => '文章數',
+ 'entry_per_category' => '各分類文章數',
+ 'entry_per_day' => '近三十日每日文章數',
+ 'entry_per_day_of_week' => '一週各日(平均:%.2f 條消息)',
+ 'entry_per_hour' => '各小時(平均:%.2f 條消息)',
+ 'entry_per_month' => '各月(平均:%.2f 條消息)',
+ 'entry_repartition' => '文章分布',
+ 'feed' => '訂閱源',
+ 'feed_per_category' => '各分類訂閱源數',
+ 'idle' => '長期無更新訂閱源',
+ 'main' => '主要統計',
+ 'main_stream' => '首頁',
+ 'no_idle' => '訂閱源近期皆有更新!',
+ 'number_entries' => '%d 篇文章',
+ 'overview' => 'Overview', // TODO
+ 'percent_of_total' => '%',
+ 'repartition' => '文章分布: %s', // DIRTY
+ 'status_favorites' => '收藏',
+ 'status_read' => '已讀',
+ 'status_total' => '總計',
+ 'status_unread' => '未讀',
+ 'title' => '統計',
+ 'top_feed' => '前十訂閱源',
+ ),
+ 'system' => array(
+ '_' => '系統配置',
+ 'auto-update-url' => '自動升級伺服器地址',
+ 'base-url' => array(
+ '_' => '基本URL',
+ 'recommendation' => '自動推薦: <kbd>%s</kbd>',
+ ),
+ 'cookie-duration' => array(
+ 'help' => '單位(秒)',
+ 'number' => '保持登錄的時長',
+ ),
+ 'force_email_validation' => '強制驗證郵箱地址',
+ 'instance-name' => '實例名稱',
+ 'max-categories' => '各使用者分類數限制',
+ 'max-feeds' => '各使用者訂閱源數限制',
+ 'registration' => array(
+ 'number' => '最大使用者數',
+ 'select' => array(
+ 'label' => '註冊表單',
+ 'option' => array(
+ 'noform' => '禁用,無註冊表單',
+ 'nolimit' => '啟用,且無帳號限制',
+ 'setaccountsnumber' => '設置使用者數的最大值',
+ ),
+ ),
+ 'status' => array(
+ 'disabled' => '註冊表單禁用',
+ 'enabled' => '註冊表單啟用',
+ ),
+ 'title' => '使用者註冊表單',
+ ),
+ 'sensitive-parameter' => '敏感參數。手動編輯於 <kbd>./data/config.php</kbd>',
+ 'tos' => array(
+ 'disabled' => '未被給予',
+ 'enabled' => '<a href="./?a=tos">為啟用的</a>',
+ 'help' => '如何 <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">啟用服務條款</a>',
+ ),
+ 'websub' => array(
+ 'help' => '關於 <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',
+ ),
+ ),
+ 'update' => array(
+ '_' => '更新系統',
+ 'apply' => '應用',
+ 'changelog' => '更新紀錄',
+ 'check' => '檢查更新',
+ 'copiedFromURL' => 'update.php 複製從 %s 至 ./data',
+ 'current_version' => '當前 版本為',
+ 'last' => '上次檢查',
+ 'loading' => '更新中…',
+ 'none' => '沒有可用更新',
+ 'releaseChannel' => array(
+ '_' => '發佈通道',
+ 'edge' => '滾動式發佈(“edge”)',
+ 'latest' => '穩定式發佈(“latest”)',
+ ),
+ 'title' => '系統更新',
+ 'viaGit' => '從git並由GitHub.com開始',
+ ),
+ 'user' => array(
+ 'admin' => '管理員',
+ 'article_count' => '文章數',
+ 'back_to_manage' => '← 返回使用者列表',
+ 'create' => '新增使用者',
+ 'database_size' => '資料庫大小',
+ 'email' => '郵箱地址',
+ 'enabled' => '已啟用',
+ 'feed_count' => '訂閱源數',
+ 'is_admin' => '管理員',
+ 'language' => '語言',
+ 'last_user_activity' => '上次使用者活躍',
+ 'list' => '使用者列表',
+ 'number' => '已有 %d 個使用者',
+ 'numbers' => '已有 %d 個使用者',
+ 'password_form' => '密碼<br /><small>(用於網頁表單登錄方式)</small>',
+ 'password_format' => '至少 7 個字元',
+ 'title' => '使用者管理',
+ 'username' => '使用者名稱',
+ ),
+);
diff --git a/app/i18n/zh-TW/api.php b/app/i18n/zh-TW/api.php
new file mode 100644
index 000000000..0021dfa98
--- /dev/null
+++ b/app/i18n/zh-TW/api.php
@@ -0,0 +1,33 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its *
+ * state. When there is no comment, it means the entry is fully translated. *
+ * The recognized comments are (comment matching is case-insensitive): *
+ * + TODO: the entry has never been translated. *
+ * + DIRTY: the entry has been translated but needs to be updated. *
+ * + IGNORE: the entry does not need to be translated. *
+ * When a comment is not recognized, it is discarded. *
+ ******************************************************************************/
+
+return array(
+ 'information' => array(
+ 'address' => 'Your API address:', // TODO
+ 'output' => array(
+ 'encoding-support' => '⚠️ WARN: no <code>%2F</code> support, some clients might not work!', // TODO
+ 'invalid-configuration' => '⚠️ WARN: Probable invalid base URL in ./data/config.php', // TODO
+ 'pass' => '✔️ PASS', // TODO
+ 'unknown-error' => '❌ ', // TODO
+ ),
+ 'test' => array(
+ 'fever' => 'Fever API configuration test:', // TODO
+ 'greader' => 'Google Reader API configuration test:', // TODO
+ ),
+ 'title' => array(
+ '_' => 'FreshRSS API endpoints', // TODO
+ 'extension' => 'API for extensions', // TODO
+ 'fever' => 'Fever compatible API', // TODO
+ 'greader' => 'Google Reader compatible API', // TODO
+ ),
+ ),
+);
diff --git a/app/i18n/zh-TW/conf.php b/app/i18n/zh-TW/conf.php
new file mode 100644
index 000000000..ac83b7c1f
--- /dev/null
+++ b/app/i18n/zh-TW/conf.php
@@ -0,0 +1,372 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its *
+ * state. When there is no comment, it means the entry is fully translated. *
+ * The recognized comments are (comment matching is case-insensitive): *
+ * + TODO: the entry has never been translated. *
+ * + DIRTY: the entry has been translated but needs to be updated. *
+ * + IGNORE: the entry does not need to be translated. *
+ * When a comment is not recognized, it is discarded. *
+ ******************************************************************************/
+
+return array(
+ 'archiving' => array(
+ '_' => '歸檔',
+ 'exception' => '高級清理策略',
+ 'help' => '具體選項位於各訂閱源的設置',
+ 'keep_favourites' => '不清理已收藏的文章',
+ 'keep_labels' => '不清理標籤',
+ 'keep_max' => '最多保留的文章數', // DIRTY
+ 'keep_min_by_feed' => '至少保留的文章數',
+ 'keep_period' => '文章最多保留',
+ 'keep_unreads' => '不清理未讀文章',
+ 'maintenance' => '優化',
+ 'optimize' => '優化資料庫',
+ 'optimize_help' => '偶爾執行優化可以減少資料庫大小',
+ 'policy' => '清理策略',
+ 'policy_warning' => '如果未選擇清理策略,則將保留全部文章。',
+ 'purge_now' => '立即清除',
+ 'title' => '存檔',
+ 'ttl' => '最小自動刷新間隔',
+ ),
+ 'display' => array(
+ '_' => '顯示',
+ 'darkMode' => array(
+ '_' => '自動黑暗模式',
+ 'auto' => '自動',
+ 'help' => '僅適用於相容主題',
+ 'no' => '否',
+ ),
+ 'icon' => array(
+ 'bottom_line' => '底欄',
+ 'display_authors' => '作者',
+ 'entry' => '文章圖示',
+ 'publication_date' => '更新日期',
+ 'related_tags' => '相關標籤',
+ 'sharing' => '分享',
+ 'summary' => '摘要',
+ 'top_line' => '頂欄',
+ ),
+ 'language' => '語言',
+ 'notif_html5' => array(
+ 'seconds' => '秒(0 表示不超時)',
+ 'timeout' => 'HTML5 通知超時時間',
+ ),
+ 'show_nav_buttons' => '顯示導航按鈕',
+ 'theme' => array(
+ '_' => '主題',
+ 'deprecated' => array(
+ '_' => '已廢棄',
+ 'description' => '此主題不再被支援且將不再可用在 <a href="https://freshrss.github.io/FreshRSS/en/users/05_Configuration.html#theme" target="_blank">未來FreshRSS的更新</a>',
+ ),
+ ),
+ 'theme_not_available' => '“%s” 主題不再可用,請選擇其他主題。',
+ 'thumbnail' => array(
+ 'label' => '縮圖',
+ 'landscape' => '風景',
+ 'none' => '無',
+ 'portrait' => '肖像',
+ 'square' => '方塊',
+ ),
+ 'timezone' => '時區',
+ 'title' => '顯示',
+ 'website' => array(
+ 'full' => '圖示及名稱',
+ 'icon' => '僅圖示',
+ 'label' => '網站',
+ 'name' => '僅名稱',
+ 'none' => '無',
+ ),
+ 'width' => array(
+ 'content' => '內容寬度',
+ 'large' => '寬',
+ 'medium' => '中',
+ 'no_limit' => '無限制',
+ 'thin' => '窄',
+ ),
+ ),
+ 'logs' => array(
+ 'loglist' => array(
+ 'level' => '日誌等級',
+ 'message' => '訊息',
+ 'timestamp' => '時間',
+ ),
+ 'pagination' => array(
+ 'first' => '首頁',
+ 'last' => '末頁',
+ 'next' => '下一頁',
+ 'previous' => '上一頁',
+ ),
+ ),
+ 'mark_read_button' => array(
+ '_' => '“Mark all as read” button', // TODO
+ 'big' => 'Big', // TODO
+ 'none' => 'None', // TODO
+ 'small' => 'Small', // TODO
+ ),
+ 'notification_timeout' => array(
+ 'bad' => array(
+ 'label' => 'Show warning banner', // TODO
+ 'seconds' => 'seconds (at least 1)', // TODO
+ ),
+ 'good' => array(
+ 'label' => 'Show acknowledgement banner', // TODO
+ 'seconds' => 'seconds (0 means not shown)', // TODO
+ ),
+ ),
+ 'privacy' => array(
+ '_' => 'Privacy', // TODO
+ 'retrieve_extension_list' => 'Retrieve extension list', // TODO
+ ),
+ 'profile' => array(
+ '_' => '個人資料管理',
+ 'api' => array(
+ '_' => 'API 管理',
+ 'api_not_set' => 'API password not set', // TODO
+ 'api_set' => 'API password set', // TODO
+ 'check_link' => 'Check API status via: <kbd><a href="../api/" target="_blank">%s</a></kbd>', // TODO
+ 'disabled' => 'The API access is disabled.', // TODO
+ 'documentation_link' => 'See the <a href="https://freshrss.github.io/FreshRSS/en/users/06_Mobile_access.html#access-via-mobile-app" target="_blank">documentation and list of known apps</a>', // TODO
+ 'help' => 'See <a href="http://freshrss.github.io/FreshRSS/en/users/06_Mobile_access.html#access-via-mobile-app" target=_blank>documentation</a>', // TODO
+ ),
+ 'change_password' => 'Change password', // TODO
+ 'confirm_new_password' => 'Confirm new password', // TODO
+ 'current_password' => 'Current password<br /><small>(for the Web-form login method)</small>', // TODO
+ 'delete' => array(
+ '_' => '帳號刪除',
+ 'warn' => '你的帳號及所有相關資料將被刪除。',
+ ),
+ 'email' => '郵箱地址',
+ 'new_password' => 'New password', // TODO
+ 'password_api' => 'API 密碼<br /><small>(例如用於手機應用)</small>',
+ 'password_format' => '至少 7 個字元',
+ 'title' => '個人資料',
+ ),
+ 'query' => array(
+ '_' => '自定義查詢',
+ 'deprecated' => '此查詢不再有效。相關的分類或訂閱源已被刪除。',
+ 'description' => 'Description', // TODO
+ 'filter' => array(
+ '_' => '生效的過濾器:',
+ 'categories' => '按分類顯示',
+ 'feeds' => '按訂閱源顯示',
+ 'order' => '按日期排序',
+ 'search' => '表達式',
+ 'shareOpml' => '啟用透過對應類別和源的OPML分享',
+ 'shareRss' => '啟用透過HTML分享 &amp; RSS',
+ 'state' => '狀態',
+ 'tags' => '按標籤顯示',
+ 'type' => '類型',
+ ),
+ 'get_A' => 'Show all feeds, also those shown in their category', // TODO
+ 'get_Z' => 'Show all feeds, also archived ones', // TODO
+ 'get_all' => '顯示所有文章',
+ 'get_all_labels' => '顯示任何標籤的文章',
+ 'get_category' => '顯示分類 “%s”',
+ 'get_favorite' => '顯示收藏文章',
+ 'get_feed' => '顯示訂閱源 “%s”',
+ 'get_important' => '顯示來自重要源的文章',
+ 'get_label' => '顯示帶有 “%s” 標籤的文章',
+ 'help' => '請參閱 <a href="https://freshrss.github.io/FreshRSS/en/users/user_queries.html" target="_blank">有關使用者查詢和透過 HTML / RSS / OPML 重新共用的文件</a>.',
+ 'image_url' => '影像網址',
+ 'name' => '名稱',
+ 'no_filter' => '無過濾器',
+ 'no_queries' => array(
+ '_' => 'No user queries are saved yet.', // TODO
+ 'help' => 'See <a href="https://freshrss.github.io/FreshRSS/en/users/user_queries.html" target="_blank">documentation</a>', // TODO
+ ),
+ 'number' => '查詢 n°%d',
+ 'order_asc' => '由舊至新顯示文章',
+ 'order_desc' => '由新至舊顯示文章',
+ 'search' => '搜尋 “%s”',
+ 'share' => array(
+ '_' => '透過連結分享此查詢',
+ 'disabled' => array(
+ '_' => 'disabled', // TODO
+ 'title' => 'Sharing', // TODO
+ ),
+ 'greader' => 'GReader JSON的可共享連結',
+ 'help' => '如果您想與任何人分享此查詢,請提供此連結',
+ 'html' => 'HTML頁面的可共享連結',
+ 'opml' => 'OPML源列表的可共享連結',
+ 'rss' => 'RSS源的可共享連結',
+ ),
+ 'state_0' => '顯示所有文章',
+ 'state_1' => '顯示已讀文章',
+ 'state_2' => '顯示未讀文章',
+ 'state_3' => '顯示所有文章',
+ 'state_4' => '顯示收藏文章',
+ 'state_5' => '顯示已讀的收藏文章',
+ 'state_6' => '顯示未讀的收藏文章',
+ 'state_7' => '顯示收藏文章',
+ 'state_8' => '顯示未收藏文章',
+ 'state_9' => '顯示已讀的未收藏文章',
+ 'state_10' => '顯示未讀的未收藏文章',
+ 'state_11' => '顯示未收藏文章',
+ 'state_12' => '顯示所有文章',
+ 'state_13' => '顯示已讀文章',
+ 'state_14' => '顯示未讀文章',
+ 'state_15' => '顯示所有文章',
+ 'title' => '自定義查詢',
+ ),
+ 'reading' => array(
+ '_' => '閱讀',
+ 'after_onread' => '「全部標記為已讀」後',
+ 'always_show_favorites' => '預設顯示收藏夾中所有的文章',
+ 'apply_to_individual_feed' => 'Applies to feeds individually', // TODO
+ 'article' => array(
+ 'authors_date' => array(
+ '_' => '作者和日期',
+ 'both' => '兩者都顯示',
+ 'footer' => '僅頁腳顯示',
+ 'header' => '僅頁眉顯示',
+ 'none' => '不顯示',
+ ),
+ 'feed_name' => array(
+ 'above_title' => '在文章標題和標籤上方',
+ 'none' => '不顯示',
+ 'with_authors' => '與作者和日期一行',
+ ),
+ 'feed_title' => '訂閱源標題',
+ 'icons' => array(
+ '_' => '文章圖示的位置<br /><small>(限閱讀視圖)</small>',
+ 'above_title' => '標題之上',
+ 'with_authors' => '在作者和日期列中',
+ ),
+ 'tags' => array(
+ '_' => '文章標籤',
+ 'both' => '兩者都顯示',
+ 'footer' => '僅頁腳顯示',
+ 'header' => '僅頁眉顯示',
+ 'none' => '不顯示',
+ ),
+ 'tags_max' => array(
+ '_' => '標籤最多顯示個數',
+ 'help' => '0 標識顯示所有標籤',
+ ),
+ ),
+ 'articles_per_page' => '每頁文章數',
+ 'auto_load_more' => '在頁面底部載入更多文章',
+ 'auto_remove_article' => '閱讀後隱藏文章',
+ 'confirm_enabled' => '「全部標記為已讀」時顯示確認對話框',
+ 'display_articles_unfolded' => '預設展開顯示文章',
+ 'display_categories_unfolded' => '要展開的分類',
+ 'headline' => array(
+ 'articles' => '文章:打開/關閉',
+ 'articles_header_footer' => '文章: 頁眉/頁腳',
+ 'categories' => '左側導航:分類',
+ 'mark_as_read' => '標為已讀選項',
+ 'misc' => '其它',
+ 'view' => '瀏覽',
+ ),
+ 'hide_read_feeds' => '隱藏沒有未讀文章的分類和訂閱源 (啟用「顯示所有文章」後不生效)',
+ 'img_with_lazyload' => '延遲加載圖片',
+ 'jump_next' => '跳轉到下一未讀項',
+ 'mark_updated_article_unread' => '將更新的文章設為未讀',
+ 'number_divided_when_reader' => '閱讀視圖中顯示一半',
+ 'read' => array(
+ 'article_open_on_website' => '在打開原文章後',
+ 'article_viewed' => '在文章被瀏覽後',
+ 'focus' => '當注意力集中時(重要的源除外)',
+ 'keep_max_n_unread' => '未讀最多保留 n 條',
+ 'scroll' => '在滾動瀏覽後(重要的源除外)', // DIRTY
+ 'upon_gone' => '在被原訂閱源移除後',
+ 'upon_reception' => '在接收文章後',
+ 'when' => '何時將文章標記為已讀',
+ 'when_same_title_in_category' => 'if an identical title already exists in the top <i>n</i> newest articles of the category', // TODO
+ 'when_same_title_in_feed' => '已存在 n 條相同標題文章 (of the feed)', // DIRTY
+ ),
+ 'show' => array(
+ '_' => '文章顯示',
+ 'active_category' => '啟用的分類',
+ 'adaptive' => 'Show unreads if any, all articles otherwise', // TODO
+ 'all_articles' => '顯示所有',
+ 'all_categories' => '所有分類',
+ 'no_category' => '無分類',
+ 'remember_categories' => '記住打開的分類',
+ 'unread' => '只顯示未讀',
+ 'unread_or_favorite' => 'Show unreads and favourites', // TODO
+ ),
+ 'show_fav_unread_help' => '同樣適用於標籤',
+ 'sides_close_article' => '點擊文章區域外以關閉',
+ 'sort' => array(
+ '_' => '排列順序',
+ 'newer_first' => '由新至舊',
+ 'older_first' => '由舊至新',
+ ),
+ 'star' => array(
+ 'when' => '標記一篇文章為最愛…',
+ ),
+ 'sticky_post' => '打開文章時將其置於頁首',
+ 'title' => '閱讀',
+ 'view' => array(
+ 'default' => '預設視圖',
+ 'global' => '全屏視圖',
+ 'normal' => '普通視圖',
+ 'reader' => '閱讀視圖',
+ ),
+ ),
+ 'sharing' => array(
+ '_' => '分享',
+ 'add' => '新增分享方式',
+ 'bluesky' => 'Bluesky', // TODO
+ 'deprecated' => '這項功能已廢棄並在將來版本的 FreshRSS 中移除,詳情請見 <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Open documentation for more information" target="_blank">說明文檔</a>.',
+ 'diaspora' => 'Diaspora*', // IGNORE
+ 'email' => '郵箱', // IGNORE
+ 'facebook' => '臉書', // IGNORE
+ 'more_information' => '更多資訊',
+ 'print' => '列印',
+ 'raindrop' => 'Raindrop.io', // IGNORE
+ 'remove' => '刪除分享方式',
+ 'shaarli' => 'Shaarli', // IGNORE
+ 'share_name' => '名稱',
+ 'share_url' => '地址',
+ 'title' => '分享',
+ 'twitter' => '推特', // IGNORE
+ 'wallabag' => 'Wallabag', // IGNORE
+ ),
+ 'shortcut' => array(
+ '_' => '快捷鍵',
+ 'article_action' => '文章操作',
+ 'auto_share' => '分享',
+ 'auto_share_help' => '如果有多種分享方式,則會按照它們的序號依次訪問。',
+ 'close_menus' => '關閉菜單',
+ 'collapse_article' => '收起文章',
+ 'first_article' => '打開第一篇文章',
+ 'focus_search' => '聚焦到搜尋框',
+ 'global_view' => '切換到全屏視圖',
+ 'help' => '顯示幫助文檔',
+ 'javascript' => '若要使用快捷鍵,必須啟用 JavaScript',
+ 'last_article' => '打開最後一篇文章',
+ 'load_more' => '載入更多文章',
+ 'mark_favorite' => '加入收藏',
+ 'mark_read' => '設為已讀',
+ 'navigation' => '瀏覽',
+ 'navigation_help' => '組合 <kbd>⇧ Shift</kbd> 鍵,瀏覽快捷鍵將生效於訂閱源。<br/>組合 <kbd>Alt ⎇</kbd> 鍵,瀏覽快捷鍵將生效於分類。',
+ 'navigation_no_mod_help' => '以下快捷鍵不支持組合鍵(Shift 或 Alt)',
+ 'next_article' => '打開下一篇文章',
+ 'next_unread_article' => '打開下一篇未讀文章',
+ 'non_standard' => '這些鍵 (<kbd>%s</kbd>) 可能不能作為快捷鍵',
+ 'normal_view' => '切換到普通視圖',
+ 'other_action' => '其它操作',
+ 'previous_article' => '打開上一篇文章',
+ 'reading_view' => '切換到閱讀視圖',
+ 'rss_view' => '切換到 RSS 視圖',
+ 'see_on_website' => '在原網站中查看',
+ 'shift_for_all_read' => '組合 <kbd>Alt ⎇</kbd>鍵 將上方的文章標記為已讀<br />組合 <kbd>⇧ Shift</kbd>按鍵 可以將全部文章設為已讀',
+ 'skip_next_article' => '跳轉到下一篇文章而不打開',
+ 'skip_previous_article' => '跳轉到上一篇文章而不打開',
+ 'title' => '快捷鍵',
+ 'toggle_media' => '播放/暫停媒體',
+ 'user_filter' => '顯示自定義查詢',
+ 'user_filter_help' => '如果有多個自定義過濾器,則會按照它們的序號依次訪問。',
+ 'views' => '視圖',
+ ),
+ 'user' => array(
+ 'articles_and_size' => '%s 篇文章 (%s)',
+ 'current' => '當前使用者',
+ 'is_admin' => '該使用者為管理員',
+ 'users' => '使用者',
+ ),
+);
diff --git a/app/i18n/zh-TW/feedback.php b/app/i18n/zh-TW/feedback.php
new file mode 100644
index 000000000..4bdf243a4
--- /dev/null
+++ b/app/i18n/zh-TW/feedback.php
@@ -0,0 +1,152 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its *
+ * state. When there is no comment, it means the entry is fully translated. *
+ * The recognized comments are (comment matching is case-insensitive): *
+ * + TODO: the entry has never been translated. *
+ * + DIRTY: the entry has been translated but needs to be updated. *
+ * + IGNORE: the entry does not need to be translated. *
+ * When a comment is not recognized, it is discarded. *
+ ******************************************************************************/
+
+return array(
+ 'access' => array(
+ 'denied' => '你無權訪問此頁面',
+ 'not_found' => '你尋找的頁面不存在',
+ ),
+ 'admin' => array(
+ 'optimization_complete' => '優化完成',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => '您的密碼無法修改',
+ 'updated' => '您的密碼已修改',
+ ),
+ ),
+ 'auth' => array(
+ 'login' => array(
+ 'invalid' => '使用者名或密碼無效',
+ 'success' => '登入成功',
+ ),
+ 'logout' => array(
+ 'success' => '已登出',
+ ),
+ ),
+ 'conf' => array(
+ 'error' => '保存配置時出錯',
+ 'query_created' => '查詢 “%s” 已創建。',
+ 'shortcuts_updated' => '快捷鍵已更新',
+ 'updated' => '配置已更新',
+ ),
+ 'extensions' => array(
+ 'already_enabled' => '%s 已啟用',
+ 'cannot_remove' => '無法刪除 %s',
+ 'disable' => array(
+ 'ko' => '禁用 %s 失敗。<a href="%s">檢查 FreshRSS 日誌</a> 查看詳情。',
+ 'ok' => '%s 現已禁用',
+ ),
+ 'enable' => array(
+ 'ko' => '%s 啟用失敗。<a href="%s">檢查 FreshRSS 日誌</a> 查看詳情。',
+ 'ok' => '%s 現已啟用',
+ ),
+ 'invalid_view_mode' => 'Invalid view mode “%s”! Fall back to “Normal view”.', // TODO
+ 'no_access' => '你無權訪問 %s',
+ 'not_enabled' => '%s 未啟用',
+ 'not_found' => '%s 不存在',
+ 'removed' => '%s 已刪除',
+ ),
+ 'import_export' => array(
+ 'export_no_zip_extension' => '伺服器未啟用 ZIP 擴展。請嘗試逐個導出文件。',
+ 'feeds_imported' => '你的訂閱已導入,即將刷新 / Your feeds have been imported. If you are done importing, you can now click the <i>Update feeds</i> button.',
+ 'feeds_imported_with_errors' => '你的訂閱源已導入,但發生錯誤 / Your feeds have been imported, but some errors occurred. If you are done importing, you can now click the <i>Update feeds</i> button.',
+ 'file_cannot_be_uploaded' => '文件未能上傳!',
+ 'no_zip_extension' => '伺服器未啟用 ZIP 擴展。',
+ 'zip_error' => '導入 ZIP 文件時出錯', // DIRTY
+ ),
+ 'profile' => array(
+ 'error' => '你的帳戶修改失敗',
+ 'passwords_dont_match' => 'Passwords don’t match', // TODO
+ 'updated' => '你的帳戶已修改',
+ ),
+ 'sub' => array(
+ 'actualize' => '獲取',
+ 'articles' => array(
+ 'marked_read' => '文章已標記為已讀',
+ 'marked_unread' => '文章已標記為未讀',
+ ),
+ 'category' => array(
+ 'created' => '已創建分類 %s',
+ 'deleted' => '已刪除分類',
+ 'emptied' => '已清空分類',
+ 'error' => '更新分類失敗',
+ 'name_exists' => '分類名已存在',
+ 'no_id' => '你必須明確分類編號',
+ 'no_name' => '分類名不能為空',
+ 'not_delete_default' => '你不能刪除默認分類!',
+ 'not_exist' => '分類不存在!',
+ 'over_max' => '你已達到分類數上限(%d)',
+ 'updated' => '已更新分類',
+ ),
+ 'feed' => array(
+ 'actualized' => '已更新 <em>%s</em>',
+ 'actualizeds' => '已更新訂閱源',
+ 'added' => '訂閱源 <em>%s</em> 已添加',
+ 'already_subscribed' => '你已訂閱 <em>%s</em>',
+ 'cache_cleared' => '<em>%s</em> 緩存已清理',
+ 'deleted' => '已刪除訂閱源',
+ 'error' => '訂閱源更新失敗',
+ 'favicon' => array(
+ 'too_large' => 'Uploaded icon is too large. The maximum file size is <em>%s</em>.', // TODO
+ 'unsupported_format' => 'Unsupported image file format!', // TODO
+ ),
+ 'internal_problem' => '訂閱源添加失敗。<a href="%s">檢查 FreshRSS 日誌</a> 查看詳情。你可以在地址連結後附加 <code>#force_feed</code> 從而嘗試強制添加。',
+ 'invalid_url' => '地址鏈接 <em>%s</em> 無效',
+ 'n_actualized' => '已更新 %d 個訂閱源',
+ 'n_entries_deleted' => '已刪除 %d 篇文章',
+ 'no_refresh' => '沒有可刷新的訂閱源…',
+ 'not_added' => '<em>%s</em> 添加失敗',
+ 'not_found' => '無法找到訂閱',
+ 'over_max' => '你已達到訂閱源數上限(%d)',
+ 'reloaded' => '<em>%s</em> 已重置',
+ 'selector_preview' => array(
+ 'http_error' => '無法加載網站內容。',
+ 'no_entries' => '您的訂閱中沒有任何條目。您至少需要一個條目來創建一個預覽。',
+ 'no_feed' => '網絡錯誤(訂閱源不存在)',
+ 'no_result' => '選擇器沒有匹配到任何東西。作為備用,原始的feed文本將被顯示出來。',
+ 'selector_empty' => '選擇器是空的。你需要一個來創建預覽。',
+ ),
+ 'updated' => '已更新訂閱源',
+ ),
+ 'purge_completed' => '清除完成(已刪除 %d 篇文章)',
+ ),
+ 'tag' => array(
+ 'created' => '標籤 “%s” 已創建。',
+ 'error' => '無法更新標籤!',
+ 'name_exists' => '標籤名已存在。',
+ 'renamed' => '標籤 “%s” 已被重命名為 “%s”。',
+ 'updated' => '已更新標籤。',
+ ),
+ 'update' => array(
+ 'can_apply' => 'FreshRSS 將更新到 <strong>版本 %s</strong>。',
+ 'error' => '更新出錯:%s',
+ 'file_is_nok' => '請檢查 <em>%s</em> 目錄權限。HTTP 伺服器必須有其寫入權限。',
+ 'finished' => '更新完成!',
+ 'none' => '沒有可用更新',
+ 'server_not_found' => '找不到更新伺服器 [%s]',
+ ),
+ 'user' => array(
+ 'created' => array(
+ '_' => '已創建使用者 %s',
+ 'error' => '創建使用者 %s 失敗',
+ ),
+ 'deleted' => array(
+ '_' => '已刪除使用者 %s',
+ 'error' => '刪除使用者 %s 失敗',
+ ),
+ 'updated' => array(
+ '_' => '已更新使用者 %s',
+ 'error' => '更新使用者 %s 失敗',
+ ),
+ ),
+);
diff --git a/app/i18n/zh-TW/gen.php b/app/i18n/zh-TW/gen.php
new file mode 100644
index 000000000..d7216765a
--- /dev/null
+++ b/app/i18n/zh-TW/gen.php
@@ -0,0 +1,277 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its *
+ * state. When there is no comment, it means the entry is fully translated. *
+ * The recognized comments are (comment matching is case-insensitive): *
+ * + TODO: the entry has never been translated. *
+ * + DIRTY: the entry has been translated but needs to be updated. *
+ * + IGNORE: the entry does not need to be translated. *
+ * When a comment is not recognized, it is discarded. *
+ ******************************************************************************/
+
+return array(
+ 'action' => array(
+ 'actualize' => '更新提要',
+ 'add' => '新增',
+ 'back_to_rss_feeds' => '← 返回訂閱源',
+ 'cancel' => '取消',
+ 'close' => 'Close', // TODO
+ 'create' => '創建',
+ 'delete_all_feeds' => 'Delete all feeds', // TODO
+ 'delete_errored_feeds' => 'Delete feeds with errors', // TODO
+ 'delete_muted_feeds' => '刪除已暫停的訂閱源',
+ 'demote' => '撤銷管理員',
+ 'disable' => '禁用',
+ 'download' => 'Download', // TODO
+ 'empty' => '清空',
+ 'enable' => '啟用',
+ 'export' => '導出',
+ 'filter' => '過濾',
+ 'import' => '導入',
+ 'load_default_shortcuts' => '重置快捷鍵',
+ 'manage' => '管理',
+ 'mark_read' => '標記已讀',
+ 'menu' => array(
+ 'open' => '開啟選單',
+ ),
+ 'nav_buttons' => array(
+ 'next' => '下一篇文章',
+ 'prev' => '預覽文章',
+ 'up' => '回上一篇',
+ ),
+ 'open_url' => '打開連結',
+ 'promote' => '設為管理員',
+ 'purge' => '清理',
+ 'refresh_opml' => '更新訂閱源動態列表',
+ 'remove' => '刪除',
+ 'rename' => '重命名',
+ 'see_website' => '網站中查看',
+ 'submit' => '提交',
+ 'truncate' => '刪除所有文章',
+ 'update' => '更新訂閱',
+ ),
+ 'auth' => array(
+ 'accept_tos' => '我接受 <a href="%s">服務條款</a>',
+ 'email' => 'Email 地址',
+ 'keep_logged_in' => '<small>%s</small> 天內保持登入',
+ 'login' => '登入',
+ 'logout' => '登出',
+ 'password' => array(
+ '_' => '密碼',
+ 'format' => '<small>至少 7 個字元</small>',
+ ),
+ 'reauth' => array(
+ 'header' => 'Reauthentication is required', // TODO
+ 'tip' => 'You won’t be asked to sign in again for <u>%d minutes</u>', // TODO
+ 'title' => 'Reauthentication', // TODO
+ ),
+ 'registration' => array(
+ '_' => '新使用者',
+ 'ask' => '創建新使用者?',
+ 'title' => '使用者創建',
+ ),
+ 'username' => array(
+ '_' => '帳號',
+ 'format' => '<small>最多 16 個數字或字母</small>',
+ ),
+ ),
+ 'date' => array(
+ 'Apr' => '\\四\\月',
+ 'Aug' => '\\八\\月',
+ 'Dec' => '\\十\\二\\月',
+ 'Feb' => '\\二\\月',
+ 'Jan' => '\\一\\月',
+ 'Jul' => '\\七\\月',
+ 'Jun' => '\\六\\月',
+ 'Mar' => '\\三\\月',
+ 'May' => '\\五\\月',
+ 'Nov' => '\\十\\一\\月',
+ 'Oct' => '\\十\\月',
+ 'Sep' => '\\九\\月',
+ 'apr' => '四月',
+ 'april' => '四月',
+ 'aug' => '八月',
+ 'august' => '八月',
+ 'before_yesterday' => '昨天以前',
+ 'dec' => '十二月',
+ 'december' => '十二月',
+ 'feb' => '二月',
+ 'february' => '二月',
+ 'format_date' => 'Y\\年n\\月j\\日',
+ 'format_date_hour' => 'Y\\年n\\月j\\日 H\\:i',
+ 'fri' => '週五',
+ 'jan' => '一月',
+ 'january' => '一月',
+ 'jul' => '七月',
+ 'july' => '七月',
+ 'jun' => '六月',
+ 'june' => '六月',
+ 'last_2_year' => '過去兩年',
+ 'last_3_month' => '最近三個月',
+ 'last_3_year' => '過去三年',
+ 'last_5_year' => '過去五年',
+ 'last_6_month' => '最近六個月',
+ 'last_month' => '上月',
+ 'last_week' => '上週',
+ 'last_year' => '去年',
+ 'mar' => '三月',
+ 'march' => '三月',
+ 'may' => '五月',
+ 'may_' => '五月',
+ 'mon' => '週一',
+ 'month' => '個月',
+ 'nov' => '十一月',
+ 'november' => '十一月',
+ 'oct' => '十月',
+ 'october' => '十月',
+ 'sat' => '週六',
+ 'sep' => '九月',
+ 'september' => '九月',
+ 'sun' => '週日',
+ 'thu' => '週四',
+ 'today' => '今天',
+ 'tue' => '週二',
+ 'wed' => '週三',
+ 'yesterday' => '昨天',
+ ),
+ 'dir' => 'ltr', // IGNORE
+ 'freshrss' => array(
+ '_' => 'FreshRSS', // IGNORE
+ 'about' => '關於 FreshRSS',
+ ),
+ 'js' => array(
+ 'category_empty' => '清空分類',
+ 'confirm_action' => '你確定要執行此操作嗎?這將不可撤銷!',
+ 'confirm_action_feed_cat' => '你確定要執行此操作嗎?你將丟失相關的收藏和自定義查詢。這將不可撤銷!',
+ 'confirm_exit_slider' => 'Are you sure you want to discard unsaved settings?', // TODO
+ 'feedback' => array(
+ 'body_new_articles' => 'FreshRSS 中有 %%d 篇文章等待閱讀。',
+ 'body_unread_articles' => '(未讀: %%d)',
+ 'request_failed' => '請求失敗,這可能是因為網絡連接問題。',
+ 'title_new_articles' => 'FreshRSS: 新文章!',
+ ),
+ 'labels_empty' => '沒有標籤',
+ 'new_article' => '發現新文章,點擊刷新頁面。',
+ 'should_be_activated' => '必須啟用 JavaScript',
+ 'unsafe_csp_header' => 'The CSP header in use is unsafe and FreshRSS may be vulnerable to XSS attacks. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">See documentation</a>', // TODO
+ ),
+ 'lang' => array(
+ 'cs' => 'Čeština', // IGNORE
+ 'de' => 'Deutsch', // IGNORE
+ 'el' => 'Ελληνικά', // IGNORE
+ 'en' => 'English', // IGNORE
+ 'en-US' => 'English (United States)', // IGNORE
+ 'es' => 'Español', // IGNORE
+ 'fa' => 'فارسی', // IGNORE
+ 'fi' => 'Suomi', // IGNORE
+ 'fr' => 'Français', // IGNORE
+ 'he' => 'עברית', // IGNORE
+ 'hu' => 'Magyar', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
+ 'it' => 'Italiano', // IGNORE
+ 'ja' => '日本語', // IGNORE
+ 'ko' => '한국어', // IGNORE
+ 'lv' => 'Latviešu', // IGNORE
+ 'nl' => 'Nederlands', // IGNORE
+ 'oc' => 'Occitan', // IGNORE
+ 'pl' => 'Polski', // IGNORE
+ 'pt-BR' => 'Português (Brasil)', // IGNORE
+ 'pt-PT' => 'Português (Portugal)', // IGNORE
+ 'ru' => 'Русский', // IGNORE
+ 'sk' => 'Slovenčina', // IGNORE
+ 'tr' => 'Türkçe', // IGNORE
+ 'uk' => 'Українська', // IGNORE
+ 'zh-CN' => '简体中文', // IGNORE
+ 'zh-TW' => '正體中文', // IGNORE
+ ),
+ 'menu' => array(
+ 'about' => '關於',
+ 'account' => '帳號',
+ 'admin' => '管理',
+ 'archiving' => '歸檔',
+ 'authentication' => '認證',
+ 'check_install' => '環境檢查',
+ 'configuration' => '配置',
+ 'display' => '顯示',
+ 'extensions' => '擴充功能',
+ 'logs' => '日誌',
+ 'privacy' => 'Privacy', // TODO
+ 'queries' => '自定義查詢',
+ 'reading' => '閱讀',
+ 'search' => '搜尋內容或#標簽',
+ 'search_help' => '請見文檔內的進階的<a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">搜尋參數</a>',
+ 'sharing' => '分享',
+ 'shortcuts' => '快捷鍵',
+ 'stats' => '統計',
+ 'system' => '系統配置',
+ 'update' => '更新',
+ 'user_management' => '使用者管理',
+ 'user_profile' => '使用者資訊',
+ ),
+ 'period' => array(
+ 'days' => '天',
+ 'hours' => '時',
+ 'months' => '月',
+ 'weeks' => '週',
+ 'years' => '年',
+ ),
+ 'readme' => array(
+ 'contribute' => 'contribute', // IGNORE
+ 'language' => 'Language', // IGNORE
+ 'translated' => 'Progress', // IGNORE
+ ),
+ 'share' => array(
+ 'Known' => '基於 Known 的站點',
+ 'archiveIS' => 'archive.is', // IGNORE
+ 'archiveORG' => 'archive.org', // IGNORE
+ 'archivePH' => 'archive.ph', // IGNORE
+ 'bluesky' => 'Bluesky', // IGNORE
+ 'buffer' => 'Buffer', // IGNORE
+ 'clipboard' => '剪貼板',
+ 'diaspora' => 'Diaspora*', // IGNORE
+ 'email' => '郵箱', // IGNORE
+ 'email-webmail-firefox-fix' => 'Email (webmail - Firefox專用修正)',
+ 'facebook' => '臉書', // IGNORE
+ 'gnusocial' => 'GNU social', // IGNORE
+ 'jdh' => 'Journal du hacker', // IGNORE
+ 'lemmy' => 'Lemmy', // IGNORE
+ 'linkding' => 'Linkding', // IGNORE
+ 'linkedin' => 'LinkedIn', // IGNORE
+ 'mastodon' => 'Mastodon', // IGNORE
+ 'movim' => 'Movim', // IGNORE
+ 'omnivore' => 'Omnivore', // IGNORE
+ 'pinboard' => 'Pinboard', // IGNORE
+ 'pinterest' => 'Pinterest', // IGNORE
+ 'pocket' => 'Pocket', // IGNORE
+ 'print' => '打印',
+ 'raindrop' => 'Raindrop.io', // IGNORE
+ 'reddit' => 'Reddit', // IGNORE
+ 'shaarli' => 'Shaarli', // IGNORE
+ 'telegram' => 'Telegram', // IGNORE
+ 'twitter' => '推特', // IGNORE
+ 'wallabag' => 'Wallabag v1', // IGNORE
+ 'wallabagv2' => 'Wallabag v2', // IGNORE
+ 'web-sharing-api' => 'Web分享',
+ 'whatsapp' => 'Whatsapp', // IGNORE
+ 'xing' => 'Xing', // IGNORE
+ ),
+ 'short' => array(
+ 'attention' => '警告!',
+ 'blank_to_disable' => '留空以禁用',
+ 'by_author' => '作者',
+ 'by_default' => '預設',
+ 'damn' => '錯誤!',
+ 'default_category' => '未分類',
+ 'no' => '否',
+ 'not_applicable' => '不可用',
+ 'ok' => '正常!',
+ 'or' => '或',
+ 'yes' => '是',
+ ),
+ 'stream' => array(
+ 'load_more' => '載入更多文章',
+ 'mark_all_read' => '全部設為已讀',
+ 'nothing_to_load' => '沒有更多文章',
+ ),
+);
diff --git a/app/i18n/zh-TW/index.php b/app/i18n/zh-TW/index.php
new file mode 100644
index 000000000..4fcae7478
--- /dev/null
+++ b/app/i18n/zh-TW/index.php
@@ -0,0 +1,110 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its *
+ * state. When there is no comment, it means the entry is fully translated. *
+ * The recognized comments are (comment matching is case-insensitive): *
+ * + TODO: the entry has never been translated. *
+ * + DIRTY: the entry has been translated but needs to be updated. *
+ * + IGNORE: the entry does not need to be translated. *
+ * When a comment is not recognized, it is discarded. *
+ ******************************************************************************/
+
+return array(
+ 'about' => array(
+ '_' => '關於',
+ 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', // IGNORE
+ 'bug_reports' => array(
+ 'environment_information' => array(
+ '_' => 'System information', // TODO
+ 'browser' => 'Browser', // TODO
+ 'database' => 'Database', // TODO
+ 'server_software' => 'Server software', // TODO
+ 'version_curl' => 'cURL version', // TODO
+ 'version_frss' => 'FreshRSS version', // TODO
+ 'version_php' => 'PHP version', // TODO
+ ),
+ ),
+ 'bugs_reports' => '報告錯誤',
+ 'documentation' => 'Documentation', // TODO
+ 'freshrss_description' => 'FreshRSS 是一個自托管的 RSS 聚合服務。 它不僅輕快又易用,而且強大又易於配置。',
+ 'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">GitHub Issues</a>',
+ 'license' => '授權',
+ 'project_website' => '項目網站',
+ 'title' => '關於',
+ 'version' => '版本',
+ ),
+ 'feed' => array(
+ 'empty' => '暫時沒有文章可顯示。',
+ 'received' => array(
+ 'before_yesterday' => 'Received before yesterday', // TODO
+ 'today' => 'Received today', // TODO
+ 'yesterday' => 'Received yesterday', // TODO
+ ),
+ 'rss_of' => '%s 的訂閱源',
+ 'title' => '首頁',
+ 'title_fav' => '收藏',
+ 'title_global' => '全局視圖',
+ ),
+ 'log' => array(
+ '_' => '日誌',
+ 'clear' => '清除日誌',
+ 'empty' => '日誌文件為空',
+ 'title' => '日誌',
+ ),
+ 'menu' => array(
+ 'about' => '關於 FreshRSS',
+ 'before_one_day' => '一天前',
+ 'before_one_week' => '一週前',
+ 'bookmark_query' => '收藏當前查詢',
+ 'favorites' => '收藏(%s)',
+ 'global_view' => '全局視圖',
+ 'important' => '重要的源',
+ 'main_stream' => '首頁',
+ 'mark_all_read' => '全部設為已讀',
+ 'mark_cat_read' => '此分類設為已讀',
+ 'mark_feed_read' => '此訂閱源設為已讀',
+ 'mark_selection_unread' => '選中設為已讀',
+ 'mylabels' => '我的標籤',
+ 'newer_first' => '由新至舊',
+ 'non-starred' => '顯示未收藏',
+ 'normal_view' => '普通視圖',
+ 'older_first' => '由舊至新',
+ 'queries' => '自定義查詢',
+ 'read' => '顯示已讀',
+ 'reader_view' => '閱讀視圖',
+ 'rss_view' => '訂閱源',
+ 'search_short' => '搜尋',
+ 'sort' => array(
+ '_' => 'Sorting criteria', // TODO
+ 'c' => array(
+ 'name_asc' => 'Category, feed titles A→Z', // TODO
+ 'name_desc' => 'Category, feed titles Z→A', // TODO
+ ),
+ 'date_asc' => 'Publication date 1→9', // TODO
+ 'date_desc' => 'Publication date 9→1', // TODO
+ 'f' => array(
+ 'name_asc' => 'Feed title A→Z', // TODO
+ 'name_desc' => 'Feed title Z→A', // TODO
+ ),
+ 'id_asc' => 'Freshly received last', // TODO
+ 'id_desc' => 'Freshly received first', // TODO
+ 'link_asc' => 'Link A→Z', // TODO
+ 'link_desc' => 'Link Z→A', // TODO
+ 'rand' => 'Random order', // TODO
+ 'title_asc' => 'Title A→Z', // TODO
+ 'title_desc' => 'Title Z→A', // TODO
+ ),
+ 'starred' => '顯示收藏',
+ 'stats' => '統計',
+ 'subscription' => '訂閱管理',
+ 'unread' => '顯示未讀',
+ ),
+ 'share' => '分享',
+ 'tag' => array(
+ 'related' => '文章標籤',
+ ),
+ 'tos' => array(
+ 'title' => '服務條款',
+ ),
+);
diff --git a/app/i18n/zh-TW/install.php b/app/i18n/zh-TW/install.php
new file mode 100644
index 000000000..85efc75b2
--- /dev/null
+++ b/app/i18n/zh-TW/install.php
@@ -0,0 +1,128 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its *
+ * state. When there is no comment, it means the entry is fully translated. *
+ * The recognized comments are (comment matching is case-insensitive): *
+ * + TODO: the entry has never been translated. *
+ * + DIRTY: the entry has been translated but needs to be updated. *
+ * + IGNORE: the entry does not need to be translated. *
+ * When a comment is not recognized, it is discarded. *
+ ******************************************************************************/
+
+return array(
+ 'action' => array(
+ 'finish' => '完成安裝',
+ 'fix_errors_before' => '請在繼續下一步前修復錯誤',
+ 'keep_install' => '保留當前配置',
+ 'next_step' => '下一步',
+ 'reinstall' => '重新安裝 FreshRSS',
+ ),
+ 'bdd' => array(
+ '_' => '資料庫',
+ 'conf' => array(
+ '_' => '資料庫配置',
+ 'ko' => '請驗證你的資料庫資訊',
+ 'ok' => '數據庫配置已保存',
+ ),
+ 'host' => '主機',
+ 'password' => '密碼',
+ 'prefix' => '表前綴',
+ 'type' => '資料庫類型',
+ 'username' => '使用者名',
+ ),
+ 'check' => array(
+ '_' => '檢查',
+ 'already_installed' => '我們檢測到 FreshRSS 已經安裝!',
+ 'cache' => array(
+ 'nok' => '請檢查 <em>%s</em> 目錄權限。HTTP 伺服器必須有其寫入權限。',
+ 'ok' => 'cache 目錄權限正常',
+ ),
+ 'ctype' => array(
+ 'nok' => '找不到字符類型檢測庫(php-ctype)',
+ 'ok' => '已找到字符類型檢測庫',
+ ),
+ 'curl' => array(
+ 'nok' => '找不到 cURL 庫(php-curl)',
+ 'ok' => '已找到 cURL 庫',
+ ),
+ 'data' => array(
+ 'nok' => '請檢查 <em>%s</em> 目錄權限。HTTP 伺服器必須有其寫入權限。',
+ 'ok' => 'data 目錄權限正常',
+ ),
+ 'dom' => array(
+ 'nok' => '找不到用於瀏覽 DOM 的庫(php-xml)',
+ 'ok' => '已找到用於瀏覽 DOM 的庫',
+ ),
+ 'favicons' => array(
+ 'nok' => '請檢查 <em>%s</em> 目錄權限。HTTP 伺服器必須有其寫入權限。',
+ 'ok' => 'favicons 目錄權限正常',
+ ),
+ 'fileinfo' => array(
+ 'nok' => '找不到 PHP fileinfo 庫(php-fileinfo)',
+ 'ok' => '已找到 fileinfo 庫',
+ ),
+ 'json' => array(
+ 'nok' => '找不到推薦的 JSON 解析庫',
+ 'ok' => '已找到推薦的 JSON 解析庫',
+ ),
+ 'mbstring' => array(
+ 'nok' => '找不到推薦的 Unicode 解析庫(mbstring)',
+ 'ok' => '已找到推薦的 Unicode 解析庫',
+ ),
+ 'pcre' => array(
+ 'nok' => '找不到正則表達式解析庫(php-pcre)',
+ 'ok' => '已找到正則表達式解析庫',
+ ),
+ 'pdo' => array(
+ 'nok' => '找不到 PDO 或支持的驅動(pdo_mysql、pdo_sqlite、pdo_pgsql)',
+ 'ok' => '已找到 PDO 和支持的至少一種驅動(pdo_mysql、pdo_sqlite、pdo_pgsql)',
+ ),
+ 'php' => array(
+ 'nok' => '你的 PHP 版本為 %s,但 FreshRSS 最低需要 %s',
+ 'ok' => '你的 PHP 版本為 %s,與 FreshRSS 兼容',
+ ),
+ 'reload' => '再檢查一遍',
+ 'tmp' => array(
+ 'nok' => '請檢查 <em>%s</em> 目錄權限。HTTP 伺服器必須有其寫入權限。',
+ 'ok' => '緩存目錄權限正常。',
+ ),
+ 'unknown_process_username' => '未知',
+ 'users' => array(
+ 'nok' => '請檢查 <em>%s</em> 目錄權限。HTTP 伺服器必須有其寫入權限。',
+ 'ok' => 'users 目錄權限正常',
+ ),
+ 'xml' => array(
+ 'nok' => '找不到用於 XML 解析庫',
+ 'ok' => '已找到 XML 解析庫',
+ ),
+ ),
+ 'conf' => array(
+ '_' => '常規配置',
+ 'ok' => '常規配置已保存',
+ ),
+ 'congratulations' => '恭喜!',
+ 'default_user' => array(
+ '_' => '預設使用者名',
+ 'max_char' => '最多 16 個數字或字母',
+ ),
+ 'fix_errors_before' => '請在繼續下一步前修復錯誤',
+ 'javascript_is_better' => '啟用 JavaScript 會使 FreshRSS 工作得更好',
+ 'js' => array(
+ 'confirm_reinstall' => '重新安裝 FreshRSS 將會重置之前的配置。你確定要繼續嗎?',
+ ),
+ 'language' => array(
+ '_' => '語言',
+ 'choose' => '為 FreshRSS 選擇語言',
+ 'defined' => '語言已指定',
+ ),
+ 'missing_applied_migrations' => '出現錯誤,你需要手動創建一個空白檔案 <em>%s</em>。',
+ 'ok' => '安裝成功',
+ 'session' => array(
+ 'nok' => 'Web 伺服器似乎未正確配置 PHP 會話所需的 cookie!',
+ ),
+ 'step' => '步驟 %d',
+ 'steps' => '步驟',
+ 'this_is_the_end' => '最後一步',
+ 'title' => '安裝 FreshRSS',
+);
diff --git a/app/i18n/zh-TW/sub.php b/app/i18n/zh-TW/sub.php
new file mode 100644
index 000000000..836de4795
--- /dev/null
+++ b/app/i18n/zh-TW/sub.php
@@ -0,0 +1,307 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its *
+ * state. When there is no comment, it means the entry is fully translated. *
+ * The recognized comments are (comment matching is case-insensitive): *
+ * + TODO: the entry has never been translated. *
+ * + DIRTY: the entry has been translated but needs to be updated. *
+ * + IGNORE: the entry does not need to be translated. *
+ * When a comment is not recognized, it is discarded. *
+ ******************************************************************************/
+
+return array(
+ 'api' => array(
+ 'documentation' => '複製以下地址,以供外部工具使用',
+ 'title' => 'API', // IGNORE
+ ),
+ 'bookmarklet' => array(
+ 'documentation' => '拖動此書簽到你的書簽欄或者右鍵選擇「收藏此連結」,然後在你想要訂閱的頁面上點擊「訂閱」按鈕',
+ 'label' => '訂閱',
+ 'title' => '書簽應用',
+ ),
+ 'category' => array(
+ '_' => '分類',
+ 'add' => '添加分類',
+ 'archiving' => '歸檔',
+ 'dynamic_opml' => array(
+ '_' => '動態訂閱',
+ 'help' => '使用地址上的 <a href="http://opml.org/" target="_blank">OPML 文件</a> 中的訂閱源填充這一分類',
+ ),
+ 'empty' => '空分類',
+ 'expand' => '展開分類',
+ 'information' => '資訊',
+ 'open' => '打開分類',
+ 'opml_url' => 'OPML 地址',
+ 'position' => '顯示位置',
+ 'position_help' => '控制分類排列順序',
+ 'title' => '標題',
+ ),
+ 'feed' => array(
+ 'accept_cookies' => '接受 Cookies',
+ 'accept_cookies_help' => '允許提要伺服器設置 Cookies(僅在請求期間存儲在內存中)',
+ 'add' => '添加訂閱源',
+ 'advanced' => '高級',
+ 'archiving' => '歸檔',
+ 'auth' => array(
+ 'configuration' => '認證',
+ 'help' => '用於連接啟用 HTTP 認證的訂閱源',
+ 'http' => 'HTTP 認證',
+ 'password' => 'HTTP 密碼',
+ 'username' => 'HTTP 用戶名',
+ ),
+ 'change_favicon' => 'Change…', // TODO
+ 'clear_cache' => '總是清除暫存',
+ 'content_action' => array(
+ '_' => '獲取原文後的操作',
+ 'append' => '添加在現有內容後部',
+ 'prepend' => '添加在現有內容前部',
+ 'replace' => '替換現有內容',
+ ),
+ 'content_retrieval' => 'Content retrieval', // TODO
+ 'css_cookie' => '獲取原文時的 Cookies',
+ 'css_cookie_help' => '例:<kbd>foo=bar; gdpr_consent=true; cookie=value</kbd>',
+ 'css_help' => '用於獲取全文(注意,這將耗費更多時間!)',
+ 'css_path' => '原文的 CSS 選擇器',
+ 'css_path_filter' => array(
+ '_' => '需移除元素的 CSS 選擇器',
+ 'help' => '可設置多個 CSS 選擇器,例如:<kbd>footer, aside, p[data-sanitized-class~="menu"]</kbd>',
+ ),
+ 'description' => '描述',
+ 'empty' => '此源為空。請確認它是否正常更新。',
+ 'error' => '此源遇到一些問題。請在確認是否能正常訪問後重試。', // DIRTY
+ 'export-as-opml' => array(
+ 'download' => '下載',
+ 'help' => 'XML file (data subset. <a href="https://freshrss.github.io/FreshRSS/en/developers/OPML.html" target="_blank">See documentation</a>)', // TODO
+ 'label' => '匯出為OPML',
+ ),
+ 'ext_favicon' => 'Set automatically', // TODO
+ 'favicon_changed_by_ext' => 'The icon has been set by the <b>%s</b> extension.', // TODO
+ 'filteractions' => array(
+ '_' => '過濾動作',
+ 'help' => '每行寫一條過濾搜尋 Operators <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">see documentation</a>.', // DIRTY
+ ),
+ 'http_headers' => 'HTTP Headers', // TODO
+ 'http_headers_help' => 'Headers are separated by a newline, and the name and value of a header are separated by a colon (e.g: <kbd><code>Accept: application/atom+xml<br />Authorization: Bearer some-token</code></kbd>).', // TODO
+ 'icon' => 'Icon', // TODO
+ 'information' => '信息',
+ 'keep_min' => '至少保存的文章數',
+ 'kind' => array(
+ '_' => '訂閱源類型',
+ 'html_json' => array(
+ '_' => 'HTML + XPath + JSON dot notation (JSON in HTML)', // TODO
+ 'xpath' => array(
+ '_' => 'XPath for JSON in HTML', // TODO
+ 'help' => 'Example: <code>normalize-space(//script[@type="application/json"])</code> (single JSON)<br />or: <code>//script[@type="application/ld+json"]</code> (one JSON object per article)', // TODO
+ ),
+ ),
+ 'html_xpath' => array(
+ '_' => 'HTML + XPath (Web 抓取)',
+ 'feed_title' => array(
+ '_' => '提要標題',
+ 'help' => '如 <code>//title</code> 或是靜態字元串如 <code>"My custom feed"</code>',
+ ),
+ 'help' => '<dfn><a href="https://www.w3.org/TR/xpath-10/" target="_blank">XPath 1.0</a></dfn> 是為資深用戶準備的標準查詢語言,FreshRSS 用以實現 Web 抓取.',
+ 'item' => array(
+ '_' => '以尋找 <strong>文章</strong><br /><small>(很重要)</small>',
+ 'help' => '例如 <code>//div[@class="news-item"]</code>',
+ ),
+ 'item_author' => array(
+ '_' => '文章作者',
+ 'help' => '可以是靜態字元串,例如 <code>"Anonymous"</code>',
+ ),
+ 'item_categories' => '文章標籤',
+ 'item_content' => array(
+ '_' => '文章內容',
+ 'help' => '例如使用 <code>.</code> 將整個對象作為文章內容',
+ ),
+ 'item_thumbnail' => array(
+ '_' => '文章縮圖',
+ 'help' => '例如 <code>descendant::img/@src</code>',
+ ),
+ 'item_timeFormat' => array(
+ '_' => '自訂日期/時間格式',
+ 'help' => '可選的。支援的格式<a href="https://php.net/datetime.createfromformat" target="_blank"><code>DateTime::createFromFormat()</code></a> 例如 <code>d-m-Y H:i:s</code>',
+ ),
+ 'item_timestamp' => array(
+ '_' => '文章日期:',
+ 'help' => '結果將被 <a href="https://php.net/strtotime" target="_blank"><code>strtotime()</code></a> 解析',
+ ),
+ 'item_title' => array(
+ '_' => '文章標題',
+ 'help' => '注意使用 <a href="https://developer.mozilla.org/docs/Web/XPath/Axes" target="_blank">XPath 軸</a> <code>descendant::</code>,例如 <code>descendant::h2</code>',
+ ),
+ 'item_uid' => array(
+ '_' => '文章唯一標識',
+ 'help' => '可選,例如: <code>descendant::div/@data-uri</code>',
+ ),
+ 'item_uri' => array(
+ '_' => '文章鏈接 (URL)',
+ 'help' => '例如 <code>descendant::a/@href</code>',
+ ),
+ 'relative' => 'XPath(文章):',
+ 'xpath' => 'XPath 定位:',
+ ),
+ 'json_dotnotation' => array(
+ '_' => 'JSON (點「.」符號)',
+ 'feed_title' => array(
+ '_' => '源標題',
+ 'help' => '範例: <code>meta.title</code> 或固定的字串: <code>"My custom feed"</code>',
+ ),
+ 'help' => 'A JSON dot notated uses dots between objects and brackets for arrays (e.g. <code>data.items[0].title</code>)', // TODO
+ 'item' => array(
+ '_' => '找尋新聞 <strong>項目</strong><br /><small>(最重要的)</small>',
+ 'help' => 'JSON path to the array containing the items, e.g. <code>$</code> or <code>newsItems</code>', // TODO
+ ),
+ 'item_author' => '項目作者',
+ 'item_categories' => '項目標籤',
+ 'item_content' => array(
+ '_' => '項目內容',
+ 'help' => '可以在其下方找到內容的關鍵字, e.g. <code>content</code>',
+ ),
+ 'item_thumbnail' => array(
+ '_' => '項目縮圖',
+ 'help' => '範例: <code>image</code>',
+ ),
+ 'item_timeFormat' => array(
+ '_' => '自訂 日期/時間 格式',
+ 'help' => '選用項目。 支援以<a href="https://php.net/datetime.createfromformat" target="_blank"><code>DateTime::createFromFormat()</code></a> 表達的格式,例如 <code>d-m-Y H:i:s</code>',
+ ),
+ 'item_timestamp' => array(
+ '_' => '項目日期',
+ 'help' => 'The result will be parsed by <a href="https://php.net/strtotime" target="_blank"><code>strtotime()</code></a>', // TODO
+ ),
+ 'item_title' => '項目標題',
+ 'item_uid' => '項目專用ID',
+ 'item_uri' => array(
+ '_' => '項目連結(URL)',
+ 'help' => '範例: <code>永久連結</code>',
+ ),
+ 'json' => 'dot notation for:', // TODO
+ 'relative' => 'dot notated path (relative to item) for:', // TODO
+ ),
+ 'jsonfeed' => 'JSON Feed', // TODO
+ 'rss' => 'RSS / Atom (預設)',
+ 'xml_xpath' => 'XML + XPath', // TODO
+ ),
+ 'maintenance' => array(
+ 'clear_cache' => '清理暫存',
+ 'clear_cache_help' => '清除該feed的暫存',
+ 'reload_articles' => '重載文章',
+ 'reload_articles_help' => '重載 n 篇文章並抓取內容(若設置了 CSS 選擇器)',
+ 'title' => '維護',
+ ),
+ 'max_http_redir' => '最大 HTTP 重定向',
+ 'max_http_redir_help' => '設置為 0 或留空以禁用,-1 表示無限重定向',
+ 'method' => array(
+ '_' => 'HTTP 方法',
+ ),
+ 'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>', // TODO
+ 'method_postparams' => 'Payload for POST', // TODO
+ 'moved_category_deleted' => '刪除分類時,其中的訂閱源會自動歸類到 <em>%s</em>',
+ 'mute' => array(
+ '_' => '暫停',
+ 'state_is_muted' => 'This feed is muted', // TODO
+ ),
+ 'no_selected' => '未選擇訂閱源',
+ 'number_entries' => '%d 篇文章',
+ 'open_feed' => 'Open feed %s', // TODO
+ 'path_entries_conditions' => 'Conditions for content retrieval', // TODO
+ 'priority' => array(
+ '_' => '可見性',
+ 'category' => '在分類中顯示',
+ 'feed' => 'Show in its feed', // TODO
+ 'hidden' => '不顯示',
+ 'important' => '顯示在重要的源',
+ 'main_stream' => '在首頁中顯示',
+ ),
+ 'proxy' => '獲取訂閱源時的代理',
+ 'proxy_help' => '選擇協議(例:SOCKS5)和代理地址(例:<kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)', // DIRTY
+ 'reset_favicon' => 'Reset to default', // TODO
+ 'selector_preview' => array(
+ 'show_raw' => '顯示源碼',
+ 'show_rendered' => '顯示內容',
+ ),
+ 'show' => array(
+ 'all' => '顯示所有訂閱源',
+ 'error' => '僅顯示有錯誤的訂閱源',
+ ),
+ 'showing' => array(
+ 'error' => '正在顯示有錯誤的訂閱源',
+ ),
+ 'ssl_verify' => '驗證 SSL 證書安全',
+ 'stats' => '統計',
+ 'think_to_add' => '你可以添加一些訂閱源。',
+ 'timeout' => '超時時間(秒)',
+ 'title' => '標題',
+ 'title_add' => '添加訂閱源',
+ 'ttl' => '最小自動更新間隔',
+ 'unicityCriteria' => array(
+ '_' => 'Article unicity criteria', // TODO
+ 'forced' => '<span title="Block the unicity criteria, even when the feed has duplicate articles">forced</span>', // TODO
+ 'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.', // TODO
+ 'id' => 'Standard ID (default)', // TODO
+ 'link' => 'Link', // TODO
+ 'sha1:content' => 'Content', // TODO
+ 'sha1:content_published' => 'Content + Date', // TODO
+ 'sha1:link_published' => 'Link + Date', // TODO
+ 'sha1:link_published_title' => 'Link + Date + Title', // TODO
+ 'sha1:link_published_title_content' => 'Link + Date + Title + Content', // TODO
+ 'sha1:published' => 'Date', // TODO
+ 'sha1:title' => 'Title', // TODO
+ 'sha1:title_published' => 'Title + Date', // TODO
+ 'sha1:title_published_content' => 'Title + Date + Content', // TODO
+ ),
+ 'url' => '源地址',
+ 'useragent' => '設置用於獲取此源的 User Agent',
+ 'useragent_help' => '例:<kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',
+ 'validator' => '檢查訂閱源有效性',
+ 'website' => '網站地址',
+ 'websub' => 'WebSub 即時通知',
+ ),
+ 'import_export' => array(
+ 'export' => array(
+ '_' => '導出',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
+ 'export_labelled' => '導出有標籤的文章',
+ 'export_opml' => '導出訂閱源列表(OPML)',
+ 'export_starred' => '導出你的收藏',
+ 'feed_list' => '%s 文章列表',
+ 'file_to_import' => '需要導入的文件<br />(OPML、JSON 或 ZIP)',
+ 'file_to_import_no_zip' => '需要導入的文件<br />(OPML 或 JSON)',
+ 'import' => '導入',
+ 'starred_list' => '收藏文章列表',
+ 'title' => '導入/導出',
+ ),
+ 'menu' => array(
+ 'add' => '添加訂閱源或分類',
+ 'import_export' => '導入/導出',
+ 'label_management' => '標籤管理',
+ 'stats' => array(
+ 'idle' => '長期無更新訂閱源',
+ 'main' => '主要統計',
+ 'repartition' => '文章分布',
+ ),
+ 'subscription_management' => '訂閱管理',
+ 'subscription_tools' => '訂閱工具',
+ ),
+ 'tag' => array(
+ 'auto_label' => '新增標籤給新文章',
+ 'name' => '名稱',
+ 'new_name' => '新名稱',
+ 'old_name' => '舊名稱',
+ ),
+ 'title' => array(
+ '_' => '訂閱管理',
+ 'add' => '添加訂閱源或分類',
+ 'add_category' => '添加分類',
+ 'add_dynamic_opml' => '添加訂閱源動態列表',
+ 'add_feed' => '添加訂閱源',
+ 'add_label' => '添加標籤',
+ 'add_opml_category' => 'OPML category name', // TODO
+ 'delete_label' => '刪除標籤',
+ 'feed_management' => '訂閱源管理',
+ 'subscription_tools' => '訂閱工具',
+ ),
+);
diff --git a/app/i18n/zh-TW/user.php b/app/i18n/zh-TW/user.php
new file mode 100644
index 000000000..1ef0f5a12
--- /dev/null
+++ b/app/i18n/zh-TW/user.php
@@ -0,0 +1,54 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its *
+ * state. When there is no comment, it means the entry is fully translated. *
+ * The recognized comments are (comment matching is case-insensitive): *
+ * + TODO: the entry has never been translated. *
+ * + DIRTY: the entry has been translated but needs to be updated. *
+ * + IGNORE: the entry does not need to be translated. *
+ * When a comment is not recognized, it is discarded. *
+ ******************************************************************************/
+
+return array(
+ 'email' => array(
+ 'feedback' => array(
+ 'invalid' => '電子郵箱地址無效',
+ 'required' => '必須填寫郵箱地址',
+ ),
+ 'validation' => array(
+ 'change_email' => '您可以在 <a href="%s">使用者管理</a> 中變更您的郵箱地址',
+ 'email_sent_to' => '我們已通過 <strong>%s</strong> 發送驗證郵件給您,請按其中指示來驗證郵箱地址。',
+ 'feedback' => array(
+ 'email_failed' => '由於伺服器配置錯誤,我們無法向您發送郵件。',
+ 'email_sent' => '郵件已發送到您的郵箱中',
+ 'error' => '郵箱地址無法通過驗證',
+ 'ok' => '郵箱地址已成功通過驗證',
+ 'unnecessary' => '該郵箱地址已被驗證',
+ 'wrong_token' => '由於令牌錯誤,郵箱地址無法通過驗證。',
+ ),
+ 'need_to' => '您需要先驗證郵箱地址才能使用 %s',
+ 'resend_email' => '重發郵件',
+ 'title' => '驗證郵箱地址',
+ ),
+ ),
+ 'mailer' => array(
+ 'email_need_validation' => array(
+ 'body' => '%s,歡迎',
+ 'title' => '您需要驗證您的帳號',
+ 'welcome' => '您已註冊 %s 現在只需點擊下方連結通過郵箱驗證即可完成註冊:',
+ ),
+ ),
+ 'password' => array(
+ 'invalid' => '無效密碼',
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => '您必須接受服務條款才能註冊',
+ ),
+ ),
+ 'username' => array(
+ 'invalid' => '無效用戶名',
+ 'taken' => '已存在此用戶名',
+ ),
+);