Переглянути джерело

Add Traditional Chinese localization and improve Chinese string translations.

Introduce zh-Hant resources with a Settings language option, and localize Google, Apple, and ID terms consistently in both Chinese locales.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 1 місяць тому
батько
коміт
e4ad37597f

+ 1 - 0
Info.plist

@@ -12,6 +12,7 @@
 	<array>
 		<string>en</string>
 		<string>zh-Hans</string>
+		<string>zh-Hant</string>
 	</array>
 	<key>CFBundleDisplayName</key>
 	<string>AI Companion for Meet</string>

+ 1 - 0
meetings_app.xcodeproj/project.pbxproj

@@ -98,6 +98,7 @@
 				en,
 				Base,
 				"zh-Hans",
+				"zh-Hant",
 			);
 			mainGroup = 13AF5D992F83DE22001BE867;
 			minimizedProjectReferenceProxies = 1;

+ 3 - 1
meetings_app/Localization/AppLanguageManager.swift

@@ -8,7 +8,7 @@ enum AppLanguageManager {
     private static let defaultsKey = "settings.appLanguageCode"
 
     /// UI languages shown in Settings → Language (order preserved).
-    private static let supportedLanguageCodes = ["en", "zh-Hans"]
+    private static let supportedLanguageCodes = ["en", "zh-Hans", "zh-Hant"]
 
     /// `nil` follows the system language; otherwise uses the selected `.lproj` code.
     static var selectedLanguageCode: String? {
@@ -59,6 +59,8 @@ enum AppLanguageManager {
             return "English"
         case "zh-Hans":
             return "简体中文"
+        case "zh-Hant":
+            return "繁體中文"
         default:
             return Locale.current.localizedString(forIdentifier: languageCode) ?? languageCode
         }

+ 11 - 11
meetings_app/zh-Hans.lproj/Localizable.strings

@@ -78,7 +78,7 @@
 "Start instant Meet in more section with\nGoogle Meet meet." = "在更多选项中通过\n谷歌会议开始即时会议。";
 "Join with Link" = "通过链接加入";
 "Code or meet.google.com/…" = "代码或 meet.google.com/…";
-"Join with ID" = "通过 ID 加入";
+"Join with ID" = "通过识别码加入";
 "Join with URL" = "通过 URL 加入";
 "Meeting URL" = "会议 URL";
 "Enter meeting URL..." = "输入会议 URL...";
@@ -127,7 +127,7 @@
 "Select date" = "选择日期";
 "Choose a date to schedule your meeting." = "选择日期以安排您的会议。";
 "Google schedule" = "谷歌日程";
-"To show scheduled meetings, connect your Google account. You’ll need a Google OAuth client ID (Desktop) and a redirect URI matching the app’s callback scheme." = "要显示已安排的会议,请连接您的谷歌帐户。您需要谷歌 OAuth 客户端 ID(桌面版)和一个与应用回调方案匹配的重定向 URI。";
+"To show scheduled meetings, connect your Google account. You’ll need a Google OAuth client ID (Desktop) and a redirect URI matching the app’s callback scheme." = "要显示已安排的会议,请连接您的谷歌帐户。您需要谷歌 OAuth 客户端标识符(桌面版)和一个与应用回调方案匹配的重定向 URI。";
 "Actions" = "操作";
 "Schedule meeting" = "安排会议";
 "Team sync" = "团队同步";
@@ -250,7 +250,7 @@
 "Already Premium" = "已是高级版";
 "You are already premium. Do you want to continue with this purchase?" = "您已是高级版。是否要继续此次购买?";
 "Current plan: %@. Choose a different package to switch." = "当前计划:%@。选择其他套餐以切换。";
-"Premium is active on this Apple ID." = "此苹果 ID 上高级版已激活。";
+"Premium is active on this Apple ID." = "此苹果账号上高级版已激活。";
 "Free for %@, then %@" = "%@ 免费,之后 %@";
 "Billed via App Store" = "通过 App Store 计费";
 "%@  •  %@" = "%@  •  %@";
@@ -264,19 +264,19 @@
 "Continue with 3 day trail" = "继续 3 天试用";
 "Please Wait" = "请稍候";
 "A purchase is already being processed." = "已有购买正在处理中。";
-"This Apple ID already has premium access." = "此苹果 ID 已拥有高级版访问权限。";
+"This Apple ID already has premium access." = "此苹果账号已拥有高级版访问权限。";
 "Purchase Complete" = "购买完成";
 "Premium has been unlocked successfully." = "高级版已成功解锁。";
 "Purchase Pending" = "购买待处理";
 "Your purchase is pending approval. You can continue once it completes." = "您的购买正在等待批准。完成后您可以继续。";
 "Product Not Available" = "产品不可用";
-"Unable to load this product. Check your StoreKit configuration and product IDs." = "无法加载此产品。请检查您的 StoreKit 配置和产品 ID。";
+"Unable to load this product. Check your StoreKit configuration and product IDs." = "无法加载此产品。请检查您的 StoreKit 配置和产品标识符。";
 "Already Purchased" = "已购买";
-"This plan is already active on your Apple ID." = "此计划已在您的苹果 ID 上激活。";
+"This plan is already active on your Apple ID." = "此计划已在您的苹果账号上激活。";
 "Purchase Failed" = "购买失败";
 "Restore Purchases" = "恢复购买";
 "Purchases restored successfully." = "购买恢复成功。";
-"No previous premium purchase was found for this Apple ID." = "未找到此苹果 ID 之前的任何高级版购买记录。";
+"No previous premium purchase was found for this Apple ID." = "未找到此苹果账号之前的任何高级版购买记录。";
 "Restore failed: %@" = "恢复失败:%@";
 "Unable to Open Subscriptions" = "无法打开订阅";
 "The subscriptions URL is invalid." = "订阅 URL 无效。";
@@ -295,7 +295,7 @@
 
 /* MARK: - StoreKit 交易错误 */
 "Unable to load products: %@" = "无法加载产品:%@";
-"Product ID not found in StoreKit response. Requested: %@. Loaded IDs: %@" = "StoreKit 响应中未找到产品 ID。请求:%@。已加载的 ID:%@";
+"Product ID not found in StoreKit response. Requested: %@. Loaded IDs: %@" = "StoreKit 响应中未找到产品标识符。请求:%@。已加载的标识符:%@";
 "Purchase verification failed." = "购买验证失败。";
 "Unknown purchase state." = "未知的购买状态。";
 "none" = "无";
@@ -363,7 +363,7 @@
 "Starts in 1 hour" = "1 小时后开始";
 
 /* MARK: - 谷歌 OAuth 错误 */
-"Missing Google OAuth Client ID." = "缺少谷歌 OAuth 客户端 ID。";
+"Missing Google OAuth Client ID." = "缺少谷歌 OAuth 客户端标识符。";
 "Missing Google OAuth Client Secret." = "缺少谷歌 OAuth 客户端密钥。";
 "Invalid OAuth callback URL." = "无效的 OAuth 回调 URL。";
 "Google did not return an authorization code." = "谷歌未返回授权码。";
@@ -422,8 +422,8 @@
 "%@, Google account" = "%@,谷歌帐户";
 
 /* MARK: - Zoom 加入(未使用部分) */
-"Meeting ID" = "会议 ID";
-"Enter meeting ID..." = "输入会议 ID...";
+"Meeting ID" = "会议标识符";
+"Enter meeting ID..." = "输入会议标识符...";
 "Meeting Passcode" = "会议密码";
 "Enter meeting passcode..." = "输入会议密码...";
 

+ 4 - 0
meetings_app/zh-Hant.lproj/InfoPlist.strings

@@ -0,0 +1,4 @@
+"CFBundleDisplayName" = "Meet 智慧助手";
+"CFBundleName" = "Meet 智慧助手";
+"NSMicrophoneUsageDescription" = "經您同意,本應用程式會在本機錄製會議音訊,以便在會議結束後於智慧助手中查看。";
+"NSSpeechRecognitionUsageDescription" = "本應用程式會將您儲存的會議音訊轉換為文字轉錄,供智慧助手使用。";

+ 451 - 0
meetings_app/zh-Hant.lproj/Localizable.strings

@@ -0,0 +1,451 @@
+/* AppBrand.name ("Meetings") 有意省略 — 應用程式名稱在程式碼中保持不變。 */
+"AI Companion for Meet" = "Meet 智慧助手";
+
+/* MARK: - 通用 */
+"OK" = "確定";
+"Cancel" = "取消";
+"Continue" = "繼續";
+"Apply" = "套用";
+"Reset" = "重設";
+"Save" = "儲存";
+"Copy" = "複製";
+"Copied" = "已複製";
+"Close" = "關閉";
+"Join" = "加入";
+"None" = "無";
+"Link" = "連結";
+"Stop" = "停止";
+"Address" = "地址";
+"Title" = "標題";
+"Notes" = "備註";
+"Start" = "開始";
+"Premium" = "進階版";
+"Popular" = "熱門";
+"Browser" = "瀏覽器";
+"Meeting" = "會議";
+"Error" = "錯誤";
+"Success" = "成功";
+
+/* MARK: - 狀態列 */
+"Meetings status menu" = "會議狀態選單";
+"Open App" = "打開應用程式";
+"Join Meetings" = "加入會議";
+"Schedule" = "日程安排";
+"Calendar" = "日曆";
+"Widgets" = "小工具";
+"AI Companion" = "智慧助手";
+"Settings" = "設定";
+"Top meetings" = "置頂會議";
+"No upcoming meetings" = "沒有即將開始的會議";
+"Sign Out" = "登出";
+"Sign In" = "登入";
+"Quit" = "退出";
+
+/* MARK: - 啟動閃屏 */
+"Preparing your meetings workspace" = "正在準備您的會議工作區";
+"CONNECTING SERVICES" = "正在連接服務";
+"READY" = "就緒";
+"Plan smart, achieve more" = "智慧規劃,成就更多";
+
+/* MARK: - 小工具 */
+"Add Widget to Desktop" = "加入小工具到桌面";
+"Choose a size and add your Google Meet widget." = "選擇尺寸並加入您的谷歌會議小工具。";
+"Tip: Right-click a desktop widget to remove it." = "提示:在桌面小工具上按右鍵可將其移除。";
+"Removed %@ widget from desktop." = "已從桌面移除 %@ 小工具。";
+"Added %@ widget from desktop." = "已從桌面加入 %@ 小工具。";
+"Widgets are Premium only. Upgrade to add widgets." = "小工具僅限進階版。升級以加入小工具。";
+"Remove Widget" = "移除小工具";
+"Small" = "小";
+"Medium" = "中";
+"Quick actions" = "快速操作";
+"Open Meet" = "打開 Meet";
+"Upcoming meetings" = "即將開始的會議";
+"Sign in to see upcoming meetings" = "登入以查看即將開始的會議";
+"Sign in with Google" = "使用谷歌登入";
+"Google Meet" = "谷歌會議";
+"Open and join quickly" = "快速打開並加入";
+"Refresh" = "重新整理";
+
+/* MARK: - 側邊欄與導航 */
+"Planning" = "規劃";
+"Additional" = "更多";
+"Get Premium" = "取得進階版";
+"Manage Subscription" = "管理訂閱";
+"App for Google Meet" = "谷歌會議應用程式";
+
+/* MARK: - 加入會議 */
+"New Instant Meet" = "新建即時會議";
+"Start instant Meet in more section with\nGoogle Meet meet." = "在更多選項中透過\n谷歌會議開始即時會議。";
+"Join with Link" = "透過連結加入";
+"Code or meet.google.com/…" = "代碼或 meet.google.com/…";
+"Join with ID" = "透過識別碼加入";
+"Join with URL" = "透過 URL 加入";
+"Meeting URL" = "會議 URL";
+"Enter meeting URL..." = "輸入會議 URL...";
+"Quick Join Meeting" = "快速加入會議";
+"Invalid Meet link" = "無效的 Meet 連結";
+"Enter a valid Google Meet link or meeting code (for example nkd-grps-duv, meet.google.com/nkd-grps-duv, or https://meet.google.com/nkd-grps-duv)." = "輸入有效的谷歌會議連結或會議代碼(例如 nkd-grps-duv、meet.google.com/nkd-grps-duv 或 https://meet.google.com/nkd-grps-duv)。";
+"Instant Meeting" = "即時會議";
+"Connect Google to start Instant Meeting" = "連接谷歌以開始即時會議";
+"To auto-stop recording when the meeting ends, connect your Google account first." = "要在會議結束時自動停止錄製,請先連接您的谷歌帳戶。";
+"Could not create Instant Meeting" = "無法建立即時會議";
+"Free trial used. Upgrade to continue." = "免費試用已用完。升級以繼續。";
+
+/* MARK: - 瀏覽網頁 */
+"Browse the web" = "瀏覽網頁";
+"Enter a web address (for example meet.google.com)." = "輸入網址(例如 meet.google.com)。";
+"Invalid address" = "無效地址";
+"Enter a valid http or https URL." = "輸入有效的 http 或 https URL。";
+"Browse" = "瀏覽";
+"Quick links" = "快速連結";
+"Zoom help" = "Zoom 說明";
+"https://example.com or example.com" = "https://example.com 或 example.com";
+"Enter a valid web address, for example https://example.com" = "輸入有效網址,例如 https://example.com";
+"Address not allowed" = "地址不允許";
+"This URL is not permitted with the current in-app browser policy (whitelist)." = "當前應用程式內瀏覽器政策(白名單)不允許此 URL。";
+"Unable to load page" = "無法載入頁面";
+"Could not load this page in the in-app browser.\n\n%@" = "無法在應用程式內瀏覽器中載入此頁面。\n\n%@";
+"Page stopped loading" = "頁面已停止載入";
+"Unable to open browser" = "無法打開瀏覽器";
+"Unable to Open Safari" = "無法打開 Safari";
+
+/* MARK: - 日程安排與日曆 */
+"All" = "全部";
+"Today" = "今天";
+"This week" = "本週";
+"This month" = "本月";
+"Previous week" = "上一週";
+"Previous month" = "上一月";
+"Custom range" = "自訂範圍";
+"No meetings match the selected filters." = "沒有會議符合所選篩選條件。";
+"Adjust the date range and tap Apply." = "調整日期範圍並點擊「套用」。";
+"Premium required. Get Premium now to unlock Calendar." = "需要進階版。立即取得進階版以解鎖日曆。";
+"Premium required. Click to open paywall." = "需要進階版。點擊打開付費頁面。";
+"Get Premium to see events" = "取得進階版以查看事件";
+"Connect Google" = "連接谷歌";
+"Sign in with Google first to schedule a meeting from Calendar." = "請先使用谷歌登入,以便從日曆安排會議。";
+"Select date" = "選擇日期";
+"Choose a date to schedule your meeting." = "選擇日期以安排您的會議。";
+"Google schedule" = "谷歌日程";
+"To show scheduled meetings, connect your Google account. You’ll need a Google OAuth client ID (Desktop) and a redirect URI matching the app’s callback scheme." = "要顯示已安排的會議,請連接您的谷歌帳戶。您需要谷歌 OAuth 用戶端識別碼(桌面版)和一個與應用程式回呼方案匹配的重導向 URI。";
+"Actions" = "操作";
+"Schedule meeting" = "安排會議";
+"Team sync" = "團隊同步";
+"Duration (min)" = "時長(分鐘)";
+"Refresh saved meetings" = "重新整理已儲存的會議";
+
+/* MARK: - 設定 */
+"Manage appearance, account, and app options." = "管理外觀、帳戶和應用程式選項。";
+"Appearance" = "外觀";
+"Account" = "帳戶";
+"App" = "應用程式";
+"Notifications" = "通知";
+"Help & Legal" = "說明與法律";
+"Dark Mode" = "深色模式";
+"Language" = "語言";
+"System Language" = "系統語言";
+"Rate Us" = "給我們評分";
+"Share App" = "分享應用程式";
+"Upgrade" = "升級";
+"Privacy Policy" = "隱私權政策";
+"Support" = "支援";
+"Terms of Services" = "服務條款";
+"AI Language 1" = "智慧語言 1";
+"AI Language 2" = "智慧語言 2";
+"Google account connected" = "谷歌帳戶已連接";
+"Google account not connected" = "谷歌帳戶未連接";
+"Signed in" = "已登入";
+"Sign in to sync your meetings and calendar." = "登入以同步您的會議和日曆。";
+"Log out" = "登出";
+"Check out %@ for managing and joining meetings." = "試試 %@ 來管理和加入會議。";
+"Meetings App" = "會議應用程式";
+
+/* MARK: - 錄製同意 */
+"Record this meeting locally?" = "在本機錄製此會議?";
+"With your consent, the app will record meeting audio on this Mac and show it in AI Companion after the meeting." = "經您同意,應用程式將在此 Mac 上錄製會議音訊,並在會議結束後在智慧助手中顯示。";
+"Allow and Continue" = "允許並繼續";
+"Continue Without Recording" = "不錄製繼續";
+"Transcription Languages" = "轉錄語言";
+"Preferred Language 1" = "偏好語言 1";
+"Preferred Language 2" = "偏好語言 2";
+"Microphone permission denied" = "麥克風權限被拒絕";
+"Microphone permission required" = "需要麥克風權限";
+"Enable microphone access in System Settings to record meetings locally." = "請在系統設定中啟用麥克風存取權限以在本機錄製會議。";
+"Could not start recording" = "無法開始錄製";
+"Recording will start when the meeting starts" = "錄製將在會議開始時開始";
+"Meeting recording started (meeting + microphone)" = "會議錄製已開始(會議 + 麥克風)";
+"System audio unavailable. Recording microphone only." = "系統音訊不可用。僅錄製麥克風。";
+"Meeting recording started (microphone only)" = "會議錄製已開始(僅麥克風)";
+"Meeting recording saved" = "會議錄製已儲存";
+
+/* MARK: - 智慧助手 */
+"Get notes from your previous meetings" = "取得您之前會議的筆記";
+"Connect your Google account to see your AI Companion meeting history." = "連接您的谷歌帳戶以查看您的智慧助手會議歷史記錄。";
+"No previous meetings yet for %@. End a meeting to save it here and generate notes." = "%@ 尚無之前的會議。結束會議可將其儲存於此並產生筆記。";
+"this account" = "此帳戶";
+"Previous meetings" = "之前的會議";
+"Recording in progress: %@" = "正在錄製:%@";
+"Started: %@" = "開始時間:%@";
+"Stop Recording" = "停止錄製";
+"Date: %@" = "日期:%@";
+"Saved time: %@" = "儲存時間:%@";
+"Get Notes" = "取得筆記";
+"Premium required. Click to unlock AI Companion notes." = "需要進階版。點擊解鎖智慧助手筆記。";
+"Play Audio" = "播放音訊";
+"Pause Audio" = "暫停音訊";
+"Stopped" = "已停止";
+"Speaking..." = "正在說話...";
+"Paused" = "已暫停";
+"Playing..." = "正在播放...";
+"Not playing" = "未播放";
+"Checking audio..." = "正在檢查音訊...";
+"Audio file missing" = "音訊檔案缺失";
+"Could not play recording" = "無法播放錄製";
+"Failed: %@" = "失敗:%@";
+"Failed to play audio" = "播放音訊失敗";
+"decode error" = "解碼錯誤";
+"Loading..." = "載入中...";
+"Buffering..." = "緩衝中...";
+"Finished" = "已完成";
+"Transcript not requested" = "未要求轉錄";
+"Transcript processing..." = "轉錄處理中...";
+"Transcript ready" = "轉錄就緒";
+"Transcript unavailable (tap to retry)" = "轉錄不可用(點擊重試)";
+"Notes not requested" = "未要求筆記";
+"Preparing notes, please wait..." = "正在準備筆記,請稍候...";
+"Notes ready" = "筆記就緒";
+"Notes unavailable (tap to retry)" = "筆記不可用(點擊重試)";
+"Transcript unavailable" = "轉錄不可用";
+"Notes unavailable" = "筆記不可用";
+"Could not find recording details for this meeting." = "找不到此會議的錄製詳情。";
+"Transcript - %@" = "轉錄 - %@";
+"Notes - %@" = "筆記 - %@";
+"Meeting Notes" = "會議筆記";
+"Transcript processing..." = "轉錄處理中...";
+
+/* MARK: - 付費牆與 StoreKit */
+"Meetings Pro" = "會議專業版";
+"PREMIUM EXPERIENCE" = "進階體驗";
+"Elevate your meetings workflow" = "提升您的會議工作流程";
+"Unlock automation, premium meeting tools, and priority support for every session." = "解鎖自動化、進階會議工具以及每次會議的優先支援。";
+"Manage meetings" = "管理會議";
+"Smart scheduling" = "智慧安排";
+"Faster workflow" = "更高效的工作流程";
+"Reminder notifications" = "提醒通知";
+"Monthly" = "每月";
+"Bi Yearly" = "每半年";
+"Yearly" = "每年";
+"Most Popular" = "最受歡迎";
+"%@ • Most Popular" = "%@ • 最受歡迎";
+"3 days free trial" = "3 天免費試用";
+"Cancel anytime" = "隨時取消";
+"No lock-in" = "無合約限制";
+"Instant access" = "即時存取";
+"Unlock all tools" = "解鎖所有工具";
+"Secure billing" = "安全計費";
+"Handled by Apple" = "由蘋果處理";
+"Secured by Apple. Cancel anytime." = "由蘋果提供安全保障。隨時取消。";
+"Restore Purchase" = "回復購買";
+"Continue with free plan" = "繼續使用免費方案";
+"Already Premium" = "已是進階版";
+"You are already premium. Do you want to continue with this purchase?" = "您已是進階版。是否要繼續此次購買?";
+"Current plan: %@. Choose a different package to switch." = "目前方案:%@。選擇其他方案以切換。";
+"Premium is active on this Apple ID." = "此蘋果帳號上進階版已啟用。";
+"Free for %@, then %@" = "%@ 免費,之後 %@";
+"Billed via App Store" = "透過 App Store 計費";
+"%@  •  %@" = "%@  •  %@";
+"Save 0%" = "省下 0%";
+"Save %@%%" = "省下 %@%%";
+"month" = "月";
+"year" = "年";
+"%@ free trial" = "%@ 免費試用";
+"Processing..." = "處理中...";
+"Premium Active" = "進階版已啟用";
+"Continue with 3 day trail" = "繼續 3 天試用";
+"Please Wait" = "請稍候";
+"A purchase is already being processed." = "已有購買正在處理中。";
+"This Apple ID already has premium access." = "此蘋果帳號已擁有進階版存取權。";
+"Purchase Complete" = "購買完成";
+"Premium has been unlocked successfully." = "進階版已成功解鎖。";
+"Purchase Pending" = "購買待處理";
+"Your purchase is pending approval. You can continue once it completes." = "您的購買正在等待核准。完成後您可以繼續。";
+"Product Not Available" = "產品不可用";
+"Unable to load this product. Check your StoreKit configuration and product IDs." = "無法載入此產品。請檢查您的 StoreKit 配置和產品識別碼。";
+"Already Purchased" = "已購買";
+"This plan is already active on your Apple ID." = "此方案已在您的蘋果帳號上啟用。";
+"Purchase Failed" = "購買失敗";
+"Restore Purchases" = "回復購買";
+"Purchases restored successfully." = "購買回復成功。";
+"No previous premium purchase was found for this Apple ID." = "未找到此蘋果帳號之前的任何進階版購買記錄。";
+"Restore failed: %@" = "回復失敗:%@";
+"Unable to Open Subscriptions" = "無法打開訂閱";
+"The subscriptions URL is invalid." = "訂閱 URL 無效。";
+"%@ tapped." = "%@ 已點擊。";
+
+/* MARK: - 認證 */
+"Google Sign-In" = "谷歌登入";
+
+/* MARK: - 語音辨識/轉錄錯誤 */
+"Speech recognition permission denied. Enable it in System Settings and try again." = "語音辨識權限被拒絕。請在系統設定中啟用並重試。";
+"Speech recognition is restricted on this Mac." = "此 Mac 上語音辨識受限。";
+"Speech recognition authorization is unavailable." = "語音辨識授權不可用。";
+"Speech recognizer is unavailable for the current locale." = "目前地區設定下語音辨識器不可用。";
+"Speech recognizer is unavailable for %@." = "%@ 的語音辨識器不可用。";
+"No audio was available to transcribe." = "沒有可用於轉錄的音訊。";
+
+/* MARK: - StoreKit 交易錯誤 */
+"Unable to load products: %@" = "無法載入產品:%@";
+"Product ID not found in StoreKit response. Requested: %@. Loaded IDs: %@" = "StoreKit 回應中未找到產品識別碼。要求:%@。已載入的識別碼:%@";
+"Purchase verification failed." = "購買驗證失敗。";
+"Unknown purchase state." = "未知的購買狀態。";
+"none" = "無";
+
+/* MARK: - 付費牆價格文案 */
+"%@ one-time purchase" = "%@ 一次性購買";
+"%@/month" = "%@/月";
+"%@/6 months" = "%@/6 個月";
+"%@/year (3 days free trial)" = "%@/年(3 天免費試用)";
+"day" = "天";
+"week" = "週";
+"period" = "週期";
+"1 %@" = "1 %@";
+"%d %@s" = "%d %@";
+
+/* MARK: - 提示與快速反饋 */
+"Meeting added successfully." = "會議新增成功。";
+"An issue occurred. Please try again." = "發生問題。請重試。";
+"Failed to load transcript." = "載入轉錄失敗。";
+"Failed to generate notes." = "產生筆記失敗。";
+
+/* MARK: - 瀏覽器提醒 */
+"Try Again" = "重試";
+"The in-app browser closed this page unexpectedly. You can try loading it again in this same window." = "應用程式內瀏覽器意外關閉了此頁面。您可以嘗試在同一視窗中重新載入。";
+
+/* MARK: - 日程安排與日曆錯誤 */
+"Couldn't load schedule." = "無法載入日程。";
+"Couldn't refresh schedule." = "無法重新整理日程。";
+"Couldn't connect Google account." = "無法連接谷歌帳戶。";
+"Couldn't logout Google account." = "無法登出谷歌帳戶。";
+"Couldn't load schedule" = "無法載入日程";
+"Couldn't determine Meet meeting code from URL." = "無法從 URL 確定 Meet 會議代碼。";
+"Refreshing…" = "重新整理中…";
+"Connect Google to see meetings" = "連接谷歌以查看會議";
+"Connect to load schedule" = "連接以載入日程";
+"Loading…" = "載入中…";
+"Loading schedule…" = "載入日程中…";
+"Start date must be on or before end date." = "開始日期必須早於或等於結束日期。";
+"Invalid custom date range" = "無效的自訂日期範圍";
+"No meetings" = "無會議";
+"No meetings for selected filters" = "所選篩選條件無會議";
+"No meetings on %@" = "%@ 無會議";
+"1 meeting on %@" = "%@ 有 1 個會議";
+"%d meetings on %@" = "%@ 有 %d 個會議";
+"All day" = "全天";
+"Duration: all day" = "持續時間:全天";
+"Duration: %dh %dm" = "持續時間:%dh %dm";
+"Duration: %dh" = "持續時間:%dh";
+"Duration: %dm" = "持續時間:%dm";
+"%@ - %@" = "%@ - %@";
+"Scheduled Meeting" = "已安排的會議";
+
+/* MARK: - 建立會議彈窗 */
+"Please enter a title." = "請輸入標題。";
+"Duration must be a positive number of minutes." = "時長必須為正數分鐘。";
+"Invalid start time." = "無效的開始時間。";
+
+/* MARK: - 提醒與通知 */
+"Reminders" = "提醒";
+"1 Day Before" = "提前 1 天";
+"12 Hours Before" = "提前 12 小時";
+"1 Hour Before" = "提前 1 小時";
+"Starts in 1 day" = "1 天後開始";
+"Starts in 12 hours" = "12 小時後開始";
+"Starts in 1 hour" = "1 小時後開始";
+
+/* MARK: - 谷歌 OAuth 錯誤 */
+"Missing Google OAuth Client ID." = "缺少谷歌 OAuth 用戶端識別碼。";
+"Missing Google OAuth Client Secret." = "缺少谷歌 OAuth 用戶端密鑰。";
+"Invalid OAuth callback URL." = "無效的 OAuth 回呼 URL。";
+"Google did not return an authorization code." = "谷歌未回傳授權碼。";
+"Token exchange failed: %@" = "令牌交換失敗:%@";
+"Could not open browser for Google sign-in." = "無法打開瀏覽器進行谷歌登入。";
+"Google sign-in timed out." = "谷歌登入逾時。";
+"No stored Google tokens found." = "未找到儲存的谷歌令牌。";
+
+/* MARK: - 智慧助手/轉錄錯誤 */
+"Recording not found." = "未找到錄製。";
+"Local meeting audio is missing." = "本機會議音訊缺失。";
+"Generated transcript was empty." = "產生的轉錄為空白。";
+"(No transcript entries found.)" = "(未找到轉錄條目。)";
+"No conference record found for this meeting." = "未找到此會議的會議記錄。";
+"No transcript found for this meeting." = "未找到此會議的轉錄。";
+"Unable to create audio composition tracks." = "無法建立音訊合成軌道。";
+"Unable to create audio export session." = "無法建立音訊匯出會話。";
+"Audio mix export failed." = "音訊混音匯出失敗。";
+"No display available for system audio capture." = "沒有可用於系統音訊擷取的顯示器。";
+"Cannot add audio writer input." = "無法加入音訊寫入器輸入。";
+
+/* MARK: - 谷歌 API 錯誤 */
+"Google Meet returned an invalid response." = "谷歌會議回傳了無效的回應。";
+"Google Meet API error (%d): %@" = "谷歌會議 API 錯誤 (%d):%@";
+"Failed to parse Google Meet response: %@" = "解析谷歌會議回應失敗:%@";
+"Google Calendar returned an invalid response." = "谷歌日曆回傳了無效的回應。";
+"Google Calendar API error (%d): %@" = "谷歌日曆 API 錯誤 (%d):%@";
+"Failed to parse Google Calendar events: %@" = "解析谷歌日曆事件失敗:%@";
+
+/* MARK: - OpenAI 錯誤 */
+"OpenAI API key is missing. Set OPENAI_API_KEY in the environment or app key vault." = "缺少 OpenAI API 金鑰。請在環境或應用程式金鑰庫中設定 OPENAI_API_KEY。";
+"Notes generation returned an invalid response." = "筆記產生回傳了無效的回應。";
+"Notes generation failed (%d): %@" = "筆記產生失敗 (%d):%@";
+"Notes generation returned empty text." = "筆記產生回傳了空文字。";
+"OpenAI transcription returned an invalid response." = "OpenAI 轉錄回傳了無效的回應。";
+"OpenAI transcription failed (%d): %@" = "OpenAI 轉錄失敗 (%d):%@";
+"OpenAI transcription returned no text." = "OpenAI 轉錄未回傳文字。";
+
+/* MARK: - 瀏覽與應用程式內瀏覽器 */
+"Open sites in the in-app browser (back, forward, reload, address bar). OAuth and “Continue in browser” flows stay inside the app." = "在應用程式內瀏覽器中打開網站(後退、前進、重新整理、網址列)。OAuth 和「在瀏覽器中繼續」流程保持在應用程式內。";
+"Open in app browser" = "在應用程式瀏覽器中打開";
+"Meet help" = "Meet 說明";
+"Go" = "前往";
+"Back" = "返回";
+"Forward" = "前進";
+"Reload" = "重新整理";
+
+/* MARK: - 日程安排與日曆標籤 */
+"Google Calendar" = "谷歌日曆";
+"Untitled meeting" = "無標題會議";
+"Created event missing start/end." = "建立的事件缺少開始/結束時間。";
+"Created event missing Meet/HTML link." = "建立的事件缺少 Meet/HTML 連結。";
+
+/* MARK: - 谷歌帳戶 */
+"Google account" = "谷歌帳戶";
+"%@, Google account" = "%@,谷歌帳戶";
+
+/* MARK: - Zoom 加入(未使用部分) */
+"Meeting ID" = "會議識別碼";
+"Enter meeting ID..." = "輸入會議識別碼...";
+"Meeting Passcode" = "會議密碼";
+"Enter meeting passcode..." = "輸入會議密碼...";
+
+/* MARK: - 付費牆(備選權益) */
+"Virtual backgrounds" = "虛擬背景";
+"Tools for productivity" = "生產力工具";
+"24/7 support" = "7x24 小時支援";
+
+/* MARK: - 轉錄發言者 */
+"You" = "你";
+
+/* MARK: - 鑰匙圈錯誤 */
+"Failed to read OAuth tokens from Keychain." = "從鑰匙圈讀取 OAuth 令牌失敗。";
+"Keychain returned an invalid token payload." = "鑰匙圈回傳了無效的令牌負載。";
+"Failed to update OAuth tokens in Keychain." = "更新鑰匙圈中的 OAuth 令牌失敗。";
+"Failed to save OAuth tokens to Keychain." = "儲存 OAuth 令牌到鑰匙圈失敗。";
+"Failed to delete OAuth tokens from Keychain." = "從鑰匙圈刪除 OAuth 令牌失敗。";
+"Unable to allocate audio buffer." = "無法分配音訊緩衝區。";
+"Invalid revoke response." = "無效的撤銷回應。";
+"Token revoke failed with status %d." = "令牌撤銷失敗,狀態碼 %d。";
+
+/* MARK: - 錯誤提醒診斷 */
+"Keychain: %d (%@)" = "鑰匙圈:%d (%@)";
+"OSStatus: %d" = "作業系統狀態:%d";
+"Item: service=%@, account=%@" = "項目:service=%@,account=%@";

+ 17 - 0
meetings_app/zh-Hant.lproj/Main.strings

@@ -0,0 +1,17 @@
+/* Class = "NSMenuItem"; title = "AI Companion for Meet"; ObjectID = "1Xt-HY-uBw"; */
+"1Xt-HY-uBw.title" = "Meet 智慧助手";
+
+/* Class = "NSMenu"; title = "AI Companion for Meet"; ObjectID = "uQy-DD-JDr"; */
+"uQy-DD-JDr.title" = "Meet 智慧助手";
+
+/* Class = "NSMenuItem"; title = "About AI Companion for Meet"; ObjectID = "5kV-Vb-QxS"; */
+"5kV-Vb-QxS.title" = "關於 Meet 智慧助手";
+
+/* Class = "NSMenuItem"; title = "Hide AI Companion for Meet"; ObjectID = "Olw-nP-bQN"; */
+"Olw-nP-bQN.title" = "隱藏 Meet 智慧助手";
+
+/* Class = "NSMenuItem"; title = "Quit AI Companion for Meet"; ObjectID = "4sb-4s-VLi"; */
+"4sb-4s-VLi.title" = "退出 Meet 智慧助手";
+
+/* Class = "NSMenuItem"; title = "AI Companion for Meet Help"; ObjectID = "FKE-Sm-Kum"; */
+"FKE-Sm-Kum.title" = "Meet 智慧助手說明";