diff --git a/app/assets/javascripts/components/containers/mastodon.jsx b/app/assets/javascripts/components/containers/mastodon.jsx index d48bb2ba986e8a43fa390c283235ad633cae6a50..37440da864160490bdb33a10dd5abcca4efb544d 100644 --- a/app/assets/javascripts/components/containers/mastodon.jsx +++ b/app/assets/javascripts/components/containers/mastodon.jsx @@ -41,15 +41,17 @@ import Report from '../features/report'; import { IntlProvider, addLocaleData } from 'react-intl'; import en from 'react-intl/locale-data/en'; import de from 'react-intl/locale-data/de'; +import eo from 'react-intl/locale-data/eo'; import es from 'react-intl/locale-data/es'; +import fi from 'react-intl/locale-data/fi'; import fr from 'react-intl/locale-data/fr'; -import pt from 'react-intl/locale-data/pt'; import hu from 'react-intl/locale-data/hu'; -import uk from 'react-intl/locale-data/uk'; -import fi from 'react-intl/locale-data/fi'; -import eo from 'react-intl/locale-data/eo'; -import ru from 'react-intl/locale-data/ru'; import ja from 'react-intl/locale-data/ja'; +import pt from 'react-intl/locale-data/pt'; +import ru from 'react-intl/locale-data/ru'; +import uk from 'react-intl/locale-data/uk'; +import zh from 'react-intl/locale-data/zh'; +import { localeData as zh_hk } from '../locales/zh-hk'; import getMessagesForLocale from '../locales'; import { hydrateStore } from '../actions/store'; @@ -64,7 +66,21 @@ const browserHistory = useRouterHistory(createBrowserHistory)({ }); -addLocaleData([...en, ...de, ...es, ...fr, ...pt, ...hu, ...uk, ...fi, ...eo, ...ru, ...ja]); +addLocaleData([ + ...en, + ...de, + ...eo, + ...es, + ...fi, + ...fr, + ...hu, + ...ja, + ...pt, + ...ru, + ...uk, + ...zh, + ...zh_hk, +]); const Mastodon = React.createClass({ diff --git a/app/assets/javascripts/components/locales/index.jsx b/app/assets/javascripts/components/locales/index.jsx index da85240b7e463fb855e752bfda85a4ac66be43ed..c3c5784abaeb686f598216816ecd93309a7b5d0b 100644 --- a/app/assets/javascripts/components/locales/index.jsx +++ b/app/assets/javascripts/components/locales/index.jsx @@ -9,6 +9,7 @@ import fi from './fi'; import eo from './eo'; import ru from './ru'; import ja from './ja'; +import zh_hk from './zh-hk'; const locales = { @@ -22,8 +23,8 @@ const locales = { fi, eo, ru, - ja - + ja, + 'zh-HK': zh_hk, }; export default function getMessagesForLocale (locale) { diff --git a/app/assets/javascripts/components/locales/zh-hk.jsx b/app/assets/javascripts/components/locales/zh-hk.jsx new file mode 100644 index 0000000000000000000000000000000000000000..b26a8c3dd6d66a6fa5f680f67253a4ee657ca026 --- /dev/null +++ b/app/assets/javascripts/components/locales/zh-hk.jsx @@ -0,0 +1,113 @@ +import zh from 'react-intl/locale-data/zh'; + +const localeData = zh.reduce(function (acc, localeData) { + if (localeData.locale === "zh-Hant-HK") { + // rename the locale "zh-Hant-HK" as "zh-HK" + // (match the code usually used in Accepted-Language header) + acc.push(Object.assign({}, + localeData, + { + "locale": "zh-HK", + "parentLocale": "zh-Hant-HK", + } + )); + } + return acc; +}, []); + +export { localeData as localeData }; + +const zh_hk = { + "account.block": "å°éŽ– @{name}", + "account.edit_profile": "修改個人資料", + "account.follow": "關注", + "account.followers": "關注的人", + "account.follows_you": "é—œæ³¨ä½ ", + "account.follows": "æ£åœ¨é—œæ³¨", + "account.mention": "æåŠ @{name}", + "account.posts": "æ–‡ç« ", + "account.requested": "ç‰å€™å¯©æ‰¹", + "account.unblock": "è§£é™¤å° @{name} çš„å°éŽ–", + "account.unfollow": "å–æ¶ˆé—œæ³¨", + "column_back_button.label": "å…ˆå‰é¡¯ç¤º", + "column.community": "本站時間軸", + "column.home": "å®¶", + "column.notifications": "通知", + "column.public": "跨站公共時間軸", + "compose_form.placeholder": "ä½ åœ¨æƒ³ç”šéº¼ï¼Ÿ", + "compose_form.privacy_disclaimer": "ä½ çš„ç§äººæ–‡ç« ,將被éžé€è‡³ä½ 所æåŠçš„ {domains} ç”¨æˆ¶ã€‚ä½ æ˜¯å¦ä¿¡ä»» {domainsCount, plural, one {這個網站} other {這些網站}}?請留æ„ï¼Œæ–‡ç« ç§éš±è¨å®šåªé©ç”¨æ–¼å„ Mastodon æœå‹™ç«™ï¼Œå¦‚æžœ {domains} {domainsCount, plural, one {䏿˜¯ Mastodon æœå‹™ç«™} other {之䏿œ‰äº›ä¸æ˜¯ Mastodon æœå‹™ç«™}}ï¼Œå°æ–¹å°‡ç„¡æ³•æ”¶åˆ°é€™ç¯‡æ–‡ç« çš„ç§éš±è¨å®šï¼Œç„¶å¾Œå¯èƒ½è¢«è½‰æŽ¨çµ¦ä¸èƒ½é 知的用戶閱讀。", + "compose_form.private": "æ¨™ç¤ºç‚ºã€Œåªæœ‰é—œæ³¨ä½ 的人能看ã€", + "compose_form.publish": "發文", + "compose_form.sensitive": "å°‡åª’é«”æª”æ¡ˆæ¨™ç¤ºç‚ºã€Œæ•æ„Ÿå…§å®¹ã€", + "compose_form.spoiler": "將部份文å—è—æ–¼è¦å‘Šè¨Šæ¯ä¹‹å¾Œ", + "compose_form.unlisted": "請勿在公共時間軸顯示", + "empty_column.community": "本站時間軸暫時未有內容,快貼文來æ¶é 香啊ï¼", + "empty_column.hashtag": "這個標籤暫時未有內容。", + "empty_column.home": "ä½ é‚„æ²’æœ‰é—œæ³¨ä»»ä½•ç”¨æˆ¶ã€‚å¿«çœ‹çœ‹{public},å‘其他用戶æè¨•å§ã€‚", + "empty_column.home.public_timeline": "公共時間軸", + "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up.", + "getting_started.about_addressing": "åªè¦ä½ 知é“一ä½ç”¨æˆ¶çš„用戶å稱和域åï¼Œä½ å¯ä»¥ç”¨ã€Œ@用戶å稱@域åã€çš„æ ¼å¼åœ¨æœå°‹æ¬„尋找該用戶。", + "getting_started.about_shortcuts": "åªè¦è©²ç”¨æˆ¶æ˜¯åœ¨ä½ ç¾åœ¨çš„æœå‹™ç«™é–‹ç«‹ï¼Œä½ å¯ä»¥ç›´æŽ¥è¼¸å…¥ç”¨æˆ¶ð ±·æœå°‹ã€‚åŒæ¨£çš„è¦å‰‡é©ç”¨æ–¼åœ¨æ–‡ç« æåŠåˆ¥çš„用戶。", + "getting_started.apps": "æ‰‹æ©Ÿæˆ–æ¡Œé¢æ‡‰ç”¨ç¨‹å¼", + "getting_started.heading": "開始使用", + "getting_started.open_source_notice": "Mastodon 是一個開放æºç¢¼çš„è»Ÿä»¶ã€‚ä½ å¯ä»¥åœ¨å®˜æ–¹ GitHub ({github}) è²¢ç»æˆ–è€…å›žå ±å•é¡Œã€‚ä½ äº¦å¯é€éŽ{apps}閱讀 Mastodon 上的消æ¯ã€‚", + "home.column_settings.basic": "基本", + "home.column_settings.show_reblogs": "é¡¯ç¤ºè¢«è½‰æŽ¨çš„æ–‡ç« ", + "home.column_settings.show_replies": "é¡¯ç¤ºå›žæ‡‰æ–‡ç« ", + "home.column_settings.advanced": "進階", + "lightbox.close": "關閉", + "loading_indicator.label": "載入ä¸...", + "missing_indicator.label": "找ä¸åˆ°å…§å®¹", + "navigation_bar.community_timeline": "本站時間軸", + "navigation_bar.edit_profile": "修改個人資料", + "navigation_bar.logout": "登出", + "navigation_bar.preferences": "個人è¨å®š", + "navigation_bar.public_timeline": "跨站公共時間軸", + "notification.favourite": "{name} å–œæ¡ä½ çš„æ–‡ç« ", + "notification.follow": "{name} é–‹å§‹é–‹å§‹ä½ ", + "notification.mention": "{name} æåŠä½ ", + "notification.reblog": "{name} è½‰æŽ¨ä½ çš„æ–‡ç« ", + "notifications.column_settings.alert": "顯示桌é¢é€šçŸ¥", + "notifications.column_settings.favourite": "å–œæ¡ä½ çš„æ–‡ç« :", + "notifications.column_settings.follow": "é—œæ³¨ä½ :", + "notifications.column_settings.mention": "æåŠä½ :", + "notifications.column_settings.reblog": "è½‰æŽ¨ä½ çš„æ–‡ç« :", + "notifications.column_settings.show": "在通知欄顯示", + "notifications.column_settings.sound": "æ’æ”¾éŸ³æ•ˆ", + "reply_indicator.cancel": "å–æ¶ˆ", + "report.target": "Reporting", + "search.account": "用戶", + "search.hashtag": "標籤", + "search.placeholder": "æœå°‹", + "search_results.total": "{count} é …çµæžœ", + "search.status_by": "按用戶å稱æœå°‹æ–‡ç« ", + "status.delete": "刪除", + "status.favourite": "å–œæ¡", + "status.load_more": "載入更多", + "status.media_hidden": "éš±è—媒體內容", + "status.mention": "æåŠ @{name}", + "status.open": "å±•é–‹æ–‡ç« ", + "status.reblog": "轉推", + "status.reblogged_by": "{name} 轉推", + "status.reply": "回應", + "status.report": "èˆ‰å ± @{name}", + "status.sensitive_toggle": "點擊顯示", + "status.sensitive_warning": "æ•æ„Ÿå…§å®¹", + "status.show_less": "減少顯示", + "status.show_more": "顯示更多", + "tabs_bar.compose": "撰寫", + "tabs_bar.home": "å®¶", + "tabs_bar.local_timeline": "本站", + "tabs_bar.mentions": "æåŠ", + "tabs_bar.notifications": "通知", + "tabs_bar.public": "跨站公共時間軸", + "tabs_bar.federated_timeline": "跨站", + "upload_area.title": "將檔案拖放至æ¤ä¸Šè¼‰", + "upload_button.label": "上載媒體檔案", + "upload_progress.label": "上載ä¸â€¦â€¦", + "upload_form.undo": "還原", + "video_player.toggle_sound": "開關音效", +}; + +export default zh_hk; diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 8a94df5f4d5749a52d70e781a51b4c32228a11ab..0905138ba0cd39fd1b7d3661512bce76b5769afd 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -6,15 +6,15 @@ module SettingsHelper de: 'Deutsch', es: 'Español', eo: 'Esperanto', - pt: 'Português', fr: 'Français', hu: 'Magyar', - uk: 'УкраїнÑька', - 'zh-CN': 'ç®€ä½“ä¸æ–‡', + pt: 'Português', fi: 'Suomi', ru: 'РуÑÑкий', + uk: 'УкраїнÑька', ja: '日本語', - + 'zh-CN': 'ç®€ä½“ä¸æ–‡', + 'zh-HK': 'ç¹é«”䏿–‡ï¼ˆé¦™æ¸¯ï¼‰', }.freeze def human_locale(locale) diff --git a/config/application.rb b/config/application.rb index a3991639c5888529f907a60b753b5d93c0148a34..19523c88cb52ca5f39d0a5cc6ca71bc974a95ce2 100644 --- a/config/application.rb +++ b/config/application.rb @@ -25,7 +25,21 @@ module Mastodon # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] - config.i18n.available_locales = [:en, :de, :es, :pt, :fr, :hu, :uk, 'zh-CN', :fi, :eo, :ru, :ja] + config.i18n.available_locales = [ + :en, + :de, + :eo, + :es, + :fi, + :fr, + :hu, + :ja, + :pt, + :ru, + :uk, + 'zh-CN', + :'zh-HK', + ] config.i18n.default_locale = :en diff --git a/config/locales/devise.zh-HK.yml b/config/locales/devise.zh-HK.yml new file mode 100644 index 0000000000000000000000000000000000000000..cecd40073ab83e3e19d50aa98c9f91372bb9666c --- /dev/null +++ b/config/locales/devise.zh-HK.yml @@ -0,0 +1,61 @@ +--- +zh-HK: + devise: + confirmations: + confirmed: ä½ çš„é›»éƒµåœ°å€ç¢ºèªæˆåŠŸ + send_instructions: ä½ å°‡æœƒåœ¨å¹¾åˆ†é˜å…§æ”¶åˆ°ç¢ºèªæŒ‡ç¤ºé›»éƒµï¼Œä¸Šé¢æœ‰ç¢ºèªä½ 電郵地å€çš„æŒ‡ç¤ºã€‚ + send_paranoid_instructions: å¦‚æžœä½ çš„é›»éƒµåœ°å€å·²ç¶“å˜åœ¨æ–¼æˆ‘å€‘çš„è³‡æ–™åº«ï¼Œä½ å°‡æœƒåœ¨å¹¾åˆ†é˜å…§æ”¶åˆ°é›»éƒµï¼Œç¢ºèªä½ 電郵地å€çš„æŒ‡ç¤ºã€‚ + failure: + already_authenticated: ä½ ä¹‹å‰å·²ç¶“登入了。 + inactive: ä½ çš„ç”¨æˆ¶ä¸¦æœªå•Ÿç”¨ã€‚ + invalid: 䏿£ç¢ºçš„ %{authentication_keys} 或密碼。 + last_attempt: è‹¥ä½ å†ä¸€æ¬¡å˜—è©¦å¤±æ•—ï¼Œæˆ‘å€‘å°‡éŽ–å®šä½ çš„ç”¨æˆ¶ï¼Œä»¥å¯Ÿå®‰å…¨ã€‚ + locked: ä½ çš„ç”¨æˆ¶å·²è¢«éŽ–å®š + not_found_in_database: 䏿£ç¢ºçš„ %{authentication_keys} 或密碼。 + timeout: ä½ çš„ç™»å…¥éšŽæ®µå·²ç¶“éŽæœŸï¼Œè«‹é‡æ–°ç™»å…¥ä»¥ç¹¼çºŒä½¿ç”¨ã€‚ + unauthenticated: ä½ å¿…é ˆå…ˆç™»å…¥æˆ–ç™»è¨˜ï¼Œä»¥ç¹¼çºŒä½¿ç”¨ã€‚ + unconfirmed: ä½ å¿…é ˆå…ˆç¢ºèªé›»éƒµåœ°å€ï¼Œç¹¼çºŒä½¿ç”¨ã€‚ + mailer: + confirmation_instructions: + subject: 'Mastodon: 確èªé›»éƒµåœ°å€' + password_change: + subject: 'Mastodon: 更改密碼' + reset_password_instructions: + subject: 'Mastodon: é‡è¨å¯†ç¢¼' + unlock_instructions: + subject: 'Mastodon: 解除用戶鎖定' + omniauth_callbacks: + failure: 無法以 %{kind} ç™»å…¥ä½ çš„ç”¨æˆ¶ï¼ŒåŽŸå› æ˜¯ï¸°ã€Œ%{reason}ã€ã€‚ + success: æˆåŠŸä»¥ %{kind} ç™»å…¥ä½ çš„ç”¨æˆ¶ã€‚ + passwords: + no_token: ä½ å¿…é ˆä½¿ç”¨é‡è¨å¯†ç¢¼é›»éƒµå…§çš„ç¶²å€é€²å…¥æœ¬é ã€‚å¦‚æžœä½ ç¢ºæ˜¯ä½¿ç”¨é›»éƒµå…§çš„ç¶²å€ï¼Œè«‹ç¢ºèªä½ 用了完整的網å€ã€‚ + send_instructions: ä½ å°‡åœ¨å¹¾åˆ†é˜å…§æ”¶åˆ°é‡è¨å¯†ç¢¼çš„電郵指示。 + send_paranoid_instructions: å¦‚æžœä½ çš„é›»éƒµåœ°å€å·²ç¶“å˜åœ¨æ–¼æˆ‘å€‘çš„è³‡æ–™åº«ï¼Œä½ å°‡æœƒåœ¨å¹¾åˆ†é˜å…§æ”¶åˆ°é‡è¨å¯†ç¢¼çš„電郵指示。 + updated: ä½ çš„å¯†ç¢¼å·²ç¶“æ›´æ–°ï¼Œä½ ç¾åœ¨æ£ç™»å…¥æœ¬ç«™ã€‚ + updated_not_active: ä½ çš„å¯†ç¢¼å·²ç¶“æ›´æ–°ã€‚ + registrations: + destroyed: å†è¦‹äº†ï¼ä½ çš„ç”¨æˆ¶å·²è¢«å–æ¶ˆï¼Œå¸Œæœ›æˆ‘們相有相見的機會å§ã€‚ + signed_up: æ¡è¿Žä½ ï¼ä½ 的登記已經æˆåŠŸã€‚ + signed_up_but_inactive: ä½ çš„ç™»è¨˜å·²ç¶“æˆåŠŸï¼Œå¯æ˜¯ç”±æ–¼ä½ 的用戶還被被啟用,暫時還ä¸èƒ½è®“ä½ ç™»å…¥ã€‚ + signed_up_but_locked: ä½ çš„ç™»è¨˜å·²ç¶“æˆåŠŸï¼Œå¯æ˜¯ç”±æ–¼ä½ çš„ç”¨æˆ¶å·²è¢«éŽ–å®šï¼Œæˆ‘å€‘ç„¡æ³•è®“ä½ ç™»å…¥ã€‚ + signed_up_but_unconfirmed: 一æ¢ç¢ºèªé€£çµå·²ç¶“é›»éƒµåˆ°ä½ çš„éƒµå€ã€‚請使用讓連çµå•Ÿç”¨ä½ 的用戶。 + update_needs_confirmation: ä½ çš„ç”¨æˆ¶å·²ç¶“æ›´æ–°ï¼Œä½†æˆ‘å€‘éœ€è¦ç¢ºèªä½ 的電郵地å€ã€‚è«‹æ‰“é–‹ä½ çš„éƒµç®±ï¼Œä½¿ç”¨ç¢ºèªé›»éƒµçš„連çµä¾†ç¢ºèªçš„地郵å€ã€‚ + updated: ä½ çš„ç”¨æˆ¶å·²ç¶“æˆåŠŸæ›´æ–°ã€‚ + sessions: + already_signed_out: æˆåŠŸç™»å‡ºã€‚ + signed_in: æˆåŠŸç™»å…¥ã€‚ + signed_out: æˆåŠŸç™»å‡ºã€‚ + unlocks: + send_instructions: ä½ å°‡åœ¨å¹¾åˆ†é˜å…§æ”¶åˆ°è§£é™¤ç”¨æˆ¶éŽ–å®šçš„é›»éƒµæŒ‡ç¤ºã€‚ + send_paranoid_instructions: å¦‚æžœä½ çš„é›»éƒµåœ°å€å·²ç¶“å˜åœ¨æ–¼æˆ‘å€‘çš„è³‡æ–™åº«ï¼Œä½ å°‡åœ¨å¹¾åˆ†é˜å…§æ”¶åˆ°è§£é™¤ç”¨æˆ¶éŽ–å®šçš„é›»éƒµæŒ‡ç¤ºã€‚ + unlocked: ä½ çš„ç”¨æˆ¶å·²ç¶“è§£éŽ–ï¼Œè«‹ç™»å…¥ä»¥ç¹¼çºŒã€‚ + errors: + messages: + already_confirmed: å…ˆå‰å·²ç¶“確èªï¼Œè«‹å˜—試登入 + confirmation_period_expired: 需è¦åœ¨ %{period} 之內確èªã€‚è«‹é‡æ–°ç”³è«‹ + expired: å·²ç¶“éŽæœŸï¼Œè«‹é‡æ–°ç”³è«‹ + not_found: 找ä¸åˆ° + not_locked: 並未被鎖定 + not_saved: + one: '1 個錯誤令 %{resource} 被法被儲å˜ï¸°' + other: "%{count} 個錯誤令 %{resource} 被法被儲å˜ï¸°" diff --git a/config/locales/doorkeeper.zh-HK.yml b/config/locales/doorkeeper.zh-HK.yml new file mode 100644 index 0000000000000000000000000000000000000000..90224c7386932f4b92d46531b39322ab94fbee68 --- /dev/null +++ b/config/locales/doorkeeper.zh-HK.yml @@ -0,0 +1,113 @@ +--- +zh-HK: + activerecord: + attributes: + doorkeeper/application: + name: å稱 + redirect_uri: 轉接 URI + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: 'URI ä¸å¯åŒ…å« "#fragment" 部份' + invalid_uri: 必需有æ£ç¢ºçš„ URI. + relative_uri: å¿…éœ€ç‚ºçµ•å° URI. + secured_uri: 必需使用有 HTTPS/SSL åŠ å¯†çš„ URI. + doorkeeper: + applications: + buttons: + authorize: èªè‰ + cancel: å–æ¶ˆ + destroy: 移除 + edit: 編輯 + submit: æäº¤ + confirmations: + destroy: 是å¦ç¢ºå®šï¼Ÿ + edit: + title: ç·¨è¼¯æ‡‰ç”¨ç¨‹å¼ + form: + error: 噢ï¼è«‹æª¢æŸ¥ä½ è¡¨æ ¼çš„éŒ¯èª¤è¨Šæ¯ + help: + native_redirect_uri: 使用 %{native_redirect_uri} 作局部測試 + redirect_uri: æ¯è¡Œè¼¸å…¥ä¸€å€‹ URI + scopes: 請用åŠå½¢ç©ºæ ¼åˆ†é–‹æ¬Šé™ç¯„åœ (scope)。留空表示使用é è¨çš„æ¬Šé™ç¯„åœ + index: + callback_url: å›žå‚³ç¶²å€ + name: å稱 + new: æ–°å¢žæ‡‰ç”¨ç¨‹å¼ + title: ä½ çš„æ‡‰ç”¨ç¨‹å¼ + new: + title: æ–°å¢žæ‡‰ç”¨ç¨‹å¼ + show: + actions: æ“作 + application_id: æ‡‰ç”¨ç¨‹å¼ ID + callback_urls: å›žå‚³ç¶²å€ + scopes: 權é™ç¯„åœ + secret: 密碼 + title: '應用程å¼ï¸° %{name}' + authorizations: + buttons: + authorize: 批准 + deny: 拒絕 + error: + title: 發生錯誤 + new: + able_to: è¦æ±‚ç²å–æ¬Šé™ + prompt: æ‡‰ç”¨ç¨‹å¼ %{client_name} è¦æ±‚å¾—åˆ°ä½ ç”¨æˆ¶çš„éƒ¨ä»½æ¬Šé™ + title: 需è¦ç”¨æˆ¶æŽˆæ¬Š + show: + title: 授權代碼 + authorized_applications: + buttons: + revoke: å–æ¶ˆæŽˆæ¬Š + confirmations: + revoke: 是å¦ç¢ºå®šè¦å–消授權? + index: + application: æ‡‰ç”¨ç¨‹å¼ + created_at: 授權於 + date_format: "%Y-%m-%d %H:%M:%S" + scopes: 權é™ç¯„åœ + title: å·²ç²ä½ æŽˆæ¬Šçš„ç¨‹ç”¨ç¨‹å¼ + errors: + messages: + access_denied: è³‡æºæ“有者或授權伺æœå™¨ä¸æŽ¥å—請求。 + credential_flow_not_configured: è³‡æºæ“有者密碼èªè‰ç¨‹åº (Resource Owner Password Credentials flow) å¤±æ•—ï¼ŒåŽŸå› æ˜¯ Doorkeeper.configure.resource_owner_from_credentials 沒有è¨å®šã€‚ + invalid_client: 用戶程å¼èªè‰ (Client authentication) å¤±æ•—ï¼ŒåŽŸå› æ˜¯ç”¨æˆ¶ç¨‹å¼æœªæœ‰ç™»è¨˜ã€æ²’æœ‰æŒ‡å®šç”¨æˆ¶ç¨‹å¼ (client)ã€æˆ–è€…ä½¿ç”¨äº†ä¸æ”¯æ´çš„èªè‰æ–¹æ³• (method)。 + invalid_grant: 授權申請 (authorization grant) 䏿£ç¢ºã€éŽæœŸã€å·²è¢«å–æ¶ˆï¼Œæˆ–è€…ç„¡æ³•å°æ‡‰æŽˆæ¬Šè«‹æ±‚ (authorization request) 內的轉接 URI,或者屬於別的用戶程å¼ã€‚ + invalid_redirect_uri: 䏿£ç¢ºçš„轉接網å€ã€‚ + invalid_request: 請求缺少了必è¦çš„åƒæ•¸ã€åŒ…å«äº†ä¸æ”¯æ´çš„åƒæ•¸ã€æˆ–者其他輸入錯誤。 + invalid_resource_owner: è³‡æºæ“æœ‰è€…çš„ç™»å…¥è³‡è¨ŠéŒ¯èª¤ã€æˆ–è€…ç„¡æ³•æ‰¾åˆ°è©²è³‡æºæ“有者。 + invalid_scope: 請求的權é™ç¯„åœ (scope) 䏿£ç¢ºã€æœªæœ‰å®šç¾©ã€æˆ–者輸入錯誤。 + invalid_token: + expired: access token å·²ç¶“éŽæœŸ + revoked: access token å·²è¢«å–æ¶ˆ + unknown: access token 䏿£ç¢º + resource_owner_authenticator_not_configured: ç„¡æ³•æ‰¾åˆ°è³‡æºæ“æœ‰è€…ï¼ŒåŽŸå› æ˜¯ Doorkeeper.configure.resource_owner_authenticator 沒有è¨å®šã€‚ + server_error: èªè‰ä¼ºæœå™¨é‡ä¸ŠæœªçŸ¥ç‹€æ³ï¼Œä»¤è«‹æ±‚無法通éŽã€‚ + temporarily_unavailable: èªè‰ä¼ºæœå™¨ç”±æ–¼è‡¨æ™‚è² è·éŽé‡æˆ–者ç¶è·ï¼Œç›®å‰æœªèƒ½è™•ç†è«‹æ±‚。 + unauthorized_client: 用戶程å¼ç„¡æ¬Šç”¨æ¤æ–¹æ³• (method) 請行這個請求。 + unsupported_grant_type: 授權伺æœå™¨ä¸æ”¯æ´é€™å€‹æŽˆæ¬Šé¡žåž‹ (grant type)。 + unsupported_response_type: 授權伺æœå™¨ä¸æ”¯æ´é€™å€‹å›žæ‡‰é¡žåž‹ (response type). + flash: + applications: + create: + notice: 已新增應用程å¼ã€‚ + destroy: + notice: 已刪除應用程å¼ã€‚ + update: + notice: 已更新應用程å¼ã€‚ + authorized_applications: + destroy: + notice: 已喿¶ˆæ‡‰ç”¨ç¨‹å¼æŽˆæ¬Šã€‚ + layouts: + admin: + nav: + applications: æ‡‰ç”¨ç¨‹å¼ + oauth2_provider: OAuth2 供應者 + application: + title: éœ€è¦ OAuth 授權 + scopes: + follow: 關注ã€å°éŽ–ã€è§£é™¤å°éŽ–åŠå–消關注用戶 + read: é–±è®€ä½ çš„ç”¨æˆ¶è³‡æ–™ + write: ä»¥ä½ çš„åç¾©ç™¼ä½ˆæ–‡ç« diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml new file mode 100644 index 0000000000000000000000000000000000000000..07d1452245887aa4c02d5d5bf694f964538548e2 --- /dev/null +++ b/config/locales/simple_form.zh-HK.yml @@ -0,0 +1,46 @@ +--- +zh-HK: + simple_form: + hints: + defaults: + avatar: æ”¯æ´ PNG, GIF 或 JPG 圖片,檔案大å°ä¸Šé™ç‚º 2MBï¼Œæœƒè¢«ç¸®è£æˆ 120x120px + display_name: 最多 30 個å—å…ƒ + header: æ”¯æ´ PNG, GIF 或 JPG 圖片,檔案大å°ä¸Šé™ç‚º 2MBï¼Œæœƒè¢«ç¸®è£æˆ 700x335px + locked: ä½ å¿…é ˆäººæ‰‹æ ¸å‡†æ¯å€‹ç”¨æˆ¶å°ä½ çš„é—œæ³¨è«‹æ±‚ï¼Œè€Œä½ çš„æ–‡ç« ç§éš±æœƒè¢«é è¨ç‚ºã€Œåªæœ‰é—œæ³¨ä½ 的人能看〠+ note: 最多 160 個å—å…ƒ + imports: + data: 自其他æœå‹™ç«™åŒ¯å‡ºçš„ CSV 檔案 + labels: + defaults: + avatar: 個人é åƒ + confirm_new_password: ç¢ºèªæ–°å¯†ç¢¼ + confirm_password: 確èªå¯†ç¢¼ + current_password: ç›®å‰å¯†ç¢¼ + data: 資料 + display_name: 顯示å稱 + email: é›»éƒµåœ°å€ + header: 個人é é¢é ‚部 + locale: 語言 + locked: 將用戶轉為「ç§äººã€ + new_password: 新密碼 + note: 簡介 + otp_attempt: é›™é‡èªè‰ç¢¼ + password: 密碼 + setting_default_privacy: æ–‡ç« é è¨ç§éš±åº¦ + type: 匯入資料類型 + username: 用戶å稱 + interactions: + must_be_follower: éš±è—æ²’æœ‰é—œæ³¨ä½ çš„ç”¨æˆ¶çš„é€šçŸ¥ + must_be_following: éš±è—ä½ ä¸é—œæ³¨çš„用戶的通知 + notification_emails: + digest: å®šæœŸé›»éƒµæ‘˜è¦ + favourite: 當有用戶喜æ¡ä½ çš„æ–‡ç« æ™‚ï¼Œç™¼é›»éƒµé€šçŸ¥ + follow: ç•¶æœ‰ç”¨æˆ¶é—œæ³¨ä½ æ™‚ï¼Œç™¼é›»éƒµé€šçŸ¥ + follow_request: ç•¶æœ‰ç”¨æˆ¶è¦æ±‚é—œæ³¨ä½ æ™‚ï¼Œç™¼é›»éƒµé€šçŸ¥ + mention: ç•¶æœ‰ç”¨æˆ¶åœ¨æ–‡ç« æåŠä½ 時,發電郵通知 + reblog: ç•¶æœ‰ç”¨æˆ¶è½‰æŽ¨ä½ çš„æ–‡ç« æ™‚ï¼Œç™¼é›»éƒµé€šçŸ¥ + 'no': 'å¦' + required: + mark: "*" + text: å¿…é ˆå¡«å¯« + 'yes': '是' diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml new file mode 100644 index 0000000000000000000000000000000000000000..a1c87a7e67293055d7706a7d78070369bdf637fa --- /dev/null +++ b/config/locales/zh-HK.yml @@ -0,0 +1,172 @@ +--- +zh-HK: + about: + about_mastodon: Mastodon (長毛象)是一個<em>自由ã€é–‹æ”¾æºç¢¼</em>的社交網站。它是一個分散å¼çš„æœå‹™ï¼Œé¿å…ä½ çš„é€šè¨Šè¢«å–®ä¸€å•†æ¥æ©Ÿæ§‹å£Ÿæ–·æ“æŽ§ã€‚è«‹ä½ é¸æ“‡ä¸€å®¶ä½ 信任的 Mastodon æœå‹™ç«™ï¼Œåœ¨ä¸Šé¢å»ºç«‹å¸³è™Ÿï¼Œç„¶å¾Œä½ å°±å¯ä»¥å’Œä»»ä¸€ Mastodon æœå‹™ç«™ä¸Šçš„用戶互通,享å—無縫的<em>社交網絡</em>交æµã€‚ + about_this: 關於本æœå‹™ç«™ + apps: æ‡‰ç”¨ç¨‹å¼ + business_email: 商æ¥é›»éƒµï¸° + closed_registrations: 本æœå‹™ç«™æš«æ™‚åœæ¢æŽ¥å—登記。 + contact: è¯çµ¡ + description_headline: 關於 %{domain} + domain_count_after: 個其他æœå‹™ç«™ + domain_count_before: 已連接至 + features: + api: 開放 API,供å„弿‡‰ç”¨ç¨‹å¼åŠæœå‹™é€£å…¥ + blocks: 完善的å°éŽ–ç”¨æˆ¶ã€éœéŸ³åŠŸèƒ½ + characters: æ¯ç¯‡æ–‡ç« 最多 500 å— + chronology: æ™‚é–“è»¸å¿ å¯¦æŒ‰æ™‚åºé¡¯ç¤ºæ–‡ç« ,ä¸ä½œå¤šé¤˜è™•ç† + ethics: 良心è¨è¨ˆï¸°æ²’有廣告,ä¸è¿½è¹¤ä½ 的使用行為 + gifv: 支æ´é¡¯ç¤º GIFV çŸç‰‡åœ–組 + privacy: å¯é€ç¯‡æ–‡ç« è¨å®šç§éš±åº¦ + public: 公共時間軸 + features_headline: 甚麼讓 Mastodon 與眾ä¸åŒ + get_started: ç«‹å³ç™»è¨˜ + links: é€£çµ + other_instances: å…¶ä»–æœå‹™ç«™ + source_code: æºä»£ç¢¼ + status_count_after: ç¯‡æ–‡ç« + status_count_before: 他們共發佈了 + terms: ä½¿ç”¨æ¢æ¬¾ + user_count_after: ä½ä½¿ç”¨è€… + user_count_before: 這è£å…±è¨»å†Šæœ‰ + accounts: + follow: 關注 + followers: 關注者 + following: æ£åœ¨é—œæ³¨ + nothing_here: 暫時未有內容å¯ä»¥é¡¯ç¤º + people_followed_by: '%{name} 關注的人' + people_who_follow: 關注 %{name} 的人 + posts: æ–‡ç« + remote_follow: 跨站關注 + unfollow: å–æ¶ˆé—œæ³¨ + application_mailer: + settings: '修改電郵è¨å®šï¸° %{link}' + signature: 來自 %{instance} çš„ Mastodon 通知 + view: '進入ç€è¦½ï¸°' + applications: + invalid_url: 所æä¾›çš„ç¶²å€ä¸æ£ç¢º + auth: + change_password: 登入資訊 + didnt_get_confirmation: æ²’æœ‰æ”¶åˆ°ç¢ºèªæŒ‡ç¤ºé›»éƒµï¼Ÿ + forgot_password: 忘記了密碼? + login: 登入 + logout: 登出 + register: 登記 + resend_confirmation: é‡ç™¼ç¢ºèªæŒ‡ç¤ºé›»éƒµ + reset_password: é‡è¨å¯†ç¢¼ + set_new_password: è¨å®šæ–°å¯†ç¢¼ + authorize_follow: + error: å°ä¸èµ·ï¼Œå°‹æ‰¾é€™å€‹è·¨ç«™ç”¨æˆ¶çš„éŽç¨‹ç™¼ç”ŸéŒ¯èª¤ + follow: 關注 + prompt_html: 'ä½ (<strong>%{self}</strong>) æ£æº–備關注︰' + title: 關注 %{acct} + datetime: + distance_in_words: + about_x_hours: "%{count}å°æ™‚å‰" + about_x_months: "%{count}個月å‰" + about_x_years: "%{count}å¹´å‰" + almost_x_years: "接近%{count}å¹´å‰" + half_a_minute: 剛剛 + less_than_x_minutes: "å°‘æ–¼%{count}分é˜å‰" + less_than_x_seconds: 剛剛 + over_x_years: "%{count}y" + x_days: "%{count}æ—¥" + x_minutes: "%{count}分é˜" + x_months: "%{count}個月" + x_seconds: "%{count}ç§’" + exports: + blocks: è¢«ä½ å°éŽ–çš„ç”¨æˆ¶ + csv: CSV + follows: ä½ æ‰€é—œæ³¨çš„ç”¨æˆ¶ + storage: 媒體容é‡å¤§å° + generic: + changes_saved_msg: å·²æˆåŠŸå„²å˜ä¿®æ”¹ + powered_by: 網站由 %{link} 開發 + save_changes: 儲å˜ä¿®æ”¹ + validation_errors: + one: æäº¤çš„資料有å•題 + other: æäº¤çš„資料有 %{count} é …å•題 + imports: + preface: ä½ å¯ä»¥åœ¨æ¤åŒ¯å…¥ä½ 在其他æœå‹™ç«™æ‰€åŒ¯å‡ºçš„è³‡æ–™æª”ï¼ŒåŒ…æ‹¬ï¸°ä½ æ‰€é—œæ³¨çš„ç”¨æˆ¶ï¼Œè¢«ä½ å°éŽ–çš„ç”¨æˆ¶ã€‚ + success: ä½ å·²æˆåŠŸä¸Šè¼‰è³‡æ–™æª”ï¼Œæˆ‘å€‘æ£å°‡è³‡æ–™åŒ¯å…¥ï¼Œè«‹ç¨å€™ + types: + blocking: è¢«ä½ å°éŽ–çš„ç”¨æˆ¶åå–® + following: ä½ æ‰€é—œæ³¨çš„ç”¨æˆ¶åå–® + upload: 上載 + landing_strip_html: <strong>%{name}</strong> 是一個在 <strong>%{domain}</strong> 的用戶。åªè¦ä½ 有任何 Mastodon æœå‹™ç«™ã€æˆ–者è¯ç›Ÿç¶²ç«™çš„用戶,便å¯ä»¥è·¨ç«™é—œæ³¨æ¤ç«™ç”¨æˆ¶ï¼Œæˆ–è€…èˆ‡ä»–å€‘äº’å‹•ã€‚å¦‚æžœä½ æ²’æœ‰é€™é¡žç”¨æˆ¶ï¼Œæ¡è¿Žåœ¨<a href="%{sign_up_path}">æ¤è™•登記</a>。 + media_attachments: + validations: + images_and_video: ä¸èƒ½åœ¨å·²æœ‰åœ–ç‰‡çš„æ–‡ç« ä¸ŠåŠ å…¥å½±ç‰‡ + too_many: ä¸å¯ä»¥åŠ å…¥è¶…éŽ 4 個檔案 + notification_mailer: + digest: + body: 'é€™æ˜¯è‡ªå¾žä½ åœ¨%{since}使用%{instance}ä»¥å¾Œï¼Œä½ éŒ¯å¤±äº†çš„è¨Šæ¯ï¸°' + mention: "%{name} åœ¨æ¤æåŠäº†ä½ ︰" + new_followers_summary: + one: ä½ æ–°ç²å¾—了 1 ä½é—œæ³¨è€…äº†ï¼æå–œï¼ + other: ä½ æ–°ç²å¾—了 %{count} ä½é—œæ³¨è€…了ï¼å¥½åŽ²å®³ï¼ + subject: + one: "è‡ªå¾žä¸Šæ¬¡ç™»å…¥ä»¥ä¾†ï¼Œä½ æ”¶åˆ° 1 則新的通知 \U0001F418" + other: "è‡ªå¾žä¸Šæ¬¡ç™»å…¥ä»¥ä¾†ï¼Œä½ æ”¶åˆ° %{count} 則新的通知 \U0001F418" + favourite: + body: 'ä½ çš„æ–‡ç« ç²å¾— %{name} 的喜愛' + subject: "%{name} å–œæ¡ä½ çš„æ–‡ç« " + follow: + body: "%{name} é–‹å§‹é—œæ³¨ä½ ï¼" + subject: "%{name} ç¾æ£é—œæ³¨ä½ " + follow_request: + body: "%{name} è¦æ±‚é—œæ³¨ä½ " + subject: 'ç‰å€™é—œæ³¨ä½ 的用戶︰ %{name}' + mention: + body: '%{name} åœ¨æ–‡ç« ä¸æåŠä½ ︰' + subject: '%{name} åœ¨æ–‡ç« ä¸æåŠä½ ' + reblog: + body: 'ä½ çš„æ–‡ç« å¾—åˆ° %{name} 的轉推' + subject: "%{name} è½‰æŽ¨äº†ä½ çš„æ–‡ç« " + pagination: + next: 下一é + prev: 上一é + truncate: "……" + remote_follow: + acct: è«‹è¼¸å…¥ä½ çš„ï¸°ç”¨æˆ¶å稱@æœå‹™é»žåŸŸå + missing_resource: ç„¡æ³•æ‰¾åˆ°ä½ ç”¨æˆ¶çš„è½‰æŽ¥ç¶²å€ + proceed: ä¸‹ä¸€æ¥ + prompt: 'ä½ å¸Œæœ›é—œæ³¨ï¸°' + settings: + authorized_apps: æŽˆæ¬Šæ‡‰ç”¨ç¨‹å¼ + back: 回到 Mastodon + edit_profile: 修改個人資料 + export: 匯出 + import: 匯入 + preferences: å好è¨å®š + settings: è¨å®š + two_factor_auth: é›™é‡èªè‰ + statuses: + open_in_web: 開啟網é + over_character_limit: è¶…éŽäº† %{max} å—çš„é™åˆ¶ + show_more: 顯示更多 + visibilities: + private: åªæœ‰é—œæ³¨ä½ 的人能看 + public: 公開 + unlisted: 公開,但ä¸åœ¨å…¬å…±æ™‚間軸顯示 + stream_entries: + click_to_show: 點擊顯示 + reblogged: 轉推 + sensitive_content: æ•æ„Ÿå…§å®¹ + time: + formats: + default: "%Yå¹´%-m月%dæ—¥ %H:%M" + two_factor_auth: + code_hint: è«‹è¼¸å…¥ä½ èªè‰å™¨ç”¢ç”Ÿçš„代碼,以確èªè¨å®š + description_html: ç•¶ä½ å•Ÿç”¨<strong>é›™é‡èªè‰</strong>å¾Œï¼Œä½ ç™»å…¥æ™‚å°‡éœ€è¦ä½¿ä½ æ‰‹æ©Ÿã€æˆ–其他種類èªè‰å™¨ç”¢ç”Ÿçš„代碼。 + disable: åœç”¨ + enable: 啟用 + enabled_success: å·²æˆåŠŸå•Ÿç”¨é›™é‡èªè‰ + instructions_html: <strong>è«‹ç”¨ä½ æ‰‹æ©Ÿçš„èªè‰å™¨æ‡‰ç”¨ç¨‹å¼ï¼ˆå¦‚ Google Authenticatorã€Authy),掃æé€™è£çš„ QR 圖形碼</strong>。在雙é‡èªè‰å•Ÿç”¨å¾Œï¼Œä½ ç™»å…¥æ™‚å°‡é ˆè¦ä½¿ç”¨æ¤æ‡‰ç”¨ç¨‹å¼ç”¢ç”Ÿçš„èªè‰ç¢¼ã€‚ + manual_instructions: å¦‚æžœä½ ç„¡æ³•æŽƒæ QR 圖形碼,請手動輸入這個文å—密碼︰ + setup: è¨å®š + warning: å¦‚æžœä½ ç¾åœ¨ç„¡æ³•æ£ç¢ºè¨å®šä½ 的應用程å¼ï¼Œè«‹å³ã€Œåœç”¨ã€é›™é‡èªè‰ï¼Œå¦å‰‡æ—¥å¾Œå¯èƒ½ç„¡æ³•登入本站。 + wrong_code: ä½ è¼¸å…¥çš„èªè‰ç¢¼ä¸¦ä¸æ£ç¢ºï¼å¯èƒ½ä¼ºæœå™¨æ™‚é–“å’Œä½ æ‰‹æ©Ÿä¸ä¸€è‡´ï¼Œè«‹æª¢æŸ¥ä½ 手機的時é˜ï¼Œæˆ–與本站管ç†å“¡è¯çµ¡ã€‚ + users: + invalid_email: é›»éƒµåœ°å€æ ¼å¼ä¸æ£ç¢º + invalid_otp_token: é›™é‡èªè‰ç¢ºèªç¢¼ä¸æ£ç¢º