From 49db82083c10edfc828a6366fc1260a09e18b32e Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Mon, 8 Sep 2025 16:29:05 +0600 Subject: [PATCH] chore: add support for language dialects --- lib/collections/language_codes.dart | 8 +- lib/l10n/{app_tw.arb => app_zh_TW.arb} | 49 +- lib/l10n/generated/app_localizations.dart | 15 +- lib/l10n/generated/app_localizations_ja.dart | 169 +- lib/l10n/generated/app_localizations_zh.dart | 1502 ++++++++++++++++- lib/l10n/l10n.dart | 2 +- .../getting_started/sections/region.dart | 12 +- .../settings/sections/language_region.dart | 4 +- 8 files changed, 1663 insertions(+), 98 deletions(-) rename lib/l10n/{app_tw.arb => app_zh_TW.arb} (85%) diff --git a/lib/collections/language_codes.dart b/lib/collections/language_codes.dart index f97a16bf..b5d3f7c8 100644 --- a/lib/collections/language_codes.dart +++ b/lib/collections/language_codes.dart @@ -133,7 +133,7 @@ abstract class LanguageLocals { // name: "Chichewa", // nativeName: "chiCheŵa", // ), - "zh": const ISOLanguageName( + "zh_CN": const ISOLanguageName( name: "Simplified Chinese", nativeName: "简体中文", ), @@ -751,9 +751,13 @@ abstract class LanguageLocals { // ) }; - static ISOLanguageName getDisplayLanguage(key) { + static ISOLanguageName getDisplayLanguage(String key, String? countryCode) { if (isoLangs.containsKey(key)) { return isoLangs[key]!; + } else if (countryCode != null && + countryCode.isNotEmpty && + isoLangs.containsKey("${key}_$countryCode")) { + return isoLangs["${key}_$countryCode"]!; } else { throw Exception("Language key incorrect"); } diff --git a/lib/l10n/app_tw.arb b/lib/l10n/app_zh_TW.arb similarity index 85% rename from lib/l10n/app_tw.arb rename to lib/l10n/app_zh_TW.arb index 1069f38d..fa4c3e67 100644 --- a/lib/l10n/app_tw.arb +++ b/lib/l10n/app_zh_TW.arb @@ -430,5 +430,52 @@ "edit_port": "編輯端口", "port_helper_msg": "預設值為 -1,表示隨機數。如果您已配置防火牆,建議設定此項目。", "connect_request": "允許 {client} 連線嗎?", - "connection_request_denied": "連線被拒絕。請求被使用者拒絕。" + "connection_request_denied": "連線被拒絕。請求被使用者拒絕。", + "hipotetical_calculation": "*此為根據線上音樂串流平台平均每次播放 $0.003 至 $0.005 的收益所計算的假設值。此為一個假設性計算,旨在讓使用者了解若他們在不同的音樂串流平台上收聽同一首歌曲,他們將會支付給藝人多少費用。", + "an_error_occurred": "發生錯誤", + "copy_to_clipboard": "複製到剪貼簿", + "view_logs": "檢視日誌", + "retry": "重試", + "no_default_metadata_provider_selected": "您沒有設定預設的中繼資料供應商", + "manage_metadata_providers": "管理中繼資料供應商", + "open_link_in_browser": "要在瀏覽器中開啟連結嗎?", + "do_you_want_to_open_the_following_link": "您想開啟以下連結嗎", + "unsafe_url_warning": "從不受信任的來源開啟連結可能不安全。請務必小心!\n您也可以將連結複製到剪貼簿。", + "copy_link": "複製連結", + "building_your_timeline": "正在根據您的收聽記錄建立您的時間軸...", + "official": "官方", + "author_name": "作者:{author}", + "third_party": "第三方", + "plugin_requires_authentication": "此外掛程式需要驗證", + "update_available": "有可用的更新", + "supports_scrobbling": "支援 Scrobbling", + "plugin_scrobbling_info": "此外掛程式會 Scrobble 您的音樂以產生您的收聽記錄。", + "default_plugin": "預設", + "set_default": "設為預設", + "support": "支援", + "support_plugin_development": "支援外掛程式開發", + "can_access_name_api": "- 可以存取 **{name}** API", + "do_you_want_to_install_this_plugin": "您想安裝此外掛程式嗎?", + "third_party_plugin_warning": "此外掛程式來自第三方儲存庫。請在安裝前確認您信任該來源。", + "author": "作者", + "this_plugin_can_do_following": "此外掛程式可以執行以下操作", + "install": "安裝", + "install_a_metadata_provider": "安裝中繼資料供應商", + "no_tracks_playing": "目前沒有正在播放的曲目", + "synced_lyrics_not_available": "此歌曲沒有同步歌詞。請改用", + "plain_lyrics": "純歌詞", + "tab_instead": "分頁。", + "disclaimer": "免責聲明", + "third_party_plugin_dmca_notice": "Spotube 團隊對任何「第三方」外掛程式不負任何責任(包括法律責任)。\n請自行承擔使用風險。如有任何錯誤/問題,請向該外掛程式的儲存庫回報。\n\n若有任何「第三方」外掛程式違反任何服務/法律實體的服務條款/DMCA,請向「第三方」外掛程式作者或託管平台(如 GitHub/Codeberg)要求採取行動。以上列出的(標記為「第三方」)外掛程式均為公開/社群維護的外掛程式。我們沒有對其進行審核,因此無法對其採取任何行動。\n\n", + "input_does_not_match_format": "輸入不符合所需格式", + "metadata_provider_plugins": "中繼資料供應商外掛程式", + "paste_plugin_download_url": "貼上下載網址、GitHub/Codeberg 儲存庫網址或 .smplug 檔案的直接連結", + "download_and_install_plugin_from_url": "從網址下載並安裝外掛程式", + "failed_to_add_plugin_error": "新增外掛程式失敗:{error}", + "upload_plugin_from_file": "從檔案上傳外掛程式", + "installed": "已安裝", + "available_plugins": "可用的外掛程式", + "configure_your_own_metadata_plugin": "設定您自己的播放清單/專輯/藝人/動態中繼資料供應商", + "audio_scrobblers": "音訊 Scrobblers", + "scrobbling": "Scrobbling" } \ No newline at end of file diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 81c98612..bf6f5211 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -149,7 +149,8 @@ abstract class AppLocalizations { Locale('tr'), Locale('uk'), Locale('vi'), - Locale('zh') + Locale('zh'), + Locale('zh', 'TW') ]; /// No description provided for @guest. @@ -2978,6 +2979,18 @@ class _AppLocalizationsDelegate } AppLocalizations lookupAppLocalizations(Locale locale) { + // Lookup logic when language+country codes are specified. + switch (locale.languageCode) { + case 'zh': + { + switch (locale.countryCode) { + case 'TW': + return AppLocalizationsZhTw(); + } + break; + } + } + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'ar': diff --git a/lib/l10n/generated/app_localizations_ja.dart b/lib/l10n/generated/app_localizations_ja.dart index aafec21f..7ce62161 100644 --- a/lib/l10n/generated/app_localizations_ja.dart +++ b/lib/l10n/generated/app_localizations_ja.dart @@ -82,13 +82,13 @@ class AppLocalizationsJa extends AppLocalizations { String get liked_tracks_description => 'いいねしたすべての曲'; @override - String get playlist => 'プレイリスト'; + String get playlist => '再生リスト'; @override String get create_a_playlist => '再生リストの作成'; @override - String get update_playlist => 'プレイリストを更新'; + String get update_playlist => '再生リストを更新'; @override String get create => '作成'; @@ -139,14 +139,14 @@ class AppLocalizationsJa extends AppLocalizations { String get sort_album => 'アルバム順に並び替え'; @override - String get sort_duration => '時間で並べ替え'; + String get sort_duration => '長さ順に並べ替え'; @override String get sort_tracks => '曲の並び替え'; @override String currently_downloading(Object tracks_length) { - return 'いまダウンロード中 ($tracks_length) 曲'; + return 'ダウンロード中 ($tracks_length) 曲'; } @override @@ -368,7 +368,7 @@ class AppLocalizationsJa extends AppLocalizations { String get download_location => 'ダウンロード先'; @override - String get local_library => 'ローカルライブラリ'; + String get local_library => '端末内ライブラリ'; @override String get add_library_location => 'ライブラリに追加'; @@ -395,10 +395,10 @@ class AppLocalizationsJa extends AppLocalizations { String get system_default => 'システムの既定値'; @override - String get market_place_region => '市場の地域'; + String get market_place_region => '音楽市場の地域'; @override - String get recommendation_country => '推薦先の国'; + String get recommendation_country => 'おすすめの国'; @override String get appearance => '外観'; @@ -588,7 +588,7 @@ class AppLocalizationsJa extends AppLocalizations { String get invidious_instance => 'Invidiousサーバーインスタンス'; @override - String get invidious_description => 'トラックマッチングに使用するInvidiousサーバーインスタンス'; + String get invidious_description => '曲の一致に使用するInvidiousサーバーインスタンス'; @override String get invidious_warning => '一部はうまく機能しない可能性があります。自己責任で使用してください'; @@ -804,17 +804,17 @@ class AppLocalizationsJa extends AppLocalizations { String get search_mode => '検索モード'; @override - String get audio_source => '音声ソース'; + String get audio_source => '音声の提供元'; @override - String get ok => '分かりました'; + String get ok => 'OK'; @override String get failed_to_encrypt => '暗号化に失敗しました'; @override String get encryption_failed_warning => - 'Spotubeはデータを安全に保存するために暗号化を使用しています。しかし、失敗しました。したがって、安全でないストレージにフォールバックします\nLinuxを使用している場合は、gnome-keyring、kde-wallet、keepassxcなどのシークレットサービスがインストールされていることを確認してください'; + 'SpoTubeはデータを安全に保存するために暗号化を用いますが、暗号化に失敗しました。このため、安全でない保存領域への保存に切り替えます\nOSがLinuxなら、gnome-keyring、kde-wallet、keepassxcなどの管理ツールがインストールされていることを確認してください'; @override String get querying_info => '情報を取得中...'; @@ -824,7 +824,7 @@ class AppLocalizationsJa extends AppLocalizations { @override String piped_down_error_instructions(Object pipedInstance) { - return 'Pipedインスタンス$pipedInstanceは現在ダウンしています\n\nインスタンスを変更するか、\'APIタイプ\'を公式のYouTube APIに変更してください\n\n変更後にアプリを再起動してください'; + return 'Pipedインスタンス $pipedInstance は現在ダウンしています\n\nインスタンスを変更するか、「APIの種類」を公式のYouTube APIに変更してください\n\n変更後にアプリを再起動してください'; } @override @@ -834,7 +834,7 @@ class AppLocalizationsJa extends AppLocalizations { String get connection_restored => 'インターネット接続が復旧しました'; @override - String get use_system_title_bar => 'システムタイトルバーを使用する'; + String get use_system_title_bar => 'システムのタイトルバーを使う'; @override String get crunching_results => '結果を処理中...'; @@ -843,40 +843,40 @@ class AppLocalizationsJa extends AppLocalizations { String get search_to_get_results => '結果を取得するために検索'; @override - String get use_amoled_mode => 'AMOLEDモードを使用する'; + String get use_amoled_mode => 'AMOLEDモードを使用'; @override - String get pitch_dark_theme => 'ピッチブラックダートテーマ'; + String get pitch_dark_theme => 'ピッチブラック ダークテーマ'; @override - String get normalize_audio => 'オーディオを正規化する'; + String get normalize_audio => '音声を正規化'; @override - String get change_cover => 'カバーを変更する'; + String get change_cover => 'カバーを変更'; @override - String get add_cover => 'カバーを追加する'; + String get add_cover => 'カバーを追加'; @override - String get restore_defaults => 'デフォルト値に戻す'; + String get restore_defaults => '設定を初期化'; @override - String get download_music_codec => '音楽コーデックをダウンロードする'; + String get download_music_codec => 'ダウンロード用の音声コーデック'; @override - String get streaming_music_codec => 'ストリーミング音楽コーデック'; + String get streaming_music_codec => 'ストリーミング用の音声コーデック'; @override - String get login_with_lastfm => 'Last.fmでログインする'; + String get login_with_lastfm => 'Last.fmでログイン'; @override - String get connect => '接続する'; + String get connect => '接続'; @override - String get disconnect_lastfm => 'Last.fmから切断する'; + String get disconnect_lastfm => 'Last.fmから切断'; @override - String get disconnect => '切断する'; + String get disconnect => '切断'; @override String get username => 'ユーザー名'; @@ -885,10 +885,10 @@ class AppLocalizationsJa extends AppLocalizations { String get password => 'パスワード'; @override - String get login => 'ログインする'; + String get login => 'ログイン'; @override - String get login_with_your_lastfm => 'あなたのLast.fmアカウントでログインする'; + String get login_with_your_lastfm => 'Last.fmアカウントでログイン'; @override String get scrobble_to_lastfm => 'Last.fmにスクロブルする'; @@ -897,7 +897,7 @@ class AppLocalizationsJa extends AppLocalizations { String get go_to_album => 'アルバムに移動'; @override - String get discord_rich_presence => 'ディスコードリッチプレゼンス'; + String get discord_rich_presence => 'Discord リッチプレゼンス'; @override String get browse_all => 'すべてを閲覧'; @@ -912,7 +912,7 @@ class AppLocalizationsJa extends AppLocalizations { String get friends => '友達'; @override - String get no_lyrics_available => '申し訳ありませんが、このトラックの歌詞を見つけることができません'; + String get no_lyrics_available => 'すみません、この曲の歌詞が見つかりません'; @override String get start_a_radio => 'ラジオを開始'; @@ -927,28 +927,28 @@ class AppLocalizationsJa extends AppLocalizations { String get endless_playback => 'エンドレス再生'; @override - String get delete_playlist => 'プレイリストを削除'; + String get delete_playlist => '再生リストを削除'; @override - String get delete_playlist_confirmation => 'このプレイリストを削除してもよろしいですか?'; + String get delete_playlist_confirmation => 'この再生リストを削除しますか?'; @override - String get local_tracks => 'ローカルトラック'; + String get local_tracks => '端末内の曲'; @override - String get local_tab => 'ローカル'; + String get local_tab => '端末内'; @override String get song_link => '曲のリンク'; @override - String get skip_this_nonsense => 'この愚かなことをスキップ'; + String get skip_this_nonsense => 'こんなことはスキップ'; @override String get freedom_of_music => '“音楽の自由”'; @override - String get freedom_of_music_palm => '“手のひらの中の音楽の自由”'; + String get freedom_of_music_palm => '“音楽の自由を思いのままに”'; @override String get get_started => 'さあ始めましょう'; @@ -957,13 +957,13 @@ class AppLocalizationsJa extends AppLocalizations { String get youtube_source_description => '推奨され、最適に機能します。'; @override - String get piped_source_description => '自由に感じますか? YouTubeと同じですが、はるかに無料です。'; + String get piped_source_description => '自由を感じる?YouTubeと同じだけど、はるかに自由です。'; @override - String get jiosaavn_source_description => '南アジア地域向けの最適です。'; + String get jiosaavn_source_description => '南アジア地域では最適です。'; @override - String get invidious_source_description => 'Pipedに似ていますが、より高い可用性があります。'; + String get invidious_source_description => 'Pipedに似ていますが、より利用性があります。'; @override String highest_quality(Object quality) { @@ -971,56 +971,55 @@ class AppLocalizationsJa extends AppLocalizations { } @override - String get select_audio_source => 'オーディオソースを選択'; + String get select_audio_source => '音声の提供元を選択'; @override - String get endless_playback_description => '新しい曲をキューの最後に自動的に追加'; + String get endless_playback_description => 'キューの最後に新しい曲を自動で追加'; @override String get choose_your_region => '地域を選択'; @override - String get choose_your_region_description => - 'これにより、Spotubeがあなたの場所に適したコンテンツを表示できます。'; + String get choose_your_region_description => 'Spotubeがあなたの地域に適したコンテンツを表示します。'; @override String get choose_your_language => '言語を選択してください'; @override - String get help_project_grow => 'このプロジェクトの成長を支援する'; + String get help_project_grow => 'プロジェクトの成長を支援する'; @override String get help_project_grow_description => - 'Spotubeはオープンソースプロジェクトです。プロジェクトに貢献したり、バグを報告したり、新しい機能を提案することで、このプロジェクトの成長に貢献できます。'; + 'SpoTubeはオープンソースプロジェクトです。貢献したり、バグ報告したり、新機能を提案することで、プロジェクトの成長に貢献できます。'; @override - String get contribute_on_github => 'GitHubで貢献する'; + String get contribute_on_github => 'GitHubで貢献'; @override - String get donate_on_open_collective => 'Open Collectiveで寄付する'; + String get donate_on_open_collective => 'Open Collectiveで寄付'; @override String get browse_anonymously => '匿名で閲覧する'; @override - String get enable_connect => '接続を有効にする'; + String get enable_connect => '接続する'; @override - String get enable_connect_description => '他のデバイスからSpotubeを制御する'; + String get enable_connect_description => '他の端末からSpotubeを制御する'; @override - String get devices => 'デバイス'; + String get devices => '機器'; @override - String get select => '選択する'; + String get select => '選択'; @override String connect_client_alert(Object client) { - return '$client によって操作されています'; + return '$client から操作されています'; } @override - String get this_device => 'このデバイス'; + String get this_device => 'この端末'; @override String get remote => 'リモート'; @@ -1030,23 +1029,23 @@ class AppLocalizationsJa extends AppLocalizations { @override String and_n_more(Object count) { - return 'そして $count つのアイテム'; + return 'さらに $count 項目'; } @override - String get recently_played => '最近再生された'; + String get recently_played => '最近聴いた曲'; @override - String get browse_more => 'もっと見る'; + String get browse_more => 'もっと表示'; @override String get no_title => 'タイトルなし'; @override - String get not_playing => '再生中ではありません'; + String get not_playing => '再生なし'; @override - String get epic_failure => '壮大な失敗!'; + String get epic_failure => '壮大なエラー!'; @override String added_num_tracks_to_queue(Object tracks_length) { @@ -1054,7 +1053,7 @@ class AppLocalizationsJa extends AppLocalizations { } @override - String get spotube_has_an_update => 'Spotube にアップデートがあります'; + String get spotube_has_an_update => 'Spotube の最新版あり'; @override String get download_now => '今すぐダウンロード'; @@ -1073,20 +1072,19 @@ class AppLocalizationsJa extends AppLocalizations { String get read_the_latest => '最新の '; @override - String get release_notes => 'リリースノート'; + String get release_notes => '更新情報を読む'; @override - String get pick_color_scheme => 'カラースキームを選択'; + String get pick_color_scheme => 'カラーテーマを選択'; @override String get save => '保存'; @override - String get choose_the_device => 'デバイスを選択:'; + String get choose_the_device => '端末を選択:'; @override - String get multiple_device_connected => - '複数のデバイスが接続されています。\nこのアクションを実行するデバイスを選択してください'; + String get multiple_device_connected => '複数の端末が接続されています。\nこの操作を実行する端末を選択'; @override String get nothing_found => '何も見つかりませんでした'; @@ -1133,7 +1131,7 @@ class AppLocalizationsJa extends AppLocalizations { String get birthday => '誕生日'; @override - String get subscription => 'サブスクリプション'; + String get subscription => '登録'; @override String get not_born => '未出生'; @@ -1159,11 +1157,10 @@ class AppLocalizationsJa extends AppLocalizations { } @override - String get streaming_fees_hypothetical => - '*これは Spotify のストリームあたりの支払い\nが \$0.003 から \$0.005 であると仮定して計算されています。\nこれは、Spotify でその曲を聴いた場合にアーティストにいくら支払ったかの\n洞察を得るための仮定の計算です。'; + String get streaming_fees_hypothetical => 'ストリーミング料金 (概算)'; @override - String get minutes_listened => 'リスニング時間'; + String get minutes_listened => '視聴時間'; @override String get streamed_songs => 'ストリーミングされた曲'; @@ -1200,32 +1197,32 @@ class AppLocalizationsJa extends AppLocalizations { String get summary_songs => '曲'; @override - String get summary_streamed_overall => '全体のストリーミング'; + String get summary_streamed_overall => 'まるごと聴いた'; @override - String get summary_owed_to_artists => '今月アーティストに支払うべき額'; + String get summary_owed_to_artists => '今月アーティストに払う\nべき額'; @override - String get summary_artists => 'アーティストの'; + String get summary_artists => 'アーティスト'; @override - String get summary_music_reached_you => '音楽があなたに届いた'; + String get summary_music_reached_you => 'の音楽が届いた'; @override String get summary_full_albums => 'フルアルバム'; @override - String get summary_got_your_love => 'あなたの愛を受け取った'; + String get summary_got_your_love => 'があなたの愛を受け取った'; @override - String get summary_playlists => 'プレイリスト'; + String get summary_playlists => '再生リスト'; @override - String get summary_were_on_repeat => 'リピートしていた'; + String get summary_were_on_repeat => 'をリピートしました'; @override String total_money(Object money) { - return '合計 $money'; + return '計 $money'; } @override @@ -1233,10 +1230,10 @@ class AppLocalizationsJa extends AppLocalizations { @override String get webview_not_found_description => - 'デバイスにWebviewランタイムがインストールされていません。\nインストールされている場合は、environment PATHにあることを確認してください\n\nインストール後、アプリを再起動してください'; + '端末にWebviewランタイムがインストールされていません。\nインストールされている場合は、環境変数のパスにあるか確認してください\n\nインストール後、アプリを再起動してください'; @override - String get unsupported_platform => 'サポートされていないプラットフォーム'; + String get unsupported_platform => '未対応のプラットフォーム'; @override String get cache_music => '音楽をキャッシュ'; @@ -1276,22 +1273,22 @@ class AppLocalizationsJa extends AppLocalizations { String get undo => '元に戻す'; @override - String get download_all => 'すべてをダウンロード'; + String get download_all => 'すべてダウンロード'; @override - String get add_all_to_playlist => 'すべてをプレイリストに追加'; + String get add_all_to_playlist => 'すべて再生リストに追加'; @override - String get add_all_to_queue => 'すべてをキューに追加'; + String get add_all_to_queue => 'すべてキューに追加'; @override - String get play_all_next => '次にすべてを再生'; + String get play_all_next => 'すべてを次に再生'; @override String get pause => '一時停止'; @override - String get view_all => 'すべてを見る'; + String get view_all => 'すべて表示'; @override String get no_tracks_added_yet => 'まだ曲を追加していないようです'; @@ -1309,7 +1306,7 @@ class AppLocalizationsJa extends AppLocalizations { String get no_favorite_albums_yet => 'まだお気に入りのアルバムを追加していないようです'; @override - String get no_logs_found => 'ログが見つかりませんでした'; + String get no_logs_found => 'ログなし'; @override String get youtube_engine => 'YouTubeエンジン'; @@ -1340,17 +1337,17 @@ class AppLocalizationsJa extends AppLocalizations { String get file_not_found => 'ファイルが見つかりません'; @override - String get custom => 'カスタム'; + String get custom => '独自'; @override - String get add_custom_url => 'カスタムURLを追加'; + String get add_custom_url => '独自にURLを追加'; @override String get edit_port => 'ポートを編集'; @override String get port_helper_msg => - 'デフォルトは-1で、ランダムな番号を示します。ファイアウォールを設定している場合は、これを設定することをお勧めします。'; + '初期設定は-1で、ランダムな番号を示します。ファイアウォールを設定している場合に設定することを推奨します。'; @override String connect_request(Object client) { diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index d5a606a3..e42b6994 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -574,10 +574,10 @@ class AppLocalizationsZh extends AppLocalizations { String get something_went_wrong => '某些地方出现了问题'; @override - String get piped_instance => '管道服务器实例'; + String get piped_instance => 'Piped 服务器实例'; @override - String get piped_description => '管道服务器实例用于匹配歌曲'; + String get piped_description => 'Piped 服务器实例用于匹配歌曲'; @override String get piped_warning => '它们中的一部分可能并不能正常工作。使用时请自行承担风险'; @@ -1501,3 +1501,1501 @@ class AppLocalizationsZh extends AppLocalizations { @override String get scrobbling => 'Scrobbling'; } + +/// The translations for Chinese, as used in Taiwan (`zh_TW`). +class AppLocalizationsZhTw extends AppLocalizationsZh { + AppLocalizationsZhTw() : super('zh_TW'); + + @override + String get guest => '訪客'; + + @override + String get browse => '瀏覽'; + + @override + String get search => '搜尋'; + + @override + String get library => '音樂庫'; + + @override + String get lyrics => '歌詞'; + + @override + String get settings => '設定'; + + @override + String get genre_categories_filter => '過濾分類...'; + + @override + String get genre => '探索歌單'; + + @override + String get personalized => '為你打造'; + + @override + String get featured => '推薦'; + + @override + String get new_releases => '新歌熱播'; + + @override + String get songs => '歌曲'; + + @override + String playing_track(Object track) { + return '播放 $track'; + } + + @override + String queue_clear_alert(Object track_length) { + return '這將清空目前的播放清單。$track_length 首歌曲將被移除\n你確定要繼續嗎?'; + } + + @override + String get load_more => '載入更多'; + + @override + String get playlists => '歌單'; + + @override + String get artists => '藝人'; + + @override + String get albums => '專輯'; + + @override + String get tracks => '歌曲'; + + @override + String get downloads => '下載'; + + @override + String get filter_playlists => '過濾歌單...'; + + @override + String get liked_tracks => '已按讚的歌曲'; + + @override + String get liked_tracks_description => '你按過讚的所有歌曲'; + + @override + String get playlist => '播放清單'; + + @override + String get create_a_playlist => '建立一個歌單'; + + @override + String get update_playlist => '更新播放清單'; + + @override + String get create => '建立'; + + @override + String get cancel => '取消'; + + @override + String get update => '更新'; + + @override + String get playlist_name => '歌單名稱'; + + @override + String get name_of_playlist => '歌單的名稱'; + + @override + String get description => '說明'; + + @override + String get public => '公開'; + + @override + String get collaborative => '共享協作'; + + @override + String get search_local_tracks => '搜尋本地歌曲...'; + + @override + String get play => '播放'; + + @override + String get delete => '刪除'; + + @override + String get none => '無'; + + @override + String get sort_a_z => '依字母順序'; + + @override + String get sort_z_a => '依字母倒序'; + + @override + String get sort_artist => '按藝人'; + + @override + String get sort_album => '按專輯'; + + @override + String get sort_duration => '依長度排序'; + + @override + String get sort_tracks => '排序方式'; + + @override + String currently_downloading(Object tracks_length) { + return '正在下載 ($tracks_length)'; + } + + @override + String get cancel_all => '取消全部'; + + @override + String get filter_artist => '過濾藝人...'; + + @override + String followers(Object followers) { + return '$followers 名追蹤者'; + } + + @override + String get add_artist_to_blacklist => '封鎖該藝人'; + + @override + String get top_tracks => '熱門歌曲'; + + @override + String get fans_also_like => '粉絲也喜歡'; + + @override + String get loading => '載入中...'; + + @override + String get artist => '藝人'; + + @override + String get blacklisted => '已封鎖'; + + @override + String get following => '關注中'; + + @override + String get follow => '關注'; + + @override + String get artist_url_copied => '此名藝人的分享連結已複製至剪貼簿'; + + @override + String added_to_queue(Object tracks) { + return '已新增 $tracks 首歌曲到播放清單'; + } + + @override + String get filter_albums => '過濾專輯...'; + + @override + String get synced => '同步'; + + @override + String get plain => '未同步'; + + @override + String get shuffle => '隨機播放'; + + @override + String get search_tracks => '搜尋歌曲...'; + + @override + String get released => '發表時間'; + + @override + String error(Object error) { + return '發生錯誤: $error'; + } + + @override + String get title => '標題'; + + @override + String get time => '時長'; + + @override + String get more_actions => '更多動作'; + + @override + String download_count(Object count) { + return '下載 ($count) 首歌曲'; + } + + @override + String add_count_to_playlist(Object count) { + return '將 ($count) 首歌曲新增到歌單中'; + } + + @override + String add_count_to_queue(Object count) { + return '新增 ($count) 首歌曲到播放清單'; + } + + @override + String play_count_next(Object count) { + return '接下來將播放 ($count) 首歌曲'; + } + + @override + String get album => '專輯'; + + @override + String copied_to_clipboard(Object data) { + return '已將 $data 複製至剪貼簿'; + } + + @override + String add_to_following_playlists(Object track) { + return '新增 $track 到以下播放清單'; + } + + @override + String get add => '新增'; + + @override + String added_track_to_queue(Object track) { + return '新增 $track 到播放清單'; + } + + @override + String get add_to_queue => '新增至播放清單'; + + @override + String track_will_play_next(Object track) { + return '$track 將在下一首播放'; + } + + @override + String get play_next => '下一首播放'; + + @override + String removed_track_from_queue(Object track) { + return '將 $track 從播放清單移除'; + } + + @override + String get remove_from_queue => '從播放清單移除'; + + @override + String get remove_from_favorites => '取消按讚'; + + @override + String get save_as_favorite => '按讚'; + + @override + String get add_to_playlist => '新增到歌單'; + + @override + String get remove_from_playlist => '從歌單移除'; + + @override + String get add_to_blacklist => '新增到已封鎖清單'; + + @override + String get remove_from_blacklist => '從已封鎖清單移除'; + + @override + String get share => '分享'; + + @override + String get mini_player => '小窗模式'; + + @override + String get slide_to_seek => '滑動以前進或後退'; + + @override + String get shuffle_playlist => '隨機播放歌單'; + + @override + String get unshuffle_playlist => '取消隨機播放歌單'; + + @override + String get previous_track => '上一首歌曲'; + + @override + String get next_track => '下一首歌'; + + @override + String get pause_playback => '暫停播放'; + + @override + String get resume_playback => '恢復播放'; + + @override + String get loop_track => '單曲循環'; + + @override + String get no_loop => '無循環'; + + @override + String get repeat_playlist => '歌單循環'; + + @override + String get queue => '播放清單'; + + @override + String get alternative_track_sources => '其它音源'; + + @override + String get download_track => '下載歌曲'; + + @override + String tracks_in_queue(Object tracks) { + return '$tracks 首歌曲在播放清單中'; + } + + @override + String get clear_all => '清除全部'; + + @override + String get show_hide_ui_on_hover => '游標暫留時顯示 / 隱藏控制列'; + + @override + String get always_on_top => '置頂'; + + @override + String get exit_mini_player => '退出小窗模式'; + + @override + String get download_location => '下載路徑'; + + @override + String get local_library => '本地媒體庫'; + + @override + String get add_library_location => '新增至媒體庫'; + + @override + String get remove_library_location => '從媒體庫移除'; + + @override + String get account => '帳戶'; + + @override + String get logout => '退出'; + + @override + String get logout_of_this_account => '退出該帳戶'; + + @override + String get language_region => '語言與地區'; + + @override + String get language => '語言'; + + @override + String get system_default => '系統預設'; + + @override + String get market_place_region => '市集地區'; + + @override + String get recommendation_country => '請選擇國家與地區以取得對應的音樂推薦'; + + @override + String get appearance => '外觀'; + + @override + String get layout_mode => '佈局類型'; + + @override + String get override_layout_settings => '將覆寫響應式佈局設定'; + + @override + String get adaptive => '響應式'; + + @override + String get compact => '緊湊'; + + @override + String get extended => '寬闊'; + + @override + String get theme => '主題'; + + @override + String get dark => '深色'; + + @override + String get light => '淺色'; + + @override + String get system => '依循系統'; + + @override + String get accent_color => '主色調'; + + @override + String get sync_album_color => '符合封面顏色'; + + @override + String get sync_album_color_description => '選取專輯封面主題色為主色調'; + + @override + String get playback => '播放'; + + @override + String get audio_quality => '音質'; + + @override + String get high => '高'; + + @override + String get low => '低'; + + @override + String get pre_download_play => '下載後播放'; + + @override + String get pre_download_play_description => '先下載歌曲後再播放而非串流播放(建議頻寬較高使用者使用)'; + + @override + String get skip_non_music => '跳過非音樂片段(跳過贊助商廣告)'; + + @override + String get blacklist_description => '已封鎖的歌曲與藝人'; + + @override + String get wait_for_download_to_finish => '請等待目前下載工作完成'; + + @override + String get desktop => '桌面版設定'; + + @override + String get close_behavior => '點選關閉按鈕行為'; + + @override + String get close => '關閉'; + + @override + String get minimize_to_tray => '最小化到工作列'; + + @override + String get show_tray_icon => '顯示工作列圖示'; + + @override + String get about => '關於'; + + @override + String get u_love_spotube => '我們明白你喜歡 Spotube'; + + @override + String get check_for_updates => '檢查更新'; + + @override + String get about_spotube => '關於 Spotube'; + + @override + String get blacklist => '黑名單'; + + @override + String get please_sponsor => '請考慮贊助或捐款'; + + @override + String get spotube_description => 'Spotube,一款輕量、跨平台且完全免費的 Spotify 用戶端。'; + + @override + String get version => '版本'; + + @override + String get build_number => '建置編號'; + + @override + String get founder => '發起人'; + + @override + String get repository => '專案儲存庫'; + + @override + String get bug_issues => '缺陷與問題報告'; + + @override + String get made_with => '於孟加拉🇧🇩用 ❤️ 發電'; + + @override + String get kingkor_roy_tirtho => 'Kingkor Roy Tirtho'; + + @override + String copyright(Object current_year) { + return '© 2021-$current_year Kingkor Roy Tirtho'; + } + + @override + String get license => '授權'; + + @override + String get credentials_will_not_be_shared_disclaimer => + '您大可放心,軟體不會收集或分享任何個人資料給第三方'; + + @override + String get know_how_to_login => '不知道該怎麼辦?'; + + @override + String get follow_step_by_step_guide => '請依照以下說明進行'; + + @override + String cookie_name_cookie(Object name) { + return '$name Cookie'; + } + + @override + String get fill_in_all_fields => '請填入所有欄位'; + + @override + String get submit => '提交'; + + @override + String get exit => '退出'; + + @override + String get previous => '上一步'; + + @override + String get next => '下一步'; + + @override + String get done => '完成'; + + @override + String get step_1 => '步驟 1'; + + @override + String get first_go_to => '首先,前往'; + + @override + String get something_went_wrong => '某些地方出現了問題'; + + @override + String get piped_instance => 'Piped 伺服器實例'; + + @override + String get piped_description => 'Piped 伺服器實例用於匹配歌曲'; + + @override + String get piped_warning => '它們之中的一部分可能無法正常運作。使用時請自行承擔風險'; + + @override + String get invidious_instance => 'Invidious 伺服器實例'; + + @override + String get invidious_description => '用於音軌匹配的 Invidious 伺服器實例'; + + @override + String get invidious_warning => '有些可能無法正常運作。請自行承擔風險'; + + @override + String get generate => '生成'; + + @override + String track_exists(Object track) { + return '曲目 $track 已存在'; + } + + @override + String get replace_downloaded_tracks => '替換已下載的歌曲'; + + @override + String get skip_download_tracks => '下載時跳過已下載的歌曲'; + + @override + String get do_you_want_to_replace => '你確定要取代已下載的歌曲嗎??'; + + @override + String get replace => '取代'; + + @override + String get skip => '跳過'; + + @override + String select_up_to_count_type(Object count, Object type) { + return '選擇最多 $count 種的類型 $type'; + } + + @override + String get select_genres => '選擇曲風'; + + @override + String get add_genres => '新增曲風'; + + @override + String get country => '國家和地區'; + + @override + String get number_of_tracks_generate => '產生歌曲的數目'; + + @override + String get acousticness => '原聲程度'; + + @override + String get danceability => '律動感'; + + @override + String get energy => '衝擊感'; + + @override + String get instrumentalness => '歌唱部分佔比'; + + @override + String get liveness => '現場感'; + + @override + String get loudness => '響度'; + + @override + String get speechiness => '朗誦比例'; + + @override + String get valence => '心理感受'; + + @override + String get popularity => '流行度'; + + @override + String get key => '曲調'; + + @override + String get duration => '歌曲長度 (s)'; + + @override + String get tempo => '每分鐘拍數 (BPM)'; + + @override + String get mode => '旋律重複度'; + + @override + String get time_signature => '音符時值'; + + @override + String get short => '短'; + + @override + String get medium => '中'; + + @override + String get long => '長'; + + @override + String get min => '最低'; + + @override + String get max => '最高'; + + @override + String get target => '目標'; + + @override + String get moderate => '中'; + + @override + String get deselect_all => '取消全選'; + + @override + String get select_all => '全選'; + + @override + String get are_you_sure => '你確定嗎?'; + + @override + String get generating_playlist => '正在產生你的自訂歌單...'; + + @override + String selected_count_tracks(Object count) { + return '已選取 $count 首歌曲'; + } + + @override + String get download_warning => + '如果你大量下載這些歌曲,你顯然在侵犯音樂的版權並對音樂創作社區造成了傷害。我希望你能意識到這一點。永遠要尊重並支持藝術家們的辛勤工作'; + + @override + String get download_ip_ban_warning => + '小心,如果出現超出正常的下載請求,那你的 IP 可能會被 YouTube 封鎖,這意味著你的裝置將在長達 2-3 個月的時間內無法使用該 IP 訪問 YouTube(即使你沒登入)。Spotube 不會因而承擔任何責任'; + + @override + String get by_clicking_accept_terms => '點擊 \'同意\' 代表你同意以下的條款'; + + @override + String get download_agreement_1 => '我明白侵害音樂版權是一件不好的事'; + + @override + String get download_agreement_2 => '我將盡可能支持藝術家的工作。我現在之所以做不到是因為缺乏資金來購買正版'; + + @override + String get download_agreement_3 => + '我完全了解我的 IP 存在被 YouTube 封鎖的風險。並且我明白 Spotube 的擁有者與貢獻者們無須對我目前的行為所導致的任何後果負責'; + + @override + String get decline => '拒絕'; + + @override + String get accept => '同意'; + + @override + String get details => '詳細資訊'; + + @override + String get youtube => 'YouTube'; + + @override + String get channel => '頻道'; + + @override + String get likes => '讚'; + + @override + String get dislikes => '倒讚'; + + @override + String get views => '瀏覽次數'; + + @override + String get streamUrl => '播放串流 URL'; + + @override + String get stop => '停止'; + + @override + String get sort_newest => '依新增日期順序'; + + @override + String get sort_oldest => '依新增日期倒序'; + + @override + String get sleep_timer => '睡眠計時器'; + + @override + String mins(Object minutes) { + return '$minutes 分'; + } + + @override + String hours(Object hours) { + return '$hours 時'; + } + + @override + String hour(Object hours) { + return '$hours 時'; + } + + @override + String get custom_hours => '自訂時長'; + + @override + String get logs => '記錄檔(Log)'; + + @override + String get developers => '開發者'; + + @override + String get not_logged_in => '你尚未登入'; + + @override + String get search_mode => '搜尋模式'; + + @override + String get audio_source => '音訊來源'; + + @override + String get ok => '確定'; + + @override + String get failed_to_encrypt => '加密失敗'; + + @override + String get encryption_failed_warning => + 'Spotube使用加密來安全地儲存您的資料。但是失敗了。因此,它將回退到不安全的儲存空間\n如果您使用Linux,請確保已安裝gnome-keyring、kde-wallet和keepassxc等加密服務'; + + @override + String get querying_info => '正在查詢資訊...'; + + @override + String get piped_api_down => 'Piped API 無法使用'; + + @override + String piped_down_error_instructions(Object pipedInstance) { + return '當前Piped實例 $pipedInstance 不可用\n\n請更改實例或將\'API類型\'更改為官方YouTube API\n\n更改後請確保重新啟動應用程式'; + } + + @override + String get you_are_offline => '您目前處於離線狀態'; + + @override + String get connection_restored => '您的網路連線已恢復'; + + @override + String get use_system_title_bar => '使用作業系統的預設視窗標題列'; + + @override + String get crunching_results => '處理結果中...'; + + @override + String get search_to_get_results => '搜尋以取得結果'; + + @override + String get use_amoled_mode => '使用 AMOLED 模式'; + + @override + String get pitch_dark_theme => '漆黑主題'; + + @override + String get normalize_audio => '標準化音訊'; + + @override + String get change_cover => '更改封面'; + + @override + String get add_cover => '新增封面'; + + @override + String get restore_defaults => '恢復預設值'; + + @override + String get download_music_codec => '下載音樂編解碼器'; + + @override + String get streaming_music_codec => '串流音樂編解碼器'; + + @override + String get login_with_lastfm => '使用 Last.fm 登入'; + + @override + String get connect => '連線'; + + @override + String get disconnect_lastfm => '切斷 Last.fm 連線'; + + @override + String get disconnect => '斷開連線'; + + @override + String get username => '帳號'; + + @override + String get password => '密碼'; + + @override + String get login => '登入'; + + @override + String get login_with_your_lastfm => '使用您的 Last.fm 帳號登入'; + + @override + String get scrobble_to_lastfm => '在 Last.fm 上記錄你的播放'; + + @override + String get go_to_album => '前往專輯'; + + @override + String get discord_rich_presence => 'Discord Rick Presence(Discord 狀態)'; + + @override + String get browse_all => '瀏覽全部'; + + @override + String get genres => '音樂類型'; + + @override + String get explore_genres => '探索音樂類型'; + + @override + String get friends => '好友'; + + @override + String get no_lyrics_available => '抱歉,無法找到這首歌的歌詞'; + + @override + String get start_a_radio => '開始收聽電台'; + + @override + String get how_to_start_radio => '您想如何開始收聽電台?'; + + @override + String get replace_queue_question => '您想要取代目前清單還是追加到清單?'; + + @override + String get endless_playback => '無限播放'; + + @override + String get delete_playlist => '刪除播放清單'; + + @override + String get delete_playlist_confirmation => '您確定要刪除此播放清單嗎?'; + + @override + String get local_tracks => '本地音訊'; + + @override + String get local_tab => '本地'; + + @override + String get song_link => '歌曲連結'; + + @override + String get skip_this_nonsense => '跳過這個無聊內容'; + + @override + String get freedom_of_music => '“音樂的自由”'; + + @override + String get freedom_of_music_palm => '「音樂的自由掌握在您手中」'; + + @override + String get get_started => '我們開始吧'; + + @override + String get youtube_source_description => '建議且效果最佳。'; + + @override + String get piped_source_description => '感覺自由?與 YouTube 一樣,但更自由。'; + + @override + String get jiosaavn_source_description => '最適合南亞地區。'; + + @override + String get invidious_source_description => '類似 Piped,但可用性更高。'; + + @override + String highest_quality(Object quality) { + return '最高音質:$quality'; + } + + @override + String get select_audio_source => '選擇音訊來源'; + + @override + String get endless_playback_description => '自動將新歌曲加入清單的結尾'; + + @override + String get choose_your_region => '選擇您的所在地區'; + + @override + String get choose_your_region_description => '這能幫助 Spotube 為您的所在位置顯示正確的內容。'; + + @override + String get choose_your_language => '選擇您的語言'; + + @override + String get help_project_grow => '幫助這個專案成長'; + + @override + String get help_project_grow_description => + 'Spotube是一個開源專案。您可以透過為專案做出貢獻、回報錯誤或建議新功能來幫助專案成長。'; + + @override + String get contribute_on_github => '在GitHub上做出貢獻'; + + @override + String get donate_on_open_collective => '在Open Collective上捐款'; + + @override + String get browse_anonymously => '匿名瀏覽'; + + @override + String get enable_connect => '啟用連線'; + + @override + String get enable_connect_description => '從其他裝置控制Spotube'; + + @override + String get devices => '裝置'; + + @override + String get select => '選擇'; + + @override + String connect_client_alert(Object client) { + return '您正在被 $client 控制'; + } + + @override + String get this_device => '此裝置'; + + @override + String get remote => '遠端'; + + @override + String get stats => '統計'; + + @override + String and_n_more(Object count) { + return '還有 $count 個'; + } + + @override + String get recently_played => '最近播放'; + + @override + String get browse_more => '瀏覽更多'; + + @override + String get no_title => '無標題'; + + @override + String get not_playing => '未播放'; + + @override + String get epic_failure => '史詩級的失敗!'; + + @override + String added_num_tracks_to_queue(Object tracks_length) { + return '已將 $tracks_length 首曲目新增至清單'; + } + + @override + String get spotube_has_an_update => 'Spotube 有更新版本'; + + @override + String get download_now => '立即下載'; + + @override + String nightly_version(Object nightlyBuildNum) { + return 'Spotube Nightly $nightlyBuildNum 已發佈'; + } + + @override + String release_version(Object version) { + return 'Spotube v$version 已發布'; + } + + @override + String get read_the_latest => '閱讀最新'; + + @override + String get release_notes => '版本說明'; + + @override + String get pick_color_scheme => '選擇配色方案'; + + @override + String get save => '儲存'; + + @override + String get choose_the_device => '選擇裝置:'; + + @override + String get multiple_device_connected => '已連接多個裝置。\n選擇您希望執行此操作的裝置'; + + @override + String get nothing_found => '未找到任何內容'; + + @override + String get the_box_is_empty => '箱子為空'; + + @override + String get top_artists => '熱門藝人'; + + @override + String get top_albums => '熱門專輯'; + + @override + String get this_week => '本週'; + + @override + String get this_month => '本月'; + + @override + String get last_6_months => '過去6個月'; + + @override + String get this_year => '今年'; + + @override + String get last_2_years => '過去2年'; + + @override + String get all_time => '所有時間'; + + @override + String powered_by_provider(Object providerName) { + return '由 $providerName 提供支援'; + } + + @override + String get email => '電子郵件'; + + @override + String get profile_followers => '追蹤者'; + + @override + String get birthday => '生日'; + + @override + String get subscription => '訂閱'; + + @override + String get not_born => '尚未建立'; + + @override + String get hacker => '駭客'; + + @override + String get profile => '個人資訊'; + + @override + String get no_name => '沒有名字'; + + @override + String get edit => '編輯'; + + @override + String get user_profile => '使用者資料'; + + @override + String count_plays(Object count) { + return '$count 次播放'; + } + + @override + String get streaming_fees_hypothetical => + '*基於 Spotify 每次播放的支付金額\n從 \$0.003 到 \$0.005 計算。這是一個假設性的\n計算,旨在讓用戶了解如果他們在 Spotify 上收聽\n這些歌曲,可能會付給作者的金額。'; + + @override + String get minutes_listened => '聽的分鐘數'; + + @override + String get streamed_songs => '已串流歌曲'; + + @override + String count_streams(Object count) { + return '$count 次串流'; + } + + @override + String get owned_by_you => '由您所有'; + + @override + String copied_shareurl_to_clipboard(Object shareUrl) { + return '$shareUrl 已複製到剪貼簿'; + } + + @override + String get hipotetical_calculation => + '*此為根據線上音樂串流平台平均每次播放 \$0.003 至 \$0.005 的收益所計算的假設值。此為一個假設性計算,旨在讓使用者了解若他們在不同的音樂串流平台上收聽同一首歌曲,他們將會支付給藝人多少費用。'; + + @override + String count_mins(Object minutes) { + return '$minutes 分鐘'; + } + + @override + String get summary_minutes => '分鐘'; + + @override + String get summary_listened_to_music => '聽音樂'; + + @override + String get summary_songs => '歌曲'; + + @override + String get summary_streamed_overall => '整體串流媒體'; + + @override + String get summary_owed_to_artists => '本月欠藝術家的'; + + @override + String get summary_artists => '藝術家的'; + + @override + String get summary_music_reached_you => '音樂接觸到你'; + + @override + String get summary_full_albums => '完整專輯'; + + @override + String get summary_got_your_love => '獲得了你的愛心'; + + @override + String get summary_playlists => '播放清單'; + + @override + String get summary_were_on_repeat => '已經重複播放'; + + @override + String total_money(Object money) { + return '總計 $money'; + } + + @override + String get webview_not_found => '未找到 Webview 框架'; + + @override + String get webview_not_found_description => + '您的裝置中未安裝 Webview Runtime。\n如果已安裝,請確保它的位置在系統環境變數(PATH)中\n\n安裝後,重新啟動應用程式'; + + @override + String get unsupported_platform => '不支援的平台'; + + @override + String get cache_music => '快取音樂'; + + @override + String get open => '開啟'; + + @override + String get cache_folder => '快取資料夾'; + + @override + String get export => '導出'; + + @override + String get clear_cache => '清除快取'; + + @override + String get clear_cache_confirmation => '您要清除快取嗎?'; + + @override + String get export_cache_files => '匯出快取檔案'; + + @override + String found_n_files(Object count) { + return '找到 $count 個檔案'; + } + + @override + String get export_cache_confirmation => '您要匯出這些檔案到'; + + @override + String exported_n_out_of_m_files(Object files, Object filesExported) { + return '匯出了 $filesExported / $files 個檔案'; + } + + @override + String get undo => '取消'; + + @override + String get download_all => '下載全部'; + + @override + String get add_all_to_playlist => '全部加入到播放清單'; + + @override + String get add_all_to_queue => '全部加入清單'; + + @override + String get play_all_next => '播放全部下一首'; + + @override + String get pause => '暫停'; + + @override + String get view_all => '檢視全部'; + + @override + String get no_tracks_added_yet => '看起來你還沒有加入任何歌曲'; + + @override + String get no_tracks => '看起來這裡沒有任何歌曲'; + + @override + String get no_tracks_listened_yet => '看起來你還沒聽任何歌曲'; + + @override + String get not_following_artists => '你沒有關注任何藝術家'; + + @override + String get no_favorite_albums_yet => '看起來你還沒有將任何專輯加入到收藏夾'; + + @override + String get no_logs_found => '未找到日誌'; + + @override + String get youtube_engine => 'YouTube 引擎'; + + @override + String youtube_engine_not_installed_title(Object engine) { + return '$engine 未安裝'; + } + + @override + String youtube_engine_not_installed_message(Object engine) { + return '$engine 未在您的系統中安裝。'; + } + + @override + String youtube_engine_set_path(Object engine) { + return '確保它可用在 PATH 變數中,或\n設定 $engine 執行檔的絕對路徑'; + } + + @override + String get youtube_engine_unix_issue_message => + '在類 Unix 作業系統(如 macOS/Linux/Unix)中,請在 .zshrc/.bashrc/.bash_profile 等檔案中設定路徑無效。\n您需要在 shell 設定檔中設定路徑'; + + @override + String get download => '下載'; + + @override + String get file_not_found => '找不到檔案'; + + @override + String get custom => '自訂'; + + @override + String get add_custom_url => '新增自訂 URL'; + + @override + String get edit_port => '編輯端口'; + + @override + String get port_helper_msg => '預設值為 -1,表示隨機數。如果您已配置防火牆,建議設定此項目。'; + + @override + String connect_request(Object client) { + return '允許 $client 連線嗎?'; + } + + @override + String get connection_request_denied => '連線被拒絕。請求被使用者拒絕。'; + + @override + String get an_error_occurred => '發生錯誤'; + + @override + String get copy_to_clipboard => '複製到剪貼簿'; + + @override + String get view_logs => '檢視日誌'; + + @override + String get retry => '重試'; + + @override + String get no_default_metadata_provider_selected => '您沒有設定預設的中繼資料供應商'; + + @override + String get manage_metadata_providers => '管理中繼資料供應商'; + + @override + String get open_link_in_browser => '要在瀏覽器中開啟連結嗎?'; + + @override + String get do_you_want_to_open_the_following_link => '您想開啟以下連結嗎'; + + @override + String get unsafe_url_warning => '從不受信任的來源開啟連結可能不安全。請務必小心!\n您也可以將連結複製到剪貼簿。'; + + @override + String get copy_link => '複製連結'; + + @override + String get building_your_timeline => '正在根據您的收聽記錄建立您的時間軸...'; + + @override + String get official => '官方'; + + @override + String author_name(Object author) { + return '作者:$author'; + } + + @override + String get third_party => '第三方'; + + @override + String get plugin_requires_authentication => '此外掛程式需要驗證'; + + @override + String get update_available => '有可用的更新'; + + @override + String get supports_scrobbling => '支援 Scrobbling'; + + @override + String get plugin_scrobbling_info => '此外掛程式會 Scrobble 您的音樂以產生您的收聽記錄。'; + + @override + String get default_plugin => '預設'; + + @override + String get set_default => '設為預設'; + + @override + String get support => '支援'; + + @override + String get support_plugin_development => '支援外掛程式開發'; + + @override + String can_access_name_api(Object name) { + return '- 可以存取 **$name** API'; + } + + @override + String get do_you_want_to_install_this_plugin => '您想安裝此外掛程式嗎?'; + + @override + String get third_party_plugin_warning => '此外掛程式來自第三方儲存庫。請在安裝前確認您信任該來源。'; + + @override + String get author => '作者'; + + @override + String get this_plugin_can_do_following => '此外掛程式可以執行以下操作'; + + @override + String get install => '安裝'; + + @override + String get install_a_metadata_provider => '安裝中繼資料供應商'; + + @override + String get no_tracks_playing => '目前沒有正在播放的曲目'; + + @override + String get synced_lyrics_not_available => '此歌曲沒有同步歌詞。請改用'; + + @override + String get plain_lyrics => '純歌詞'; + + @override + String get tab_instead => '分頁。'; + + @override + String get disclaimer => '免責聲明'; + + @override + String get third_party_plugin_dmca_notice => + 'Spotube 團隊對任何「第三方」外掛程式不負任何責任(包括法律責任)。\n請自行承擔使用風險。如有任何錯誤/問題,請向該外掛程式的儲存庫回報。\n\n若有任何「第三方」外掛程式違反任何服務/法律實體的服務條款/DMCA,請向「第三方」外掛程式作者或託管平台(如 GitHub/Codeberg)要求採取行動。以上列出的(標記為「第三方」)外掛程式均為公開/社群維護的外掛程式。我們沒有對其進行審核,因此無法對其採取任何行動。\n\n'; + + @override + String get input_does_not_match_format => '輸入不符合所需格式'; + + @override + String get metadata_provider_plugins => '中繼資料供應商外掛程式'; + + @override + String get paste_plugin_download_url => + '貼上下載網址、GitHub/Codeberg 儲存庫網址或 .smplug 檔案的直接連結'; + + @override + String get download_and_install_plugin_from_url => '從網址下載並安裝外掛程式'; + + @override + String failed_to_add_plugin_error(Object error) { + return '新增外掛程式失敗:$error'; + } + + @override + String get upload_plugin_from_file => '從檔案上傳外掛程式'; + + @override + String get installed => '已安裝'; + + @override + String get available_plugins => '可用的外掛程式'; + + @override + String get configure_your_own_metadata_plugin => '設定您自己的播放清單/專輯/藝人/動態中繼資料供應商'; + + @override + String get audio_scrobblers => '音訊 Scrobblers'; + + @override + String get scrobbling => 'Scrobbling'; +} diff --git a/lib/l10n/l10n.dart b/lib/l10n/l10n.dart index dc9285ba..d0aeccc4 100644 --- a/lib/l10n/l10n.dart +++ b/lib/l10n/l10n.dart @@ -50,7 +50,7 @@ class L10n { const Locale('ta', 'IN'), const Locale('tr', 'TR'), const Locale('zh', 'CN'), - const Locale('tw', 'TW'), + const Locale('zh', 'TW'), const Locale('vi', 'VN'), const Locale('eu', 'ES'), ]; diff --git a/lib/pages/getting_started/sections/region.dart b/lib/pages/getting_started/sections/region.dart index 7bfe545d..917cc41e 100644 --- a/lib/pages/getting_started/sections/region.dart +++ b/lib/pages/getting_started/sections/region.dart @@ -21,8 +21,10 @@ class GettingStartedPageLanguageRegionSection extends HookConsumerWidget { } bool filterLocale(Locale locale, String query) { - final language = - LanguageLocals.getDisplayLanguage(locale.languageCode).toString(); + final language = LanguageLocals.getDisplayLanguage( + locale.languageCode, + locale.countryCode, + ).toString(); return language.toLowerCase().contains(query.toLowerCase()); } @@ -124,8 +126,9 @@ class GettingStartedPageLanguageRegionSection extends HookConsumerWidget { ? Text(context.l10n.system_default) : Text( LanguageLocals.getDisplayLanguage( - value.languageCode) - .toString(), + value.languageCode, + value.countryCode, + ).toString(), ), popup: SelectPopup.builder( searchPlaceholder: Text(context.l10n.search), @@ -161,6 +164,7 @@ class GettingStartedPageLanguageRegionSection extends HookConsumerWidget { child: Text( LanguageLocals.getDisplayLanguage( locale.languageCode, + locale.countryCode, ).toString(), ), ); diff --git a/lib/pages/settings/sections/language_region.dart b/lib/pages/settings/sections/language_region.dart index ba4af41d..4e3d95c9 100644 --- a/lib/pages/settings/sections/language_region.dart +++ b/lib/pages/settings/sections/language_region.dart @@ -13,7 +13,9 @@ import 'package:spotube/l10n/l10n.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; final localWithName = L10n.all.map((e) { - final isoCodeName = LanguageLocals.getDisplayLanguage(e.languageCode); + print(e); + final isoCodeName = + LanguageLocals.getDisplayLanguage(e.languageCode, e.countryCode); return ( locale: e, name: "${isoCodeName.name} (${isoCodeName.nativeName})",