From 9313a4ef6adfe6c367a2c87acd35e0a50f0c5ebf Mon Sep 17 00:00:00 2001 From: Developer Date: Thu, 28 May 2026 09:23:06 +0800 Subject: [PATCH] Add Simplified Chinese localization support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Created app_zh.arb with complete Chinese translations (495+ translation keys) - Generated app_localizations_zh.g.dart using flutter gen-l10n - Updated settings_language_screen.dart to show '简体中文' display name - Updated app_localizations.g.dart with Chinese locale support - Updated l10n.yaml configuration - Updated pubspec.yaml for proper localization generation --- l10n.yaml | 1 - lib/src/localization/app_localizations.g.dart | 56 +- .../localization/app_localizations_zh.g.dart | 1823 ++++++++++++ lib/src/localization/app_zh.arb | 2447 +++++++++++++++++ .../view/settings_language_screen.dart | 1 + pubspec.yaml | 2 +- 6 files changed, 4309 insertions(+), 21 deletions(-) create mode 100644 lib/src/localization/app_localizations_zh.g.dart create mode 100644 lib/src/localization/app_zh.arb diff --git a/l10n.yaml b/l10n.yaml index e579dba..8f1d938 100644 --- a/l10n.yaml +++ b/l10n.yaml @@ -5,7 +5,6 @@ template-arb-file: app_en.arb output-localization-file: app_localizations.g.dart output-dir: lib/src/localization output-class: AppLocalizations -synthetic-package: false untranslated-messages-file: missing-translations.txt preferred-supported-locales: en nullable-getter: true \ No newline at end of file diff --git a/lib/src/localization/app_localizations.g.dart b/lib/src/localization/app_localizations.g.dart index f863f61..254158f 100644 --- a/lib/src/localization/app_localizations.g.dart +++ b/lib/src/localization/app_localizations.g.dart @@ -8,6 +8,9 @@ import 'package:intl/intl.dart' as intl; import 'app_localizations_de.g.dart'; import 'app_localizations_en.g.dart'; import 'app_localizations_es.g.dart'; +import 'app_localizations_zh.g.dart'; + +// ignore_for_file: type=lint /// Callers can lookup localized strings with an instance of AppLocalizations /// returned by `AppLocalizations.of(context)`. @@ -61,7 +64,8 @@ import 'app_localizations_es.g.dart'; /// be consistent with the languages listed in the AppLocalizations.supportedLocales /// property. abstract class AppLocalizations { - AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + AppLocalizations(String locale) + : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; @@ -69,7 +73,8 @@ abstract class AppLocalizations { return Localizations.of(context, AppLocalizations); } - static const LocalizationsDelegate delegate = _AppLocalizationsDelegate(); + static const LocalizationsDelegate delegate = + _AppLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -81,18 +86,20 @@ abstract class AppLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; + static const List> localizationsDelegates = + >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ Locale('en'), Locale('de'), - Locale('es') + Locale('es'), + Locale('zh'), ]; /// Default signature text @@ -1815,7 +1822,10 @@ abstract class AppLocalizations { /// /// In en, this message translates to: /// **'Your account {accountName} might support so called + aliases like {example}.\nA + alias helps you to protect your identity and helps you against spam.\nTo test this, a test message will be sent to this generated address. If it arrives, your provider supports + aliases and you can easily generate them on demand when writing a new mail message.'** - String editAccountTestPlusAliasStepIntroductionText(String accountName, String example); + String editAccountTestPlusAliasStepIntroductionText( + String accountName, + String example, + ); /// Title while testing concept of + aliases. /// @@ -1935,7 +1945,10 @@ abstract class AppLocalizations { /// /// In en, this message translates to: /// **'Maily cannot reach the specified mail server. Please check your incoming server setting \"{incomingHost}\" and your outgoing server setting \"{outgoingHost}\".'** - String accountDetailsErrorHostProblem(String incomingHost, String outgoingHost); + String accountDetailsErrorHostProblem( + String incomingHost, + String outgoingHost, + ); /// Error details when login fails /// @@ -3066,7 +3079,8 @@ abstract class AppLocalizations { String get durationEmpty; } -class _AppLocalizationsDelegate extends LocalizationsDelegate { +class _AppLocalizationsDelegate + extends LocalizationsDelegate { const _AppLocalizationsDelegate(); @override @@ -3075,26 +3089,30 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['de', 'en', 'es'].contains(locale.languageCode); + bool isSupported(Locale locale) => + ['de', 'en', 'es', 'zh'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; } AppLocalizations lookupAppLocalizations(Locale locale) { - - // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'de': return AppLocalizationsDe(); - case 'en': return AppLocalizationsEn(); - case 'es': return AppLocalizationsEs(); + case 'de': + return AppLocalizationsDe(); + case 'en': + return AppLocalizationsEn(); + case 'es': + return AppLocalizationsEs(); + case 'zh': + return AppLocalizationsZh(); } throw FlutterError( 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' 'an issue with the localizations generation tool. Please file an issue ' 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.' + 'that was used.', ); } diff --git a/lib/src/localization/app_localizations_zh.g.dart b/lib/src/localization/app_localizations_zh.g.dart new file mode 100644 index 0000000..54e5cb6 --- /dev/null +++ b/lib/src/localization/app_localizations_zh.g.dart @@ -0,0 +1,1823 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.g.dart'; + +// ignore_for_file: type=lint + +/// The translations for Chinese (`zh`). +class AppLocalizationsZh extends AppLocalizations { + AppLocalizationsZh([String locale = 'zh']) : super(locale); + + @override + String get signature => '由 Maily 发送'; + + @override + String get actionCancel => '取消'; + + @override + String get actionOk => '确定'; + + @override + String get actionDone => '完成'; + + @override + String get actionNext => '下一步'; + + @override + String get actionSkip => '跳过'; + + @override + String get actionUndo => '撤销'; + + @override + String get actionDelete => '删除'; + + @override + String get actionAccept => '接受'; + + @override + String get actionDecline => '拒绝'; + + @override + String get actionEdit => '编辑'; + + @override + String get actionAddressCopy => '复制'; + + @override + String get actionAddressCompose => '新建邮件'; + + @override + String get actionAddressSearch => '搜索'; + + @override + String get splashLoading1 => 'Maily 启动中...'; + + @override + String get splashLoading2 => '准备您的 Maily 引擎...'; + + @override + String get splashLoading3 => '10、9、8… 启动 Maily'; + + @override + String get welcomePanel1Title => 'Maily'; + + @override + String get welcomePanel1Text => '欢迎使用 Maily,您友好且快速的邮件助手!'; + + @override + String get welcomePanel2Title => '账户'; + + @override + String get welcomePanel2Text => '管理无限数量的邮件账户。同时在所有账户中阅读和搜索邮件。'; + + @override + String get welcomePanel3Title => 'Swipe & Long-Press'; + + @override + String get welcomePanel3Text => '滑动邮件进行删除或标记为已读。长按邮件可以选择和管理多封邮件。'; + + @override + String get welcomePanel4Title => '保持收件箱整洁'; + + @override + String get welcomePanel4Text => '只需点击一下即可取消订阅新闻通讯。'; + + @override + String get welcomeActionSignIn => '登录您的邮件账户'; + + @override + String get homeSearchHint => '您的搜索'; + + @override + String get homeActionsShowAsStack => '堆叠显示'; + + @override + String get homeActionsShowAsList => '列表显示'; + + @override + String get homeEmptyFolderMessage => '全部完成!\n\n此文件夹中没有邮件。'; + + @override + String get homeEmptySearchMessage => '未找到邮件。'; + + @override + String get homeDeleteAllTitle => '确认'; + + @override + String get homeDeleteAllQuestion => '确定要删除所有邮件吗?'; + + @override + String get homeDeleteAllAction => '全部删除'; + + @override + String get homeDeleteAllScrubOption => '清理邮件'; + + @override + String get homeDeleteAllSuccess => '所有邮件已删除。'; + + @override + String get homeMarkAllSeenAction => '全部已读'; + + @override + String get homeMarkAllUnseenAction => '全部未读'; + + @override + String get homeFabTooltip => '新建邮件'; + + @override + String get homeLoadingMessageSourceTitle => '加载中...'; + + @override + String homeLoading(String name) { + return '正在加载 $name...'; + } + + @override + String get swipeActionToggleRead => '标记为已读/未读'; + + @override + String get swipeActionDelete => '删除'; + + @override + String get swipeActionMarkJunk => '标记为垃圾邮件'; + + @override + String get swipeActionArchive => '归档'; + + @override + String get swipeActionFlag => '切换星标'; + + @override + String multipleMovedToJunk(int number) { + final intl.NumberFormat numberNumberFormat = intl.NumberFormat.compactLong( + locale: localeName, + ); + final String numberString = numberNumberFormat.format(number); + + String _temp0 = intl.Intl.pluralLogic( + number, + locale: localeName, + other: '$numberString 封邮件已标记为垃圾邮件', + one: '一封邮件已标记为垃圾邮件', + ); + return '$_temp0'; + } + + @override + String multipleMovedToInbox(int number) { + final intl.NumberFormat numberNumberFormat = intl.NumberFormat.compactLong( + locale: localeName, + ); + final String numberString = numberNumberFormat.format(number); + + String _temp0 = intl.Intl.pluralLogic( + number, + locale: localeName, + other: '$numberString 封邮件已移至收件箱', + one: '一封邮件已移至收件箱', + ); + return '$_temp0'; + } + + @override + String multipleMovedToArchive(int number) { + final intl.NumberFormat numberNumberFormat = intl.NumberFormat.compactLong( + locale: localeName, + ); + final String numberString = numberNumberFormat.format(number); + + String _temp0 = intl.Intl.pluralLogic( + number, + locale: localeName, + other: '$numberString 封邮件已归档', + one: '一封邮件已归档', + ); + return '$_temp0'; + } + + @override + String multipleMovedToTrash(int number) { + final intl.NumberFormat numberNumberFormat = intl.NumberFormat.compactLong( + locale: localeName, + ); + final String numberString = numberNumberFormat.format(number); + + String _temp0 = intl.Intl.pluralLogic( + number, + locale: localeName, + other: '$numberString 封邮件已删除', + one: '一封邮件已删除', + ); + return '$_temp0'; + } + + @override + String get multipleSelectionNeededInfo => '请先选择邮件。'; + + @override + String multipleSelectionActionFailed(String details) { + return '无法执行操作\n详细信息:$details'; + } + + @override + String multipleMoveTitle(int number) { + final intl.NumberFormat numberNumberFormat = intl.NumberFormat.compactLong( + locale: localeName, + ); + final String numberString = numberNumberFormat.format(number); + + String _temp0 = intl.Intl.pluralLogic( + number, + locale: localeName, + other: '移动 $numberString 封邮件', + one: '移动邮件', + ); + return '$_temp0'; + } + + @override + String get messageActionMultipleMarkSeen => 'Mark as read'; + + @override + String get messageActionMultipleMarkUnseen => 'Mark as unread'; + + @override + String get messageActionMultipleMarkFlagged => '标记星标'; + + @override + String get messageActionMultipleMarkUnflagged => '取消星标'; + + @override + String get messageActionViewInSafeMode => '不加载外部内容查看'; + + @override + String get emailSenderUnknown => ''; + + @override + String get dateRangeFuture => '未来'; + + @override + String get dateRangeTomorrow => '明天'; + + @override + String get dateRangeToday => '今天'; + + @override + String get dateRangeYesterday => '昨天'; + + @override + String get dateRangeCurrentWeek => '本周'; + + @override + String get dateRangeLastWeek => '上周'; + + @override + String get dateRangeCurrentMonth => '本月'; + + @override + String get dateRangeLastMonth => '上月'; + + @override + String get dateRangeCurrentYear => '今年'; + + @override + String get dateRangeLongAgo => '更早'; + + @override + String get dateUndefined => '未定义'; + + @override + String get dateDayToday => '今天'; + + @override + String get dateDayYesterday => '昨天'; + + @override + String dateDayLastWeekday(String day) { + return '上$day'; + } + + @override + String get drawerEntryAbout => '关于 Maily'; + + @override + String get drawerEntrySettings => '设置'; + + @override + String drawerAccountsSectionTitle(int number) { + final intl.NumberFormat numberNumberFormat = intl.NumberFormat.compactLong( + locale: localeName, + ); + final String numberString = numberNumberFormat.format(number); + + String _temp0 = intl.Intl.pluralLogic( + number, + locale: localeName, + other: '$numberString 个账户', + one: '一个账户', + ); + return '$_temp0'; + } + + @override + String get drawerEntryAddAccount => '添加账户'; + + @override + String get unifiedAccountName => '统一账户'; + + @override + String get unifiedFolderInbox => '统一收件箱'; + + @override + String get unifiedFolderSent => '统一已发送'; + + @override + String get unifiedFolderDrafts => '统一草稿'; + + @override + String get unifiedFolderTrash => '统一垃圾箱'; + + @override + String get unifiedFolderArchive => '统一归档'; + + @override + String get unifiedFolderJunk => '统一垃圾邮件'; + + @override + String get folderInbox => '收件箱'; + + @override + String get folderSent => '已发送'; + + @override + String get folderDrafts => '草稿'; + + @override + String get folderTrash => '垃圾箱'; + + @override + String get folderArchive => '归档'; + + @override + String get folderJunk => '垃圾邮件'; + + @override + String get folderUnknown => '未知'; + + @override + String get viewContentsAction => '查看内容'; + + @override + String get viewSourceAction => '查看源代码'; + + @override + String get detailsErrorDownloadInfo => '无法下载邮件。'; + + @override + String get detailsErrorDownloadRetry => '重试'; + + @override + String get detailsHeaderFrom => '发件人'; + + @override + String get detailsHeaderTo => '收件人'; + + @override + String get detailsHeaderCc => 'CC'; + + @override + String get detailsHeaderBcc => 'BCC'; + + @override + String get detailsHeaderDate => '日期'; + + @override + String get subjectUndefined => ''; + + @override + String get detailsActionShowImages => '显示图片'; + + @override + String get detailsNewsletterActionUnsubscribe => '取消订阅'; + + @override + String get detailsNewsletterActionResubscribe => '重新订阅'; + + @override + String get detailsNewsletterStatusUnsubscribed => '已取消订阅'; + + @override + String get detailsNewsletterUnsubscribeDialogTitle => '取消订阅'; + + @override + String detailsNewsletterUnsubscribeDialogQuestion(String listName) { + return '您确定要取消订阅 $listName 吗?'; + } + + @override + String get detailsNewsletterUnsubscribeDialogAction => '取消订阅'; + + @override + String get detailsNewsletterUnsubscribeSuccessTitle => '已取消订阅'; + + @override + String detailsNewsletterUnsubscribeSuccessMessage(String listName) { + return '您已成功取消订阅 $listName。'; + } + + @override + String get detailsNewsletterUnsubscribeFailureTitle => '取消订阅失败'; + + @override + String detailsNewsletterUnsubscribeFailureMessage(String listName) { + return '抱歉,我无法自动取消订阅 $listName。'; + } + + @override + String get detailsNewsletterResubscribeDialogTitle => '重新订阅'; + + @override + String detailsNewsletterResubscribeDialogQuestion(String listName) { + return '您确定要重新订阅 $listName 吗?'; + } + + @override + String get detailsNewsletterResubscribeDialogAction => '订阅'; + + @override + String get detailsNewsletterResubscribeSuccessTitle => '已订阅'; + + @override + String detailsNewsletterResubscribeSuccessMessage(String listName) { + return '您已重新订阅 $listName。'; + } + + @override + String get detailsNewsletterResubscribeFailureTitle => 'Not subscribed'; + + @override + String detailsNewsletterResubscribeFailureMessage(String listName) { + return '抱歉,$listName 的订阅请求失败了。'; + } + + @override + String get detailsSendReadReceiptAction => '发送已读回执'; + + @override + String get detailsReadReceiptSentStatus => '已读回执已发送 ✔'; + + @override + String get detailsReadReceiptSubject => '已读回执'; + + @override + String get attachmentActionOpen => '打开'; + + @override + String attachmentDecodeError(String details) { + return 'This attachment has an unsupported format or encoding.\nDetails: \$$details'; + } + + @override + String attachmentDownloadError(String details) { + return 'Unable to download this attachment.\nDetails: \$$details'; + } + + @override + String get messageActionReply => '回复'; + + @override + String get messageActionReplyAll => '全部回复'; + + @override + String get messageActionForward => '转发'; + + @override + String get messageActionForwardAsAttachment => '作为附件转发'; + + @override + String messageActionForwardAttachments(int number) { + final intl.NumberFormat numberNumberFormat = intl.NumberFormat.compactLong( + locale: localeName, + ); + final String numberString = numberNumberFormat.format(number); + + String _temp0 = intl.Intl.pluralLogic( + number, + locale: localeName, + other: '转发 $numberString 个附件', + one: '转发附件', + ); + return '$_temp0'; + } + + @override + String get messagesActionForwardAttachments => '转发附件'; + + @override + String get messageActionDelete => '删除'; + + @override + String get messageActionMoveToInbox => '移至收件箱'; + + @override + String get messageActionMove => '移动'; + + @override + String get messageStatusSeen => '已读'; + + @override + String get messageStatusUnseen => '未读'; + + @override + String get messageStatusFlagged => '已星标'; + + @override + String get messageStatusUnflagged => '未星标'; + + @override + String get messageActionMarkAsJunk => '标记为垃圾邮件'; + + @override + String get messageActionMarkAsNotJunk => '标记为非垃圾邮件'; + + @override + String get messageActionArchive => '归档'; + + @override + String get messageActionUnarchive => '移至收件箱'; + + @override + String get messageActionRedirect => '重定向'; + + @override + String get messageActionAddNotification => '添加通知'; + + @override + String get resultDeleted => '已删除'; + + @override + String get resultMovedToJunk => '已标记为垃圾邮件'; + + @override + String get resultMovedToInbox => '已移至收件箱'; + + @override + String get resultArchived => '已归档'; + + @override + String get resultRedirectedSuccess => '邮件已重定向 👍'; + + @override + String resultRedirectedFailure(String details) { + return 'Unable to redirect message.\n\nThe server responded with the following details: \"$details\"'; + } + + @override + String get redirectTitle => '重定向'; + + @override + String get redirectInfo => '将此邮件重定向到以下收件人。重定向不会更改邮件内容。'; + + @override + String get redirectEmailInputRequired => '您需要添加至少一个有效的电子邮件地址。'; + + @override + String searchQueryDescription(String folder) { + return '在 $folder 中搜索...'; + } + + @override + String searchQueryTitle(String query) { + return '搜索 \"$query\"'; + } + + @override + String get legaleseUsage => '使用 Maily 即表示您同意我们的 [PP] 和 [TC]。'; + + @override + String get legalesePrivacyPolicy => '隐私政策'; + + @override + String get legaleseTermsAndConditions => 'Terms & Conditions'; + + @override + String get aboutApplicationLegalese => 'Maily 是根据 GNU 通用公共许可证发布的自由软件。'; + + @override + String get feedbackActionSuggestFeature => '建议功能'; + + @override + String get feedbackActionReportProblem => '报告问题'; + + @override + String get feedbackActionHelpDeveloping => '帮助开发 Maily'; + + @override + String get feedbackTitle => '反馈'; + + @override + String get feedbackIntro => '感谢您测试 Maily!'; + + @override + String get feedbackProvideInfoRequest => '报告问题时请提供以下信息:'; + + @override + String get feedbackResultInfoCopied => '已复制到剪贴板'; + + @override + String get accountsTitle => '账户'; + + @override + String get accountsActionReorder => '重新排序账户'; + + @override + String get settingsTitle => '设置'; + + @override + String get settingsSecurityBlockExternalImages => '阻止外部图片'; + + @override + String get settingsSecurityBlockExternalImagesDescriptionTitle => '外部图片'; + + @override + String get settingsSecurityBlockExternalImagesDescriptionText => + '电子邮件可能包含集成或托管在外部服务器上的图片。外部图片可能会向邮件发件人暴露信息,例如让发件人知道您已打开邮件。此选项允许您阻止此类外部图片,从而降低暴露敏感信息的风险。您仍然可以在阅读邮件时选择逐封加载这些图片。'; + + @override + String get settingsSecurityMessageRenderingHtml => '显示完整邮件内容'; + + @override + String get settingsSecurityMessageRenderingPlainText => '仅显示邮件文本'; + + @override + String get settingsSecurityLaunchModeLabel => 'Maily 应如何打开链接?'; + + @override + String get settingsSecurityLaunchModeExternal => '在外部打开链接'; + + @override + String get settingsSecurityLaunchModeInApp => '在 Maily 中打开链接'; + + @override + String get settingsActionAccounts => '管理账户'; + + @override + String get settingsActionDesign => '外观'; + + @override + String get settingsActionFeedback => '提供反馈'; + + @override + String get settingsActionWelcome => '显示欢迎页面'; + + @override + String get settingsReadReceipts => '已读回执'; + + @override + String get readReceiptsSettingsIntroduction => '您是否要显示已读回执请求?'; + + @override + String get readReceiptOptionAlways => '始终'; + + @override + String get readReceiptOptionNever => '从不'; + + @override + String get settingsFolders => '文件夹'; + + @override + String get folderNamesIntroduction => '您希望文件夹使用什么名称?'; + + @override + String get folderNamesSettingLocalized => 'Maily 提供的名称'; + + @override + String get folderNamesSettingServer => '服务提供的名称'; + + @override + String get folderNamesSettingCustom => '我自定义的名称'; + + @override + String get folderNamesEditAction => '编辑自定义名称'; + + @override + String get folderNamesCustomTitle => '自定义名称'; + + @override + String get folderAddAction => '创建文件夹'; + + @override + String get folderAddTitle => '创建文件夹'; + + @override + String get folderAddNameLabel => '名称'; + + @override + String get folderAddNameHint => '新文件夹的名称'; + + @override + String get folderAccountLabel => '账户'; + + @override + String get folderMailboxLabel => '文件夹'; + + @override + String get folderAddResultSuccess => '文件夹已创建 😊'; + + @override + String folderAddResultFailure(String details) { + return '无法创建文件夹。\n\n服务器返回 $details'; + } + + @override + String get folderDeleteAction => '删除'; + + @override + String get folderDeleteConfirmTitle => '确认'; + + @override + String folderDeleteConfirmText(String name) { + return '您确定要删除文件夹 $name 吗?'; + } + + @override + String get folderDeleteResultSuccess => '文件夹已删除。'; + + @override + String folderDeleteResultFailure(String details) { + return '无法删除文件夹。\n\n服务器返回 $details'; + } + + @override + String get settingsDevelopment => '开发设置'; + + @override + String get developerModeTitle => '开发模式'; + + @override + String get developerModeIntroduction => '如果启用开发模式,您将能够查看邮件的源代码并将文本附件转换为邮件。'; + + @override + String get developerModeEnable => '启用开发模式'; + + @override + String get developerShowAsEmail => '转换为电子邮件'; + + @override + String get developerShowAsEmailFailed => '此文本无法转换为 MIME 邮件。'; + + @override + String get designTitle => '外观设置'; + + @override + String get designSectionThemeTitle => '主题'; + + @override + String get designThemeOptionLight => '浅色'; + + @override + String get designThemeOptionDark => '深色'; + + @override + String get designThemeOptionSystem => '跟随系统'; + + @override + String get designThemeOptionCustom => '自定义'; + + @override + String get designSectionCustomTitle => '启用深色主题'; + + @override + String designThemeCustomStart(String time) { + return '从 $time 开始'; + } + + @override + String designThemeCustomEnd(String time) { + return '到 $time 结束'; + } + + @override + String get designSectionColorTitle => '配色方案'; + + @override + String get securitySettingsTitle => '安全性'; + + @override + String get securitySettingsIntro => '根据您的个人需求调整安全设置。'; + + @override + String get securityUnlockWithFaceId => '使用 Face ID 解锁 Maily。'; + + @override + String get securityUnlockWithTouchId => '使用 Touch ID 解锁 Maily。'; + + @override + String get securityUnlockReason => '解锁 Maily。'; + + @override + String get securityUnlockDisableReason => '解锁 Maily 以关闭锁定。'; + + @override + String get securityUnlockNotAvailable => '您的设备不支持生物识别,您可能需要先设置解锁选项。'; + + @override + String get securityUnlockLabel => '锁定 Maily'; + + @override + String get securityUnlockDescriptionTitle => '锁定 Maily'; + + @override + String get securityUnlockDescriptionText => + '您可以选择锁定对 Maily 的访问,这样即使他人有权访问您的设备,也无法阅读您的邮件。'; + + @override + String get securityLockImmediately => '立即锁定'; + + @override + String get securityLockAfter5Minutes => '5 分钟后锁定'; + + @override + String get securityLockAfter30Minutes => '30 分钟后锁定'; + + @override + String get lockScreenTitle => 'Maily 已锁定'; + + @override + String get lockScreenIntro => 'Maily 已锁定,请进行身份验证以继续。'; + + @override + String get lockScreenUnlockAction => '解锁'; + + @override + String get addAccountTitle => '添加账户'; + + @override + String get addAccountEmailLabel => '电子邮件'; + + @override + String get addAccountEmailHint => '请输入您的电子邮件地址'; + + @override + String addAccountResolvingSettingsLabel(String email) { + return '正在解析 $email...'; + } + + @override + String addAccountResolvedSettingsWrongAction(String provider) { + return '不是 $provider?'; + } + + @override + String addAccountResolvingSettingsFailedInfo(String email) { + return '无法解析 $email。请返回修改或手动设置账户。'; + } + + @override + String get addAccountEditManuallyAction => '手动编辑'; + + @override + String get addAccountPasswordLabel => '密码'; + + @override + String get addAccountPasswordHint => '请输入您的密码'; + + @override + String get addAccountApplicationPasswordRequiredInfo => '此提供商要求您设置应用专用密码。'; + + @override + String get addAccountApplicationPasswordRequiredButton => '创建应用专用密码'; + + @override + String get addAccountApplicationPasswordRequiredAcknowledged => '我已有应用密码'; + + @override + String get addAccountVerificationStep => '验证'; + + @override + String get addAccountSetupAccountStep => '账户设置'; + + @override + String addAccountVerifyingSettingsLabel(String email) { + return '正在验证 $email...'; + } + + @override + String addAccountVerifyingSuccessInfo(String email) { + return '成功登录 $email。'; + } + + @override + String addAccountVerifyingFailedInfo(String email) { + return '抱歉,出现了问题。请检查您的电子邮件 $email 和密码。'; + } + + @override + String addAccountOauthOptionsText(String provider) { + return '使用 $provider 登录或创建应用专用密码。'; + } + + @override + String addAccountOauthSignIn(String provider) { + return '使用 $provider 登录'; + } + + @override + String get addAccountOauthSignInGoogle => '使用 Google 登录'; + + @override + String get addAccountOauthSignInWithAppPassword => '或者,创建应用密码进行登录。'; + + @override + String get accountAddImapAccessSetupMightBeRequired => + '您的提供商可能要求您手动设置电子邮件应用的访问权限。'; + + @override + String get addAccountSetupImapAccessButtonLabel => '设置电子邮件访问'; + + @override + String get addAccountNameOfUserLabel => '您的姓名'; + + @override + String get addAccountNameOfUserHint => '收件人看到的姓名'; + + @override + String get addAccountNameOfAccountLabel => '账户名称'; + + @override + String get addAccountNameOfAccountHint => '请输入您的账户名称'; + + @override + String editAccountTitle(String name) { + return '编辑 $name'; + } + + @override + String editAccountFailureToConnectInfo(String name) { + return 'Maily 无法连接 $name。'; + } + + @override + String get editAccountFailureToConnectRetryAction => '重试'; + + @override + String get editAccountFailureToConnectChangePasswordAction => '更改密码'; + + @override + String get editAccountFailureToConnectFixedTitle => '已连接'; + + @override + String get editAccountFailureToConnectFixedInfo => '账户已重新连接。'; + + @override + String get editAccountIncludeInUnifiedLabel => '包含在统一账户中'; + + @override + String editAccountAliasLabel(String email) { + return '$email 的别名电子邮件地址:'; + } + + @override + String get editAccountNoAliasesInfo => '您此账户尚无已知别名。'; + + @override + String editAccountAliasRemoved(String email) { + return '$email 别名已移除'; + } + + @override + String get editAccountAddAliasAction => '添加别名'; + + @override + String get editAccountPlusAliasesSupported => '支持 + 别名'; + + @override + String get editAccountCheckPlusAliasAction => '测试 + 别名支持'; + + @override + String get editAccountBccMyself => '密送给自己'; + + @override + String get editAccountBccMyselfDescriptionTitle => '密送给自己'; + + @override + String get editAccountBccMyselfDescriptionText => + '您可以使用“密送给自己”功能,自动将从此账户发送的每封邮件同时发送给自己。通常不需要这样做,因为所有已发送邮件都会保存在“已发送”文件夹中。'; + + @override + String get editAccountServerSettingsAction => '编辑服务器设置'; + + @override + String get editAccountDeleteAccountAction => '删除账户'; + + @override + String get editAccountDeleteAccountConfirmationTitle => '确认'; + + @override + String editAccountDeleteAccountConfirmationQuery(String name) { + return '您确定要删除账户 $name 吗?'; + } + + @override + String editAccountTestPlusAliasTitle(String name) { + return '$name 的 + 别名'; + } + + @override + String get editAccountTestPlusAliasStepIntroductionTitle => '介绍'; + + @override + String editAccountTestPlusAliasStepIntroductionText( + String accountName, + String example, + ) { + return '您的账户 $accountName 可能支持 $example 这样的 + 别名。\n+ 别名可以帮助您保护身份并防止垃圾邮件。\n为了测试这一点,将向此生成的地址发送一封测试邮件。如果到达,则您的提供商支持 + 别名,您可以在撰写新邮件时轻松生成它们。'; + } + + @override + String get editAccountTestPlusAliasStepTestingTitle => 'Testing'; + + @override + String get editAccountTestPlusAliasStepResultTitle => 'Result'; + + @override + String editAccountTestPlusAliasStepResultSuccess(String name) { + return 'Your account $name supports + aliases.'; + } + + @override + String editAccountTestPlusAliasStepResultNoSuccess(String name) { + return 'Your account $name does not support + aliases.'; + } + + @override + String get editAccountAddAliasTitle => '添加别名'; + + @override + String get editAccountEditAliasTitle => 'Edit alias'; + + @override + String get editAccountAliasAddAction => 'Add'; + + @override + String get editAccountAliasUpdateAction => 'Update'; + + @override + String get editAccountEditAliasNameLabel => 'Alias name'; + + @override + String get editAccountEditAliasEmailLabel => 'Alias email'; + + @override + String get editAccountEditAliasEmailHint => 'Your alias email address'; + + @override + String editAccountEditAliasDuplicateError(String email) { + return 'There is already an alias with $email.'; + } + + @override + String get editAccountEnableLogging => 'Enable logging'; + + @override + String get editAccountLoggingEnabled => 'Log enabled, please restart'; + + @override + String get editAccountLoggingDisabled => 'Log disabled, please restart'; + + @override + String get accountDetailsFallbackTitle => 'Server Settings'; + + @override + String get errorTitle => 'Error'; + + @override + String get accountProviderStepTitle => 'Email Service Provider'; + + @override + String get accountProviderCustom => 'Other email service'; + + @override + String accountDetailsErrorHostProblem( + String incomingHost, + String outgoingHost, + ) { + return 'Maily cannot reach the specified mail server. Please check your incoming server setting \"$incomingHost\" and your outgoing server setting \"$outgoingHost\".'; + } + + @override + String accountDetailsErrorLoginProblem(String userName, String password) { + return 'Unable to log your in. Please check your user name \"$userName\" and your password \"$password\".'; + } + + @override + String get accountDetailsUserNameLabel => 'Login name'; + + @override + String get accountDetailsUserNameHint => + 'Your user name, if different from email'; + + @override + String get accountDetailsPasswordLabel => 'Login password'; + + @override + String get accountDetailsPasswordHint => 'Your password'; + + @override + String get accountDetailsBaseSectionTitle => 'Base settings'; + + @override + String get accountDetailsIncomingLabel => 'Incoming server'; + + @override + String get accountDetailsIncomingHint => 'Domain like imap.domain.com'; + + @override + String get accountDetailsOutgoingLabel => 'Outgoing server'; + + @override + String get accountDetailsOutgoingHint => 'Domain like smtp.domain.com'; + + @override + String get accountDetailsAdvancedIncomingSectionTitle => + 'Advanced incoming settings'; + + @override + String get accountDetailsIncomingServerTypeLabel => 'Incoming type:'; + + @override + String get accountDetailsOptionAutomatic => 'automatic'; + + @override + String get accountDetailsIncomingSecurityLabel => 'Incoming security:'; + + @override + String get accountDetailsSecurityOptionNone => 'Plain (no encryption)'; + + @override + String get accountDetailsIncomingPortLabel => 'Incoming port'; + + @override + String get accountDetailsPortHint => 'Leave empty to determine automatically'; + + @override + String get accountDetailsIncomingUserNameLabel => 'Incoming user name'; + + @override + String get accountDetailsAlternativeUserNameHint => + 'Your user name, if different from above'; + + @override + String get accountDetailsIncomingPasswordLabel => 'Incoming password'; + + @override + String get accountDetailsAlternativePasswordHint => + 'Your password, if different from above'; + + @override + String get accountDetailsAdvancedOutgoingSectionTitle => + 'Advanced outgoing settings'; + + @override + String get accountDetailsOutgoingServerTypeLabel => 'Outgoing type:'; + + @override + String get accountDetailsOutgoingSecurityLabel => 'Outgoing security:'; + + @override + String get accountDetailsOutgoingPortLabel => 'Outgoing port'; + + @override + String get accountDetailsOutgoingUserNameLabel => 'Outgoing user name'; + + @override + String get accountDetailsOutgoingPasswordLabel => 'Outgoing password'; + + @override + String get composeTitleNew => '新建邮件'; + + @override + String get composeTitleForward => '转发'; + + @override + String get composeTitleReply => '回复'; + + @override + String get composeEmptyMessage => 'empty message'; + + @override + String get composeWarningNoSubject => + 'You have not specified a subject. Do you want to sent the message without a subject?'; + + @override + String get composeActionSentWithoutSubject => 'Send'; + + @override + String get composeMailSendSuccess => 'Mail sent 😊'; + + @override + String composeSendErrorInfo(String details) { + return 'Sorry, your mail could not be send. We received the following error:\n$details.'; + } + + @override + String get composeRequestReadReceiptAction => 'Request read receipt'; + + @override + String get composeSaveDraftAction => 'Save as draft'; + + @override + String get composeMessageSavedAsDraft => 'Draft saved'; + + @override + String composeMessageSavedAsDraftErrorInfo(String details) { + return 'Your draft could not be saved with the following error:\n$details'; + } + + @override + String get composeConvertToPlainTextEditorAction => 'Convert to plain text'; + + @override + String get composeConvertToHtmlEditorAction => + 'Convert to rich message (HTML)'; + + @override + String get composeContinueEditingAction => 'Continue editing'; + + @override + String get composeCreatePlusAliasAction => 'Create new + alias...'; + + @override + String get composeSenderHint => 'Sender'; + + @override + String get composeRecipientHint => 'Recipient email'; + + @override + String get composeSubjectLabel => 'Subject'; + + @override + String get composeSubjectHint => 'Message subject'; + + @override + String get composeAddAttachmentAction => 'Add'; + + @override + String composeRemoveAttachmentAction(String name) { + return 'Remove $name'; + } + + @override + String get composeLeftByMistake => 'Left by mistake?'; + + @override + String get attachTypeFile => 'File'; + + @override + String get attachTypePhoto => 'Photo'; + + @override + String get attachTypeVideo => 'Video'; + + @override + String get attachTypeAudio => 'Audio'; + + @override + String get attachTypeLocation => 'Location'; + + @override + String get attachTypeGif => 'Animated Gif'; + + @override + String get attachTypeGifSearch => 'search GIPHY'; + + @override + String get attachTypeSticker => 'Sticker'; + + @override + String get attachTypeStickerSearch => 'search GIPHY'; + + @override + String get attachTypeAppointment => 'Appointment'; + + @override + String get languageSettingTitle => 'Language'; + + @override + String get languageSettingLabel => 'Choose the language for Maily:'; + + @override + String get languageSettingSystemOption => 'System language'; + + @override + String get languageSettingConfirmationTitle => 'Use English for Maily?'; + + @override + String get languageSettingConfirmationQuery => + 'Please confirm to use English as your chosen language.'; + + @override + String get languageSetInfo => 'Maily is now shown in English.'; + + @override + String get languageSystemSetInfo => + 'Maily will now use the system\'s language or English if the system\'s language is not supported.'; + + @override + String get swipeSettingTitle => 'Swipe gestures'; + + @override + String get swipeSettingLeftToRightLabel => 'Left to right swipe'; + + @override + String get swipeSettingRightToLeftLabel => 'Right to left swipe'; + + @override + String get swipeSettingChangeAction => 'Change'; + + @override + String get signatureSettingsTitle => 'Signature'; + + @override + String get signatureSettingsComposeActionsInfo => + 'Enable the signature for the following messages:'; + + @override + String get signatureSettingsAccountInfo => + 'You can specify account specific signatures in the account settings.'; + + @override + String signatureSettingsAddForAccount(String account) { + return 'Add signature for $account'; + } + + @override + String get defaultSenderSettingsTitle => 'Default sender'; + + @override + String get defaultSenderSettingsLabel => + 'Select the sender for new messages.'; + + @override + String defaultSenderSettingsFirstAccount(String email) { + return 'First account ($email)'; + } + + @override + String get defaultSenderSettingsAliasInfo => + 'You can set up email alias addresses in the [AS].'; + + @override + String get defaultSenderSettingsAliasAccountSettings => 'account settings'; + + @override + String get replySettingsTitle => 'Message format'; + + @override + String get replySettingsIntro => + 'In what format do you want to answer or forward email by default?'; + + @override + String get replySettingsFormatHtml => 'Always rich format (HTML)'; + + @override + String get replySettingsFormatSameAsOriginal => + 'Use same format as originating email'; + + @override + String get replySettingsFormatPlainText => 'Always text-only'; + + @override + String get moveTitle => 'Move message'; + + @override + String moveSuccess(String mailbox) { + return 'Messaged moved to $mailbox.'; + } + + @override + String get editorArtInputLabel => 'Your input'; + + @override + String get editorArtInputHint => 'Enter text here'; + + @override + String get editorArtWaitingForInputHint => 'waiting for input...'; + + @override + String get fontSerifBold => 'Serif bold'; + + @override + String get fontSerifItalic => 'Serif italic'; + + @override + String get fontSerifBoldItalic => 'Serif bold italic'; + + @override + String get fontSans => 'Sans'; + + @override + String get fontSansBold => 'Sans bold'; + + @override + String get fontSansItalic => 'Sans italic'; + + @override + String get fontSansBoldItalic => 'Sans bold italic'; + + @override + String get fontScript => 'Script'; + + @override + String get fontScriptBold => 'Script bold'; + + @override + String get fontFraktur => 'Fraktur'; + + @override + String get fontFrakturBold => 'Fraktur bold'; + + @override + String get fontMonospace => 'Monospace'; + + @override + String get fontFullwidth => 'Fullwidth'; + + @override + String get fontDoublestruck => 'Double struck'; + + @override + String get fontCapitalized => 'Capitalized'; + + @override + String get fontCircled => 'Circled'; + + @override + String get fontParenthesized => 'Parenthesized'; + + @override + String get fontUnderlinedSingle => 'Underlined'; + + @override + String get fontUnderlinedDouble => 'Underlined double'; + + @override + String get fontStrikethroughSingle => 'Strike through'; + + @override + String get fontCrosshatch => 'Crosshatch'; + + @override + String accountLoadError(String name) { + return 'Unable to connect to your account $name. Has the password been changed?'; + } + + @override + String get accountLoadErrorEditAction => 'Edit account'; + + @override + String get extensionsTitle => 'Extensions'; + + @override + String get extensionsIntro => + 'With extensions e-mail service providers, companies and developers can adapt Maily with useful functionalities.'; + + @override + String get extensionsLearnMoreAction => 'Learn more about extensions'; + + @override + String get extensionsReloadAction => 'Reload extensions'; + + @override + String get extensionDeactivateAllAction => 'Deactivate all extensions'; + + @override + String get extensionsManualAction => 'Load manually'; + + @override + String get extensionsManualUrlLabel => 'Url of extension'; + + @override + String extensionsManualLoadingError(String url) { + return 'Unable to download extension from \"$url\".'; + } + + @override + String get icalendarAcceptTentatively => 'Tentatively'; + + @override + String get icalendarActionChangeParticipantStatus => 'Change'; + + @override + String get icalendarLabelSummary => 'Title'; + + @override + String get icalendarNoSummaryInfo => '(no title)'; + + @override + String get icalendarLabelDescription => 'Description'; + + @override + String get icalendarLabelStart => 'Start'; + + @override + String get icalendarLabelEnd => 'End'; + + @override + String get icalendarLabelDuration => 'Duration'; + + @override + String get icalendarLabelLocation => 'Location'; + + @override + String get icalendarLabelTeamsUrl => 'Link'; + + @override + String get icalendarLabelRecurrenceRule => 'Repeats'; + + @override + String get icalendarLabelParticipants => 'Participants'; + + @override + String get icalendarParticipantStatusNeedsAction => + 'You are asked to answer this invitation.'; + + @override + String get icalendarParticipantStatusAccepted => + 'You have accepted this invitation.'; + + @override + String get icalendarParticipantStatusDeclined => + 'You have declined this invitation.'; + + @override + String get icalendarParticipantStatusAcceptedTentatively => + 'You have tentatively accepted this invitation.'; + + @override + String get icalendarParticipantStatusDelegated => + 'You have delegated this invitation.'; + + @override + String get icalendarParticipantStatusInProcess => 'The task is in progress.'; + + @override + String get icalendarParticipantStatusPartial => 'The task is partially done.'; + + @override + String get icalendarParticipantStatusCompleted => 'The task is done.'; + + @override + String get icalendarParticipantStatusOther => 'Your status is unknown.'; + + @override + String get icalendarParticipantStatusChangeTitle => 'Your Status'; + + @override + String get icalendarParticipantStatusChangeText => + 'Do you want to accept this invitation?'; + + @override + String icalendarParticipantStatusSentFailure(String details) { + return 'Unable to send reply.\nThe server responded with the following details:\n$details'; + } + + @override + String get icalendarExportAction => 'Export'; + + @override + String icalendarReplyStatusNeedsAction(String attendee) { + return '$attendee has not answered this invitation.'; + } + + @override + String icalendarReplyStatusAccepted(String attendee) { + return '$attendee has accepted the appointment.'; + } + + @override + String icalendarReplyStatusDeclined(String attendee) { + return '$attendee has declined this invitation.'; + } + + @override + String icalendarReplyStatusAcceptedTentatively(String attendee) { + return '$attendee has tentatively accepted this invitation.'; + } + + @override + String icalendarReplyStatusDelegated(String attendee) { + return '$attendee has delegated this invitation.'; + } + + @override + String icalendarReplyStatusInProcess(String attendee) { + return '$attendee has started this task.'; + } + + @override + String icalendarReplyStatusPartial(String attendee) { + return '$attendee has partially done this task.'; + } + + @override + String icalendarReplyStatusCompleted(String attendee) { + return '$attendee has finished this task.'; + } + + @override + String icalendarReplyStatusOther(String attendee) { + return '$attendee has answered with an unknown status.'; + } + + @override + String get icalendarReplyWithoutParticipants => + 'This calendar reply contains no participants.'; + + @override + String icalendarReplyWithoutStatus(String attendee) { + return '$attendee replied without an participation status.'; + } + + @override + String get composeAppointmentTitle => 'Create Appointment'; + + @override + String get composeAppointmentLabelDay => 'day'; + + @override + String get composeAppointmentLabelTime => 'time'; + + @override + String get composeAppointmentLabelAllDayEvent => 'All day'; + + @override + String get composeAppointmentLabelRepeat => 'Repeat'; + + @override + String get composeAppointmentLabelRepeatOptionNever => '从不'; + + @override + String get composeAppointmentLabelRepeatOptionDaily => 'Daily'; + + @override + String get composeAppointmentLabelRepeatOptionWeekly => 'Weekly'; + + @override + String get composeAppointmentLabelRepeatOptionMonthly => 'Monthly'; + + @override + String get composeAppointmentLabelRepeatOptionYearly => 'Annually'; + + @override + String get composeAppointmentRecurrenceFrequencyLabel => 'Frequency'; + + @override + String get composeAppointmentRecurrenceIntervalLabel => 'Interval'; + + @override + String get composeAppointmentRecurrenceDaysLabel => 'On days'; + + @override + String get composeAppointmentRecurrenceUntilLabel => 'Until'; + + @override + String get composeAppointmentRecurrenceUntilOptionUnlimited => 'Unlimited'; + + @override + String composeAppointmentRecurrenceUntilOptionRecommended(String duration) { + return 'Recommended ($duration)'; + } + + @override + String get composeAppointmentRecurrenceUntilOptionSpecificDate => + 'Until chosen date'; + + @override + String composeAppointmentRecurrenceMonthlyOnDayOfMonth(int day) { + final intl.NumberFormat dayNumberFormat = intl.NumberFormat.compactLong( + locale: localeName, + ); + final String dayString = dayNumberFormat.format(day); + + return 'On the $dayString. day of the month'; + } + + @override + String get composeAppointmentRecurrenceMonthlyOnWeekDay => 'Weekday in month'; + + @override + String get composeAppointmentRecurrenceFirst => 'First'; + + @override + String get composeAppointmentRecurrenceSecond => 'Second'; + + @override + String get composeAppointmentRecurrenceThird => 'Third'; + + @override + String get composeAppointmentRecurrenceLast => 'Last'; + + @override + String get composeAppointmentRecurrenceSecondLast => 'Second-last'; + + @override + String durationYears(int number) { + final intl.NumberFormat numberNumberFormat = intl.NumberFormat.compactLong( + locale: localeName, + ); + final String numberString = numberNumberFormat.format(number); + + String _temp0 = intl.Intl.pluralLogic( + number, + locale: localeName, + other: '$numberString years', + one: '1 year', + ); + return '$_temp0'; + } + + @override + String durationMonths(int number) { + final intl.NumberFormat numberNumberFormat = intl.NumberFormat.compactLong( + locale: localeName, + ); + final String numberString = numberNumberFormat.format(number); + + String _temp0 = intl.Intl.pluralLogic( + number, + locale: localeName, + other: '$numberString months', + one: '1 month', + ); + return '$_temp0'; + } + + @override + String durationWeeks(int number) { + final intl.NumberFormat numberNumberFormat = intl.NumberFormat.compactLong( + locale: localeName, + ); + final String numberString = numberNumberFormat.format(number); + + String _temp0 = intl.Intl.pluralLogic( + number, + locale: localeName, + other: '$numberString weeks', + one: '1 week', + ); + return '$_temp0'; + } + + @override + String durationDays(int number) { + final intl.NumberFormat numberNumberFormat = intl.NumberFormat.compactLong( + locale: localeName, + ); + final String numberString = numberNumberFormat.format(number); + + String _temp0 = intl.Intl.pluralLogic( + number, + locale: localeName, + other: '$numberString days', + one: '1 day', + ); + return '$_temp0'; + } + + @override + String durationHours(int number) { + final intl.NumberFormat numberNumberFormat = intl.NumberFormat.compactLong( + locale: localeName, + ); + final String numberString = numberNumberFormat.format(number); + + String _temp0 = intl.Intl.pluralLogic( + number, + locale: localeName, + other: '$numberString hours', + one: '1 hour', + ); + return '$_temp0'; + } + + @override + String durationMinutes(int number) { + final intl.NumberFormat numberNumberFormat = intl.NumberFormat.compactLong( + locale: localeName, + ); + final String numberString = numberNumberFormat.format(number); + + String _temp0 = intl.Intl.pluralLogic( + number, + locale: localeName, + other: '$numberString minutes', + one: '1 minute', + ); + return '$_temp0'; + } + + @override + String get durationEmpty => 'No duration'; +} diff --git a/lib/src/localization/app_zh.arb b/lib/src/localization/app_zh.arb new file mode 100644 index 0000000..6035bc6 --- /dev/null +++ b/lib/src/localization/app_zh.arb @@ -0,0 +1,2447 @@ +{ + "@@locale": "zh", + "signature": "由 Maily 发送", + "@signature": { + "description": "Default signature text" + }, + "actionCancel": "取消", + "@actionCancel": { + "description": "Generic cancel action" + }, + "actionOk": "确定", + "@actionOk": { + "description": "Generic OK action" + }, + "actionDone": "完成", + "@actionDone": { + "description": "Generic done action" + }, + "actionNext": "下一步", + "@actionNext": { + "description": "Generic next action" + }, + "actionSkip": "跳过", + "@actionSkip": { + "description": "Generic skip action" + }, + "actionUndo": "撤销", + "@actionUndo": { + "description": "Generic undo action" + }, + "actionDelete": "删除", + "@actionDelete": { + "description": "Generic delete action" + }, + "actionAccept": "接受", + "@actionAccept": { + "description": "Generic accept action" + }, + "actionDecline": "拒绝", + "@actionDecline": { + "description": "Generic decline action" + }, + "actionEdit": "编辑", + "@actionEdit": { + "description": "Generic edit action" + }, + "actionAddressCopy": "复制", + "@actionAddressCopy": { + "description": "Copy action for email addresses" + }, + "actionAddressCompose": "新建邮件", + "@actionAddressCompose": { + "description": "Compose action for email addresses" + }, + "actionAddressSearch": "搜索", + "@actionAddressSearch": { + "description": "Search action for email addresses" + }, + "splashLoading1": "Maily 启动中...", + "@splashLoading1": { + "description": "Message shown on splash screen while loading" + }, + "splashLoading2": "准备您的 Maily 引擎...", + "@splashLoading2": { + "description": "Message shown on splash screen while loading" + }, + "splashLoading3": "10、9、8… 启动 Maily", + "@splashLoading3": { + "description": "Message shown on splash screen while loading" + }, + "welcomePanel1Title": "Maily", + "@welcomePanel1Title": { + "description": "Welcome panel title" + }, + "welcomePanel1Text": "欢迎使用 Maily,您友好且快速的邮件助手!", + "@welcomePanel1Text": { + "description": "Welcome message shown on first panel" + }, + "welcomePanel2Title": "账户", + "@welcomePanel2Title": { + "description": "Welcome panel title" + }, + "welcomePanel2Text": "管理无限数量的邮件账户。同时在所有账户中阅读和搜索邮件。", + "@welcomePanel2Text": { + "description": "Welcome message shown on second panel" + }, + "welcomePanel3Title": "Swipe & Long-Press", + "@welcomePanel3Title": { + "description": "Welcome panel title" + }, + "welcomePanel3Text": "滑动邮件进行删除或标记为已读。长按邮件可以选择和管理多封邮件。", + "@welcomePanel3Text": { + "description": "Welcome message shown on third panel" + }, + "welcomePanel4Title": "保持收件箱整洁", + "@welcomePanel4Title": { + "description": "Welcome panel title" + }, + "welcomePanel4Text": "只需点击一下即可取消订阅新闻通讯。", + "@welcomePanel4Text": { + "description": "Welcome message shown on fourth panel" + }, + "welcomeActionSignIn": "登录您的邮件账户", + "@welcomeActionSignIn": { + "description": "Button showing login option" + }, + "homeSearchHint": "您的搜索", + "@homeSearchHint": { + "description": "Hint shown in empty search field" + }, + "homeActionsShowAsStack": "堆叠显示", + "@homeActionsShowAsStack": { + "description": "Action to show mails as stack" + }, + "homeActionsShowAsList": "列表显示", + "@homeActionsShowAsList": { + "description": "Action to show mails as list" + }, + "homeEmptyFolderMessage": "全部完成!\n\n此文件夹中没有邮件。", + "@homeEmptyFolderMessage": { + "description": "Message shown when there are no messages in the folder" + }, + "homeEmptySearchMessage": "未找到邮件。", + "@homeEmptySearchMessage": { + "description": "Message shown when there are no messages found in a search query" + }, + "homeDeleteAllTitle": "确认", + "@homeDeleteAllTitle": { + "description": "Title of confirmation dialog when deleting all messages" + }, + "homeDeleteAllQuestion": "确定要删除所有邮件吗?", + "@homeDeleteAllQuestion": { + "description": "Question in confirmation dialog when deleting all messages" + }, + "homeDeleteAllAction": "全部删除", + "@homeDeleteAllAction": { + "description": "Action to tap to delete all messages (must be short)." + }, + "homeDeleteAllScrubOption": "清理邮件", + "@homeDeleteAllScrubOption": { + "description": "Option to remove deleted messages from disk." + }, + "homeDeleteAllSuccess": "所有邮件已删除。", + "@homeDeleteAllSuccess": { + "description": "Message shown after all messages have been deleted." + }, + "homeMarkAllSeenAction": "全部已读", + "@homeMarkAllSeenAction": { + "description": "Action to tap to mark all messages as seen / read (must be short)." + }, + "homeMarkAllUnseenAction": "全部未读", + "@homeMarkAllUnseenAction": { + "description": "Action to tap to mark all messages as unseen / unread (must be short)." + }, + "homeFabTooltip": "新建邮件", + "@homeFabTooltip": { + "description": "Tooltip for 'compose new message' floating action button." + }, + "homeLoadingMessageSourceTitle": "加载中...", + "@homeLoadingMessageSourceTitle": { + "description": "Title shown while message source itself is being loaded." + }, + "homeLoading": "正在加载 {name}...", + "@homeLoading": { + "description": "Message shown while loading message.", + "placeholders": { + "name": { + "type": "String", + "example": "Inbox" + } + } + }, + "swipeActionToggleRead": "标记为已读/未读", + "@swipeActionToggleRead": { + "description": "Swipe action for marking a message as read / unread." + }, + "swipeActionDelete": "删除", + "@swipeActionDelete": { + "description": "Swipe action for deleting a message." + }, + "swipeActionMarkJunk": "标记为垃圾邮件", + "@swipeActionMarkJunk": { + "description": "Swipe action for moving a message to junk." + }, + "swipeActionArchive": "归档", + "@swipeActionArchive": { + "description": "Swipe action for moving a message to archive." + }, + "swipeActionFlag": "切换星标", + "@swipeActionFlag": { + "description": "Swipe action for marking a message as flagged / unflagged." + }, + "multipleMovedToJunk": "{number,plural, =1{一封邮件已标记为垃圾邮件} other{{number} 封邮件已标记为垃圾邮件}}", + "@multipleMovedToJunk": { + "description": "Message shown after moving messages to junk. Message formatted using the plural JSON scheme.", + "placeholders": { + "number": { + "type": "int", + "example": "2", + "format": "compactLong" + } + } + }, + "multipleMovedToInbox": "{number,plural, =1{一封邮件已移至收件箱} other{{number} 封邮件已移至收件箱}}", + "@multipleMovedToInbox": { + "description": "Message shown after moving messages from junk, trash or archive back to the Inbox. Message formatted using the plural JSON scheme.", + "placeholders": { + "number": { + "type": "int", + "example": "2", + "format": "compactLong" + } + } + }, + "multipleMovedToArchive": "{number,plural, =1{一封邮件已归档} other{{number} 封邮件已归档}}", + "@multipleMovedToArchive": { + "description": "Message shown after moving messages to archive. Message formatted using the plural JSON scheme.", + "placeholders": { + "number": { + "type": "int", + "example": "2", + "format": "compactLong" + } + } + }, + "multipleMovedToTrash": "{number,plural, =1{一封邮件已删除} other{{number} 封邮件已删除}}", + "@multipleMovedToTrash": { + "description": "Message shown after moving messages to trash. Message formatted using the plural JSON scheme.", + "placeholders": { + "number": { + "type": "int", + "example": "2", + "format": "compactLong" + } + } + }, + "multipleSelectionNeededInfo": "请先选择邮件。", + "@multipleSelectionNeededInfo": { + "description": "Short info shown when a multiple message action is triggered without selecting at least one message first." + }, + "multipleSelectionActionFailed": "无法执行操作\n详细信息:{details}", + "@multipleSelectionActionFailed": { + "description": "Error message when the selection action failed.", + "placeholders": { + "details": { + "type": "String", + "example": "Mailbox not found" + } + } + }, + "multipleMoveTitle": "{number,plural, =1{移动邮件} other{移动 {number} 封邮件}}", + "@multipleMoveTitle": { + "description": "Title of move dialog for multiple messages. Message formatted using the plural JSON scheme.", + "placeholders": { + "number": { + "type": "int", + "example": "2", + "format": "compactLong" + } + } + }, + "messageActionMultipleMarkSeen": "Mark as read", + "@messageActionMultipleMarkSeen": { + "description": "Action for several messages." + }, + "messageActionMultipleMarkUnseen": "Mark as unread", + "@messageActionMultipleMarkUnseen": { + "description": "Action for several messages." + }, + "messageActionMultipleMarkFlagged": "标记星标", + "@messageActionMultipleMarkFlagged": { + "description": "Action for several messages." + }, + "messageActionMultipleMarkUnflagged": "取消星标", + "@messageActionMultipleMarkUnflagged": { + "description": "Action for several messages." + }, + "messageActionViewInSafeMode": "不加载外部内容查看", + "@messageActionMultipleViewInSafeMode": { + "description": "Action for message." + }, + "emailSenderUnknown": "", + "@emailSenderUnknown": { + "description": "Shown as replacement when there is no known sender of a message." + }, + "dateRangeFuture": "未来", + "@dateRangeFuture": { + "description": "Date range title." + }, + "dateRangeTomorrow": "明天", + "@dateRangeTomorrow": { + "description": "Date range title." + }, + "dateRangeToday": "今天", + "@dateRangeToday": { + "description": "Date range title." + }, + "dateRangeYesterday": "昨天", + "@dateRangeYesterday": { + "description": "Date range title." + }, + "dateRangeCurrentWeek": "本周", + "@dateRangeCurrentWeek": { + "description": "Date range title." + }, + "dateRangeLastWeek": "上周", + "@dateRangeLastWeek": { + "description": "Date range title." + }, + "dateRangeCurrentMonth": "本月", + "@dateRangeCurrentMonth": { + "description": "Date range title." + }, + "dateRangeLastMonth": "上月", + "@dateRangeLastMonth": { + "description": "Date range title." + }, + "dateRangeCurrentYear": "今年", + "@dateRangeCurrentYear": { + "description": "Date range title." + }, + "dateRangeLongAgo": "更早", + "@dateRangeLongAgo": { + "description": "Date range title." + }, + "dateUndefined": "未定义", + "@dateUndefined": { + "description": "Unknown date." + }, + "dateDayToday": "今天", + "@dateDayToday": { + "description": "Message data is today." + }, + "dateDayYesterday": "昨天", + "@dateDayYesterday": { + "description": "Message data is yesterday." + }, + "dateDayLastWeekday": "上{day}", + "@dateDayLastWeekday": { + "description": "Message data is a recent weekday.", + "placeholders": { + "day": { + "type": "String", + "example": "Tuesday" + } + } + }, + "drawerEntryAbout": "关于 Maily", + "@drawerEntryAbout": { + "description": "Menu entry for about." + }, + "drawerEntrySettings": "设置", + "@drawerEntrySettings": { + "description": "Menu entry for settings." + }, + "drawerAccountsSectionTitle": "{number,plural, =1{一个账户} other{{number} 个账户}}", + "@drawerAccountsSectionTitle": { + "description": "Title shown for accounts drop down. Message formatted using the plural JSON scheme.", + "placeholders": { + "number": { + "type": "int", + "example": "2", + "format": "compactLong" + } + } + }, + "drawerEntryAddAccount": "添加账户", + "@drawerEntryAddAccount": { + "description": "Menu entry for adding a new account." + }, + "unifiedAccountName": "统一账户", + "@unifiedAccountName": { + "description": "Name of unified account." + }, + "unifiedFolderInbox": "统一收件箱", + "@unifiedFolderInbox": { + "description": "Folder name of unified account." + }, + "unifiedFolderSent": "统一已发送", + "@unifiedFolderSent": { + "description": "Folder name of unified account." + }, + "unifiedFolderDrafts": "统一草稿", + "@unifiedFolderDrafts": { + "description": "Folder name of unified account." + }, + "unifiedFolderTrash": "统一垃圾箱", + "@unifiedFolderTrash": { + "description": "Folder name of unified account." + }, + "unifiedFolderArchive": "统一归档", + "@unifiedFolderArchive": { + "description": "Folder name of unified account." + }, + "unifiedFolderJunk": "统一垃圾邮件", + "@unifiedFolderJunk": { + "description": "Folder name of unified account." + }, + "folderInbox": "收件箱", + "@folderInbox": { + "description": "Folder name." + }, + "folderSent": "已发送", + "@folderSent": { + "description": "Folder name." + }, + "folderDrafts": "草稿", + "@folderDrafts": { + "description": "Folder name." + }, + "folderTrash": "垃圾箱", + "@folderTrash": { + "description": "Folder name." + }, + "folderArchive": "归档", + "@folderArchive": { + "description": "Folder name." + }, + "folderJunk": "垃圾邮件", + "@folderJunk": { + "description": "Folder name." + }, + "folderUnknown": "未知", + "@folderUnknown": { + "description": "Folder name for a message source without a name." + }, + "viewContentsAction": "查看内容", + "@viewContentsAction": { + "description": "Show contents of a message on a separate screen." + }, + "viewSourceAction": "查看源代码", + "@viewSourceAction": { + "description": "Show source code of a message." + }, + "detailsErrorDownloadInfo": "无法下载邮件。", + "@detailsErrorDownloadInfo": { + "description": "Info shown when an email could not be downloaded." + }, + "detailsErrorDownloadRetry": "重试", + "@detailsErrorDownloadRetry": { + "description": "Retry action shown when an email could not be downloaded." + }, + "detailsHeaderFrom": "发件人", + "@detailsHeaderFrom": { + "description": "Label for sender(s) of email." + }, + "detailsHeaderTo": "收件人", + "@detailsHeaderTo": { + "description": "Label for [to] recipient(s) of email." + }, + "detailsHeaderCc": "CC", + "@detailsHeaderCc": { + "description": "Label for [CC] - carbon copy - recipient(s) of email." + }, + "detailsHeaderBcc": "BCC", + "@detailsHeaderBcc": { + "description": "Label for [BCC] - blind carbon copy - recipient(s) of email." + }, + "detailsHeaderDate": "日期", + "@detailsHeaderDate": { + "description": "Label for date of email." + }, + "subjectUndefined": "", + "@subjectUndefined": { + "description": "Shown instead of the subject when it is undefined." + }, + "detailsActionShowImages": "显示图片", + "@detailsActionShowImages": { + "description": "Action for showing images. Only visible when external images are blocked." + }, + "detailsNewsletterActionUnsubscribe": "取消订阅", + "@detailsNewsletterActionUnsubscribe": { + "description": "Action shown for unsubscribable newsletter." + }, + "detailsNewsletterActionResubscribe": "重新订阅", + "@detailsNewsletterActionResubscribe": { + "description": "Action shown after re-subscribable newsletter has been unsubscribed." + }, + "detailsNewsletterStatusUnsubscribed": "已取消订阅", + "@detailsNewsletterStatusUnsubscribed": { + "description": "Status shown for unsubscribed newsletter." + }, + "detailsNewsletterUnsubscribeDialogTitle": "取消订阅", + "@detailsNewsletterUnsubscribeDialogTitle": { + "description": "Title for unsubscribe newsletter dialog." + }, + "detailsNewsletterUnsubscribeDialogQuestion": "您确定要取消订阅 {listName} 吗?", + "@detailsNewsletterUnsubscribeDialogQuestion": { + "description": "Question for unsubscribe newsletter dialog.", + "placeholders": { + "listName": { + "type": "String", + "example": "List-Name" + } + } + }, + "detailsNewsletterUnsubscribeDialogAction": "取消订阅", + "@detailsNewsletterUnsubscribeDialogAction": { + "description": "Action for unsubscribe newsletter dialog." + }, + "detailsNewsletterUnsubscribeSuccessTitle": "已取消订阅", + "@detailsNewsletterUnsubscribeSuccessTitle": { + "description": "Title for dialog after unsubscribing newsletter successfully." + }, + "detailsNewsletterUnsubscribeSuccessMessage": "您已成功取消订阅 {listName}。", + "@detailsNewsletterUnsubscribeSuccessMessage": { + "description": "Text confirmation after successfully unsubscribing a newsletter.", + "placeholders": { + "listName": { + "type": "String", + "example": "List-Name" + } + } + }, + "detailsNewsletterUnsubscribeFailureTitle": "取消订阅失败", + "@detailsNewsletterUnsubscribeFailureTitle": { + "description": "Title for dialog after unsubscribing newsletter failed." + }, + "detailsNewsletterUnsubscribeFailureMessage": "抱歉,我无法自动取消订阅 {listName}。", + "@detailsNewsletterUnsubscribeFailureMessage": { + "description": "Text confirmation after unsubscribing a newsletter failed.", + "placeholders": { + "listName": { + "type": "String", + "example": "List-Name" + } + } + }, + "detailsNewsletterResubscribeDialogTitle": "重新订阅", + "@detailsNewsletterResubscribeDialogTitle": { + "description": "Title for re-subscribe newsletter dialog." + }, + "detailsNewsletterResubscribeDialogQuestion": "您确定要重新订阅 {listName} 吗?", + "@detailsNewsletterResubscribeDialogQuestion": { + "description": "Question for re-subscribe newsletter dialog.", + "placeholders": { + "listName": { + "type": "String", + "example": "List-Name" + } + } + }, + "detailsNewsletterResubscribeDialogAction": "订阅", + "@detailsNewsletterResubscribeDialogAction": { + "description": "Action for re-subscribe newsletter dialog." + }, + "detailsNewsletterResubscribeSuccessTitle": "已订阅", + "@detailsNewsletterResubscribeSuccessTitle": { + "description": "Title for dialog after re-subscribed newsletter successfully." + }, + "detailsNewsletterResubscribeSuccessMessage": "您已重新订阅 {listName}。", + "@detailsNewsletterResubscribeSuccessMessage": { + "description": "Text confirmation after successfully re-subscribing a newsletter.", + "placeholders": { + "listName": { + "type": "String", + "example": "List-Name" + } + } + }, + "detailsNewsletterResubscribeFailureTitle": "Not subscribed", + "@detailsNewsletterResubscribeFailureTitle": { + "description": "Title for dialog after re-subscribing newsletter failed." + }, + "detailsNewsletterResubscribeFailureMessage": "抱歉,{listName} 的订阅请求失败了。", + "@detailsNewsletterResubscribeFailureMessage": { + "description": "Text confirmation after re-subscribing a newsletter failed.", + "placeholders": { + "listName": { + "type": "String", + "example": "List-Name" + } + } + }, + "detailsSendReadReceiptAction": "发送已读回执", + "@detailsSendReadReceiptAction": { + "description": "Action to send the read receipt for the shown message." + }, + "detailsReadReceiptSentStatus": "已读回执已发送 ✔", + "@detailsReadReceiptSentStatus": { + "description": "Status after sending the read receipt for the shown message." + }, + "detailsReadReceiptSubject": "已读回执", + "@detailsReadReceiptSubject": { + "description": "Message subject for read receipts." + }, + "attachmentActionOpen": "打开", + "@attachmentActionOpen": { + "description": "Open action for attachments without interactive viewer." + }, + "attachmentDecodeError": "This attachment has an unsupported format or encoding.\nDetails: ${details}", + "@attachmentDecodeError": { + "description": "Text shown when downloaded attachment could not be decoded.", + "placeholders": { + "details": { + "type": "String", + "example": "FormatException" + } + } + }, + "attachmentDownloadError": "Unable to download this attachment.\nDetails: ${details}", + "@attachmentDownloadError": { + "description": "Text shown when attachment could not be downloaded.", + "placeholders": { + "details": { + "type": "String", + "example": "NotFound" + } + } + }, + "messageActionReply": "回复", + "@messageActionReply": { + "description": "Action for single message." + }, + "messageActionReplyAll": "全部回复", + "@messageActionReplyAll": { + "description": "Action for single message." + }, + "messageActionForward": "转发", + "@messageActionForward": { + "description": "Action for single message." + }, + "messageActionForwardAsAttachment": "作为附件转发", + "@messageActionForwardAsAttachment": { + "description": "Action for single message." + }, + "messageActionForwardAttachments": "{number,plural, =1{转发附件} other{转发 {number} 个附件}}", + "@messageActionForwardAttachments": { + "description": "Action for single message to forward the given number of attachments.", + "placeholders": { + "number": { + "type": "int", + "example": "2", + "format": "compactLong" + } + } + }, + "messagesActionForwardAttachments": "转发附件", + "@messagesActionForwardAttachments": { + "description": "Action for multiple selected messages to forward all attachments of the messages." + }, + "messageActionDelete": "删除", + "@messageActionDelete": { + "description": "Action for single message." + }, + "messageActionMoveToInbox": "移至收件箱", + "@messageActionMoveToInbox": { + "description": "Action for single message." + }, + "messageActionMove": "移动", + "@messageActionMove": { + "description": "Action for single message." + }, + "messageStatusSeen": "已读", + "@messageStatusSeen": { + "description": "Status of single message." + }, + "messageStatusUnseen": "未读", + "@messageStatusUnseen": { + "description": "Status of single message." + }, + "messageStatusFlagged": "已星标", + "@messageStatusFlagged": { + "description": "Status of single message." + }, + "messageStatusUnflagged": "未星标", + "@messageStatusUnflagged": { + "description": "Status of single message." + }, + "messageActionMarkAsJunk": "标记为垃圾邮件", + "@messageActionMarkAsJunk": { + "description": "Action for single message." + }, + "messageActionMarkAsNotJunk": "标记为非垃圾邮件", + "@messageActionMarkAsNotJunk": { + "description": "Action for single message." + }, + "messageActionArchive": "归档", + "@messageActionArchive": { + "description": "Action for single message." + }, + "messageActionUnarchive": "移至收件箱", + "@messageActionUnarchive": { + "description": "Action for single message." + }, + "messageActionRedirect": "重定向", + "@messageActionRedirect": { + "description": "Action for single message." + }, + "messageActionAddNotification": "添加通知", + "@messageActionAddNotification": { + "description": "Action for single message." + }, + "resultDeleted": "已删除", + "@resultDeleted": { + "description": "Successful short snackbar message after deleting message(s)." + }, + "resultMovedToJunk": "已标记为垃圾邮件", + "@resultMovedToJunk": { + "description": "Successful short snackbar message after moving message(s) to junk." + }, + "resultMovedToInbox": "已移至收件箱", + "@resultMovedToInbox": { + "description": "Successful short snackbar message after moving message(s) to inbox." + }, + "resultArchived": "已归档", + "@resultArchived": { + "description": "Successful short snackbar message after moving message(s) to archive." + }, + "resultRedirectedSuccess": "邮件已重定向 👍", + "@resultRedirectedSuccess": { + "description": "Successful snackbar message after redirecting message to new recipient(s)." + }, + "resultRedirectedFailure": "Unable to redirect message.\n\nThe server responded with the following details: \"{details}\"", + "@resultRedirectedFailure": { + "description": "Failure snackbar message after failed to redirect message to new recipient(s).", + "placeholders": { + "details": { + "type": "String", + "example": "Invalid recipient" + } + } + }, + "redirectTitle": "重定向", + "@redirectTitle": { + "description": "Title of redirect dialog." + }, + "redirectInfo": "将此邮件重定向到以下收件人。重定向不会更改邮件内容。", + "@redirectInfo": { + "description": "Short explanation of redirect action in redirect dialog." + }, + "redirectEmailInputRequired": "您需要添加至少一个有效的电子邮件地址。", + "@redirectEmailInputRequired": { + "description": "Information when redirect is wanted but no address has been entered." + }, + "searchQueryDescription": "在 {folder} 中搜索...", + "@searchQueryDescription": { + "description": "Description of search within the given folder.", + "placeholders": { + "folder": { + "type": "String", + "example": "Inbox" + } + } + }, + "searchQueryTitle": "搜索 \"{query}\"", + "@searchQueryTitle": { + "description": "Title for a search with the given query.", + "placeholders": { + "query": { + "type": "String", + "example": "a sender name" + } + } + }, + "legaleseUsage": "使用 Maily 即表示您同意我们的 [PP] 和 [TC]。", + "@legaleseUsage": { + "description": "Legal info shown on initial welcome screen and later in about. [PP] is replaced with the legalesePrivacyPolicy text and [TC] with legaleseTermsAndConditions." + }, + "legalesePrivacyPolicy": "隐私政策", + "@legalesePrivacyPolicy": { + "description": "Translation of privacy policy" + }, + "legaleseTermsAndConditions": "Terms & Conditions", + "@legaleseTermsAndConditions": { + "description": "Translation of Terms & Conditions " + }, + "aboutApplicationLegalese": "Maily 是根据 GNU 通用公共许可证发布的自由软件。", + "@aboutApplicationLegalese": { + "description": "Legal info shown in about dialog." + }, + "feedbackActionSuggestFeature": "建议功能", + "@feedbackActionSuggestFeature": { + "description": "Action to suggest a feature." + }, + "feedbackActionReportProblem": "报告问题", + "@feedbackActionReportProblem": { + "description": "Action to report a problem." + }, + "feedbackActionHelpDeveloping": "帮助开发 Maily", + "@feedbackActionHelpDeveloping": { + "description": "Action to help developing." + }, + "feedbackTitle": "反馈", + "@feedbackTitle": { + "description": "Title of feedback settings screen." + }, + "feedbackIntro": "感谢您测试 Maily!", + "@feedbackIntro": { + "description": "Intro for feedback settings screen." + }, + "feedbackProvideInfoRequest": "报告问题时请提供以下信息:", + "@feedbackProvideInfoRequest": { + "description": "Request to provide device and app information when reporting a problem." + }, + "feedbackResultInfoCopied": "已复制到剪贴板", + "@feedbackResultInfoCopied": { + "description": "Info shown after copying device and app info to clipboard." + }, + "accountsTitle": "账户", + "@accountsTitle": { + "description": "Title of accounts settings screen." + }, + "accountsActionReorder": "重新排序账户", + "@accountActionReorder": { + "description": "Action to start reordering accounts." + }, + "settingsTitle": "设置", + "@settingsTitle": { + "description": "Title of base settings screen." + }, + "settingsSecurityBlockExternalImages": "阻止外部图片", + "@settingsSecurityBlockExternalImages": { + "description": "Settings option to block external options." + }, + "settingsSecurityBlockExternalImagesDescriptionTitle": "外部图片", + "@settingsSecurityBlockExternalImagesDescriptionTitle": { + "description": "Title of dialog that shows additional information about the 'block external images' option." + }, + "settingsSecurityBlockExternalImagesDescriptionText": "电子邮件可能包含集成或托管在外部服务器上的图片。外部图片可能会向邮件发件人暴露信息,例如让发件人知道您已打开邮件。此选项允许您阻止此类外部图片,从而降低暴露敏感信息的风险。您仍然可以在阅读邮件时选择逐封加载这些图片。", + "@settingsSecurityBlockExternalImagesDescriptionText": { + "description": "Text of dialog that shows additional information about the 'block external images' option." + }, + "settingsSecurityMessageRenderingHtml": "显示完整邮件内容", + "@settingsSecurityMessageRenderingHtml": { + "description": "Option for how to render messages." + }, + "settingsSecurityMessageRenderingPlainText": "仅显示邮件文本", + "@settingsSecurityMessageRenderingPlainText": { + "description": "Option for how to render messages." + }, + "settingsSecurityLaunchModeLabel": "Maily 应如何打开链接?", + "@settingsSecurityLaunchModeLabel": { + "description": "Option for how to launch URLs." + }, + "settingsSecurityLaunchModeExternal": "在外部打开链接", + "@settingsSecurityLaunchModeExternal": { + "description": "Option for how to launch URLs." + }, + "settingsSecurityLaunchModeInApp": "在 Maily 中打开链接", + "@settingsSecurityLaunchModeInApp": { + "description": "Option for how to launch URLs." + }, + "settingsActionAccounts": "管理账户", + "@settingsActionAccounts": { + "description": "Settings action to manage accounts." + }, + "settingsActionDesign": "外观", + "@settingsActionDesign": { + "description": "Settings action to manage the visualization of the app." + }, + "settingsActionFeedback": "提供反馈", + "@settingsActionFeedback": { + "description": "Settings action to provide feedback about the app." + }, + "settingsActionWelcome": "显示欢迎页面", + "@settingsActionWelcome": { + "description": "Settings action to show welcome screen of the app again." + }, + "settingsReadReceipts": "已读回执", + "@settingsReadReceipts": { + "description": "Settings action to customize read receipts." + }, + "readReceiptsSettingsIntroduction": "您是否要显示已读回执请求?", + "@readReceiptsSettingsIntroduction": { + "description": "Introduction text for managing read receipt requests." + }, + "readReceiptOptionAlways": "始终", + "@readReceiptOptionAlways": { + "description": "Display option for read receipt requests." + }, + "readReceiptOptionNever": "从不", + "@readReceiptOptionNever": { + "description": "Display option for read receipt requests." + }, + "settingsFolders": "文件夹", + "@settingsFolders": { + "description": "Settings action to customize folders." + }, + "folderNamesIntroduction": "您希望文件夹使用什么名称?", + "@folderNamesIntroduction": { + "description": "Introduction for folder names setting." + }, + "folderNamesSettingLocalized": "Maily 提供的名称", + "@folderNamesSettingLocalized": { + "description": "Folder name setting option." + }, + "folderNamesSettingServer": "服务提供的名称", + "@folderNamesSettingServer": { + "description": "Folder name setting option." + }, + "folderNamesSettingCustom": "我自定义的名称", + "@folderNamesSettingCustom": { + "description": "Folder name setting option." + }, + "folderNamesEditAction": "编辑自定义名称", + "@folderNamesEditAction": { + "description": "Action to specify custom folder names." + }, + "folderNamesCustomTitle": "自定义名称", + "@folderNamesCustomTitle": { + "description": "Title of dialog to specify custom folder names." + }, + "folderAddAction": "创建文件夹", + "@folderAddAction": { + "description": "Action to create a new folder." + }, + "folderAddTitle": "创建文件夹", + "@folderAddTitle": { + "description": "Dialog title when creating a new folder." + }, + "folderAddNameLabel": "名称", + "@folderAddNameLabel": { + "description": "Label for input field for the folder name." + }, + "folderAddNameHint": "新文件夹的名称", + "@folderAddNameHint": { + "description": "Hint for input field for the folder name." + }, + "folderAccountLabel": "账户", + "@folderAddAccountLabel": { + "description": "Label to select the current account." + }, + "folderMailboxLabel": "文件夹", + "@folderAddParentFolderLabel": { + "description": "Label to select the current folder." + }, + "folderAddResultSuccess": "文件夹已创建 😊", + "@folderAddResultSuccess": { + "description": "Info for showing the creation success." + }, + "folderAddResultFailure": "无法创建文件夹。\n\n服务器返回 {details}", + "@folderAddResultFailure": { + "description": "Info for showing a folder creation error.", + "placeholders": { + "details": { + "type": "String", + "example": "Invalid name" + } + } + }, + "folderDeleteAction": "删除", + "@folderDeleteAction": { + "description": "Action to delete an existing folder." + }, + "folderDeleteConfirmTitle": "确认", + "@folderDeleteConfirmTitle": { + "description": "Dialog title to confirm deleting a folder." + }, + "folderDeleteConfirmText": "您确定要删除文件夹 {name} 吗?", + "@folderDeleteConfirmText": { + "description": "Dialog text to confirm deleting a folder.", + "placeholders": { + "name": { + "type": "String", + "example": "My Custom Folder" + } + } + }, + "folderDeleteResultSuccess": "文件夹已删除。", + "@folderDeleteResultSuccess": { + "description": "Info for showing the creation success." + }, + "folderDeleteResultFailure": "无法删除文件夹。\n\n服务器返回 {details}", + "@folderDeleteResultFailure": { + "description": "Info for showing a folder deletion error.", + "placeholders": { + "details": { + "type": "String", + "example": "Invalid name" + } + } + }, + "settingsDevelopment": "开发设置", + "@settingsDevelopment": { + "description": "Settings action to specify the development options." + }, + "developerModeTitle": "开发模式", + "@developerModeTitle": { + "description": "Title of the development mode section." + }, + "developerModeIntroduction": "如果启用开发模式,您将能够查看邮件的源代码并将文本附件转换为邮件。", + "@developerModeIntroduction": { + "description": "Text explaining the development mode." + }, + "developerModeEnable": "启用开发模式", + "@developerModeEnable": { + "description": "Text in checkbox to enable the development mode." + }, + "developerShowAsEmail": "转换为电子邮件", + "@developerShowAsEmail": { + "description": "Action to convert text into an email." + }, + "developerShowAsEmailFailed": "此文本无法转换为 MIME 邮件。", + "@developerShowAsEmailFailed": { + "description": "Text shown when text cannot be converted into an email." + }, + "designTitle": "外观设置", + "@designTitle": { + "description": "Title of design settings screen." + }, + "designSectionThemeTitle": "主题", + "@designSectionThemeTitle": { + "description": "Title of theme section on design settings screen." + }, + "designThemeOptionLight": "浅色", + "@designThemeOptionLight": { + "description": "Theme option." + }, + "designThemeOptionDark": "深色", + "@designThemeOptionDark": { + "description": "Theme option." + }, + "designThemeOptionSystem": "跟随系统", + "@designThemeOptionSystem": { + "description": "Theme option." + }, + "designThemeOptionCustom": "自定义", + "@designThemeOptionCustom": { + "description": "Theme option." + }, + "designSectionCustomTitle": "启用深色主题", + "@designSectionCustomTitle": { + "description": "Title of custom theme option section on design settings screen." + }, + "designThemeCustomStart": "从 {time} 开始", + "@designThemeCustomStart": { + "description": "Start time of custom theme setting.", + "placeholders": { + "time": { + "type": "String", + "example": "10 PM" + } + } + }, + "designThemeCustomEnd": "到 {time} 结束", + "@designThemeCustomEnd": { + "description": "End time of custom theme setting.", + "placeholders": { + "time": { + "type": "String", + "example": "7 AM" + } + } + }, + "designSectionColorTitle": "配色方案", + "@designSectionColorTitle": { + "description": "Title of color section on design settings screen." + }, + "securitySettingsTitle": "安全性", + "@securitySettingsTitle": { + "description": "Title of security settings screen." + }, + "securitySettingsIntro": "根据您的个人需求调整安全设置。", + "@securitySettingsIntro": { + "description": "Introduction of security settings screen." + }, + "securityUnlockWithFaceId": "使用 Face ID 解锁 Maily。", + "@securityUnlockWithFaceId": { + "description": "iOS-specific unlock reason." + }, + "securityUnlockWithTouchId": "使用 Touch ID 解锁 Maily。", + "@securityUnlockWithTouchId": { + "description": "iOS-specific unlock reason." + }, + "securityUnlockReason": "解锁 Maily。", + "@securityUnlockReason": { + "description": "Generic unlock reason." + }, + "securityUnlockDisableReason": "解锁 Maily 以关闭锁定。", + "@securityUnlockDisableReason": { + "description": "Generic unlock disable reason." + }, + "securityUnlockNotAvailable": "您的设备不支持生物识别,您可能需要先设置解锁选项。", + "@securityUnlockNotAvailable": { + "description": "Message when biometric authentication is not available." + }, + "securityUnlockLabel": "锁定 Maily", + "@securityUnlockLabel": { + "description": "Label of biometric authentication lock feature." + }, + "securityUnlockDescriptionTitle": "锁定 Maily", + "@securityUnlockDescriptionTitle": { + "description": "Title to explain lock feature via biometric authentication." + }, + "securityUnlockDescriptionText": "您可以选择锁定对 Maily 的访问,这样即使他人有权访问您的设备,也无法阅读您的邮件。", + "@securityUnlockDescriptionText": { + "description": "Text explaining lock feature via biometric authentication." + }, + "securityLockImmediately": "立即锁定", + "@securityLockImmediately": { + "description": "Lock timing option." + }, + "securityLockAfter5Minutes": "5 分钟后锁定", + "@securityLockAfter5Minutes": { + "description": "Lock timing option." + }, + "securityLockAfter30Minutes": "30 分钟后锁定", + "@securityLockAfter30Minutes": { + "description": "Lock timing option." + }, + "lockScreenTitle": "Maily 已锁定", + "@lockScreenTitle": { + "description": "Title of lock screen." + }, + "lockScreenIntro": "Maily 已锁定,请进行身份验证以继续。", + "@lockScreenIntro": { + "description": "Text on lock screen." + }, + "lockScreenUnlockAction": "解锁", + "@lockScreenUnlockAction": { + "description": "Action to unlock on lock screen." + }, + "addAccountTitle": "添加账户", + "@addAccountTitle": { + "description": "Title of add account screen." + }, + "addAccountEmailLabel": "电子邮件", + "@addAccountEmailLabel": { + "description": "Label and section header of email address input field." + }, + "addAccountEmailHint": "请输入您的电子邮件地址", + "@addAccountEmailHint": { + "description": "Hint text of email address input field." + }, + "addAccountResolvingSettingsLabel": "正在解析 {email}...", + "@addAccountResolvingSettingsLabel": { + "description": "Label shown while resolving the settings for the specified email address.", + "placeholders": { + "email": { + "type": "String", + "example": "someone@domain.com" + } + } + }, + "addAccountResolvedSettingsWrongAction": "不是 {provider}?", + "@addAccountResolvedSettingsWrongAction": { + "description": "Button text shown for the user to edit server settings manually when the resolving was successful but turned out a different than expected provider name.", + "placeholders": { + "provider": { + "type": "String", + "example": "gmail" + } + } + }, + "addAccountResolvingSettingsFailedInfo": "无法解析 {email}。请返回修改或手动设置账户。", + "@addAccountResolvingSettingsFailedInfo": { + "description": "Info shown after resolving the settings for the specified email address failed.", + "placeholders": { + "email": { + "type": "String", + "example": "someone@domain.com" + } + } + }, + "addAccountEditManuallyAction": "手动编辑", + "@addAccountEditManuallyAction": { + "description": "Action shown after account settings could not be automatically be discovered." + }, + "addAccountPasswordLabel": "密码", + "@addAccountPasswordLabel": { + "description": "Label and section header of password input field." + }, + "addAccountPasswordHint": "请输入您的密码", + "@addAccountPasswordHint": { + "description": "Hint text of password input field." + }, + "addAccountApplicationPasswordRequiredInfo": "此提供商要求您设置应用专用密码。", + "@addAccountApplicationPasswordRequiredInfo": { + "description": "Text shown when the provider of the email account requires app specific passwords to be set up." + }, + "addAccountApplicationPasswordRequiredButton": "创建应用专用密码", + "@addAccountApplicationPasswordRequiredButton": { + "description": "Button text for setting up app specific password." + }, + "addAccountApplicationPasswordRequiredAcknowledged": "我已有应用密码", + "@addAccountApplicationPasswordRequiredAcknowledged": { + "description": "Acknowledgement to be confirmed by user to acknowledge the fact that an app specific password is required." + }, + "addAccountVerificationStep": "验证", + "@addAccountVerificationStep": { + "description": "Section header of verification/log in step." + }, + "addAccountSetupAccountStep": "账户设置", + "@addAccountSetupAccountStep": { + "description": "Section header of account setup step." + }, + "addAccountVerifyingSettingsLabel": "正在验证 {email}...", + "@addAccountVerifyingSettingsLabel": { + "description": "Info shown while the account settings for the given email are verified.", + "placeholders": { + "email": { + "type": "String", + "example": "someone@domain.com" + } + } + }, + "addAccountVerifyingSuccessInfo": "成功登录 {email}。", + "@addAccountVerifyingSuccessInfo": { + "description": "Info shown after the account settings for the given email have been verified.", + "placeholders": { + "email": { + "type": "String", + "example": "someone@domain.com" + } + } + }, + "addAccountVerifyingFailedInfo": "抱歉,出现了问题。请检查您的电子邮件 {email} 和密码。", + "@addAccountVerifyingFailedInfo": { + "description": "Info shown after the account settings for the given email could not be verified.", + "placeholders": { + "email": { + "type": "String", + "example": "someone@domain.com" + } + } + }, + "addAccountOauthOptionsText": "使用 {provider} 登录或创建应用专用密码。", + "@addAccountOauthOptionsText": { + "description": "Info shown oauth process fails and the user can try again or use an app-specific password.", + "placeholders": { + "provider": { + "type": "String", + "example": "Mailbox.org" + } + } + }, + "addAccountOauthSignIn": "使用 {provider} 登录", + "@addAccountOauthSignIn": { + "description": "Label of button to sign in via oauth with the given provider.", + "placeholders": { + "provider": { + "type": "String", + "example": "Mailbox.org" + } + } + }, + "addAccountOauthSignInGoogle": "使用 Google 登录", + "@addAccountOauthSignInGoogle": { + "description": "Label of button to sign in via oauth with the Google." + }, + "addAccountOauthSignInWithAppPassword": "或者,创建应用密码进行登录。", + "@addAccountOauthSignInWithAppPassword": { + "description": "Info to set up app specific password." + }, + "accountAddImapAccessSetupMightBeRequired": "您的提供商可能要求您手动设置电子邮件应用的访问权限。", + "@accountAddImapAccessSetupMightBeRequired": { + "description": "Info shown when login fails for a provider that is know to require manual activation of IMAP access." + }, + "addAccountSetupImapAccessButtonLabel": "设置电子邮件访问", + "@addAccountSetupImapAccessButtonLabel": { + "description": "Label of button to launch website with instructions." + }, + "addAccountNameOfUserLabel": "您的姓名", + "@addAccountNameOfUserLabel": { + "description": "Label for user name input field." + }, + "addAccountNameOfUserHint": "收件人看到的姓名", + "@addAccountNameOfUserHint": { + "description": "Hint for user name input field." + }, + "addAccountNameOfAccountLabel": "账户名称", + "@addAccountNameOfAccountLabel": { + "description": "Label for account name input field." + }, + "addAccountNameOfAccountHint": "请输入您的账户名称", + "@addAccountNameOfAccountHint": { + "description": "Hint for account name input field." + }, + "editAccountTitle": "编辑 {name}", + "@editAccountTitle": { + "description": "Title for screen when editing the account with the given name.", + "placeholders": { + "name": { + "type": "String", + "example": "domain.com" + } + } + }, + "editAccountFailureToConnectInfo": "Maily 无法连接 {name}。", + "@editAccountFailureToConnectInfo": { + "description": "Info about not being able to connect to the named service. Most common causes are temporary network problems or a changed password.", + "placeholders": { + "name": { + "type": "String", + "example": "domain.com" + } + } + }, + "editAccountFailureToConnectRetryAction": "重试", + "@editAccountFailureToConnectRetryAction": { + "description": "Action to retry connecting to service again." + }, + "editAccountFailureToConnectChangePasswordAction": "更改密码", + "@editAccountFailureToConnectChangePasswordAction": { + "description": "Action to change password for the service." + }, + "editAccountFailureToConnectFixedTitle": "已连接", + "@editAccountFailureToConnectFixedTitle": { + "description": "Title of dialog shown after successfully connecting a failed account again." + }, + "editAccountFailureToConnectFixedInfo": "账户已重新连接。", + "@editAccountFailureToConnectFixedInfo": { + "description": "Message of dialog shown after successfully connecting a failed account again." + }, + "editAccountIncludeInUnifiedLabel": "包含在统一账户中", + "@editAccountIncludeInUnifiedLabel": { + "description": "Label for opting this account in/out of the unified account." + }, + "editAccountAliasLabel": "{email} 的别名电子邮件地址:", + "@editAccountAliasLabel": { + "description": "Label for any alias addresses that have been specified for the given email address.", + "placeholders": { + "email": { + "type": "String", + "example": "someone@domain.com" + } + } + }, + "editAccountNoAliasesInfo": "您此账户尚无已知别名。", + "@editAccountNoAliasesInfo": { + "description": "Info when there have been no aliases specified for this account." + }, + "editAccountAliasRemoved": "{email} 别名已移除", + "@editAccountAliasRemoved": { + "description": "Info given after an alias was removed.", + "placeholders": { + "email": { + "type": "String", + "example": "someone@domain.com" + } + } + }, + "editAccountAddAliasAction": "添加别名", + "@editAccountAddAliasAction": { + "description": "Button text for adding an alias to this account." + }, + "editAccountPlusAliasesSupported": "支持 + 别名", + "@editAccountPlusAliasesSupported": { + "description": "Info shown when + aliases are supported by this account." + }, + "editAccountCheckPlusAliasAction": "测试 + 别名支持", + "@editAccountCheckPlusAliasAction": { + "description": "Button text for testing of + aliases are supported by this account." + }, + "editAccountBccMyself": "密送给自己", + "@editAccountBccMyself": { + "description": "Label of checkbox to enable the BCC-MYSELF-Feature." + }, + "editAccountBccMyselfDescriptionTitle": "密送给自己", + "@editAccountBccMyselfDescriptionTitle": { + "description": "Title of alert explaining the BCC-MYSELF-Feature." + }, + "editAccountBccMyselfDescriptionText": "您可以使用“密送给自己”功能,自动将从此账户发送的每封邮件同时发送给自己。通常不需要这样做,因为所有已发送邮件都会保存在“已发送”文件夹中。", + "@editAccountBccMyselfDescriptionText": { + "description": "Explanation of the the BCC-MYSELF-Feature." + }, + "editAccountServerSettingsAction": "编辑服务器设置", + "@editAccountServerSettingsAction": { + "description": "Button text for editing the server settings of this account." + }, + "editAccountDeleteAccountAction": "删除账户", + "@editAccountDeleteAccountAction": { + "description": "Button text for deleting this account." + }, + "editAccountDeleteAccountConfirmationTitle": "确认", + "@editAccountDeleteAccountConfirmationTitle": { + "description": "Title for confirmation dialog when deleting this account." + }, + "editAccountDeleteAccountConfirmationQuery": "您确定要删除账户 {name} 吗?", + "@editAccountDeleteAccountConfirmationQuery": { + "description": "Request to confirm when deleting this account.", + "placeholders": { + "name": { + "type": "String", + "example": "domain.com" + } + } + }, + "editAccountTestPlusAliasTitle": "{name} 的 + 别名", + "@editAccountTestPlusAliasTitle": { + "description": "Title for dialog shown while testing + alias support", + "placeholders": { + "name": { + "type": "String", + "example": "domain.com" + } + } + }, + "editAccountTestPlusAliasStepIntroductionTitle": "介绍", + "@editAccountTestPlusAliasStepIntroductionTitle": { + "description": "Title for introducing concept of + aliases." + }, + "editAccountTestPlusAliasStepIntroductionText": "您的账户 {accountName} 可能支持 {example} 这样的 + 别名。\n+ 别名可以帮助您保护身份并防止垃圾邮件。\n为了测试这一点,将向此生成的地址发送一封测试邮件。如果到达,则您的提供商支持 + 别名,您可以在撰写新邮件时轻松生成它们。", + "@editAccountTestPlusAliasStepIntroductionText": { + "description": "Text for introducing concept of + aliases.", + "placeholders": { + "accountName": { + "type": "String", + "example": "domain.com" + }, + "example": { + "type": "String", + "example": "someone+example@domain.com" + } + } + }, + "editAccountTestPlusAliasStepTestingTitle": "Testing", + "@editAccountTestPlusAliasStepTestingTitle": { + "description": "Title while testing concept of + aliases." + }, + "editAccountTestPlusAliasStepResultTitle": "Result", + "@editAccountTestPlusAliasStepResultTitle": { + "description": "Title after testing concept of + aliases." + }, + "editAccountTestPlusAliasStepResultSuccess": "Your account {name} supports + aliases.", + "@editAccountTestPlusAliasStepResultSuccess": { + "description": "Result when account supports + aliases", + "placeholders": { + "name": { + "type": "String", + "example": "domain.com" + } + } + }, + "editAccountTestPlusAliasStepResultNoSuccess": "Your account {name} does not support + aliases.", + "@editAccountTestPlusAliasStepResultNoSuccess": { + "description": "Result when account does not supports + aliases", + "placeholders": { + "name": { + "type": "String", + "example": "domain.com" + } + } + }, + "editAccountAddAliasTitle": "添加别名", + "@editAccountAddAliasTitle": { + "description": "Title when adding new alias." + }, + "editAccountEditAliasTitle": "Edit alias", + "@editAccountEditAliasTitle": { + "description": "Title when editing alias." + }, + "editAccountAliasAddAction": "Add", + "@editAccountAliasAddAction": { + "description": "Action when adding new alias." + }, + "editAccountAliasUpdateAction": "Update", + "@editAccountAliasUpdateAction": { + "description": "Action when editing alias." + }, + "editAccountEditAliasNameLabel": "Alias name", + "@editAccountEditAliasNameLabel": { + "description": "Label for alias name input field." + }, + "editAccountEditAliasEmailLabel": "Alias email", + "@editAccountEditAliasEmailLabel": { + "description": "Label for alias email input field." + }, + "editAccountEditAliasEmailHint": "Your alias email address", + "@editAccountEditAliasEmailHint": { + "description": "Hint for alias email input field." + }, + "editAccountEditAliasDuplicateError": "There is already an alias with {email}.", + "@editAccountEditAliasDuplicateError": { + "description": "Error when the alias email is already known", + "placeholders": { + "email": { + "type": "String", + "example": "you@domain.com" + } + } + }, + "editAccountEnableLogging": "Enable logging", + "@editAccountEnableLogging": { + "description": "Label developer mode option to enable logging." + }, + "editAccountLoggingEnabled": "Log enabled, please restart", + "@editAccountLoggingEnabled": { + "description": "Short message shown after the log has been enabled." + }, + "editAccountLoggingDisabled": "Log disabled, please restart", + "@editAccountLoggingDisabled": { + "description": "Short message shown after the log has been disabled." + }, + "accountDetailsFallbackTitle": "Server Settings", + "@accountDetailsFallbackTitle": { + "description": "Title shown when account name is not set." + }, + "errorTitle": "Error", + "@errorTitle": { + "description": "Title for error dialogs." + }, + "accountProviderStepTitle": "Email Service Provider", + "@accountProviderStepTitle": { + "description": "Step to select a provider." + }, + "accountProviderCustom": "Other email service", + "@accountProviderCustom": { + "description": "When no standard provider is chosen." + }, + "accountDetailsErrorHostProblem": "Maily cannot reach the specified mail server. Please check your incoming server setting \"{incomingHost}\" and your outgoing server setting \"{outgoingHost}\".", + "@accountDetailsErrorHostProblem": { + "description": "Error details when no connection to server could be established at all", + "placeholders": { + "incomingHost": { + "type": "String", + "example": "imap@domain.com" + }, + "outgoingHost": { + "type": "String", + "example": "smtp@domain.com" + } + } + }, + "accountDetailsErrorLoginProblem": "Unable to log your in. Please check your user name \"{userName}\" and your password \"{password}\".", + "@accountDetailsErrorLoginProblem": { + "description": "Error details when login fails", + "placeholders": { + "userName": { + "type": "String", + "example": "email@domain.com" + }, + "password": { + "type": "String", + "example": "secret" + } + } + }, + "accountDetailsUserNameLabel": "Login name", + "@accountDetailsUserNameLabel": { + "description": "Label for user name input field." + }, + "accountDetailsUserNameHint": "Your user name, if different from email", + "@accountDetailsUserNameHint": { + "description": "Hint for user name input field." + }, + "accountDetailsPasswordLabel": "Login password", + "@accountDetailsPasswordLabel": { + "description": "Label for password input field." + }, + "accountDetailsPasswordHint": "Your password", + "@accountDetailsPasswordHint": { + "description": "Hint for user password input field." + }, + "accountDetailsBaseSectionTitle": "Base settings", + "@accountDetailsBaseSectionTitle": { + "description": "Title of base settings section." + }, + "accountDetailsIncomingLabel": "Incoming server", + "@accountDetailsIncomingLabel": { + "description": "Label for incoming server domain field." + }, + "accountDetailsIncomingHint": "Domain like imap.domain.com", + "@accountDetailsIncomingHint": { + "description": "Hint for incoming server domain field." + }, + "accountDetailsOutgoingLabel": "Outgoing server", + "@accountDetailsOutgoingLabel": { + "description": "Label for outgoing server domain field." + }, + "accountDetailsOutgoingHint": "Domain like smtp.domain.com", + "@accountDetailsOutgoingHint": { + "description": "Hint for outgoing server domain field." + }, + "accountDetailsAdvancedIncomingSectionTitle": "Advanced incoming settings", + "@accountDetailsAdvancedIncomingSectionTitle": { + "description": "Title of incoming settings section." + }, + "accountDetailsIncomingServerTypeLabel": "Incoming type:", + "@accountDetailsIncomingServerTypeLabel": { + "description": "Label for server type dropdown." + }, + "accountDetailsOptionAutomatic": "automatic", + "@accountDetailsOptionAutomatic": { + "description": "Option when the server type/security should be discovered automatically." + }, + "accountDetailsIncomingSecurityLabel": "Incoming security:", + "@accountDetailsIncomingSecurityLabel": { + "description": "Label for server security dropdown." + }, + "accountDetailsSecurityOptionNone": "Plain (no encryption)", + "@accountDetailsSecurityOptionNone": { + "description": "Label for security dropdown option without encryption." + }, + "accountDetailsIncomingPortLabel": "Incoming port", + "@accountDetailsIncomingPortLabel": { + "description": "Label for incoming port input field." + }, + "accountDetailsPortHint": "Leave empty to determine automatically", + "@accountDetailsPortHint": { + "description": "Hint for port input fields." + }, + "accountDetailsIncomingUserNameLabel": "Incoming user name", + "@accountDetailsIncomingUserNameLabel": { + "description": "Label for incoming user name input field." + }, + "accountDetailsAlternativeUserNameHint": "Your user name, if different from above", + "@accountDetailsAlternativeUserNameHint": { + "description": "Label for alternative user name input fields." + }, + "accountDetailsIncomingPasswordLabel": "Incoming password", + "@accountDetailsIncomingPasswordLabel": { + "description": "Label for incoming password input field." + }, + "accountDetailsAlternativePasswordHint": "Your password, if different from above", + "@accountDetailsAlternativePasswordHint": { + "description": "Label for alternative user name input fields." + }, + "accountDetailsAdvancedOutgoingSectionTitle": "Advanced outgoing settings", + "@accountDetailsAdvancedOutgoingSectionTitle": { + "description": "Title of incoming settings section." + }, + "accountDetailsOutgoingServerTypeLabel": "Outgoing type:", + "@accountDetailsOutgoingServerTypeLabel": { + "description": "Label for server type dropdown." + }, + "accountDetailsOutgoingSecurityLabel": "Outgoing security:", + "@accountDetailsOutgoingSecurityLabel": { + "description": "Label for server security dropdown." + }, + "accountDetailsOutgoingPortLabel": "Outgoing port", + "@accountDetailsOutgoingPortLabel": { + "description": "Label for outgoing port input field." + }, + "accountDetailsOutgoingUserNameLabel": "Outgoing user name", + "@accountDetailsOutgoingUserNameLabel": { + "description": "Label for outgoing user name input field." + }, + "accountDetailsOutgoingPasswordLabel": "Outgoing password", + "@accountDetailsOutgoingPasswordLabel": { + "description": "Label for outgoing password input field." + }, + "composeTitleNew": "新建邮件", + "@composeTitleNew": { + "description": "Title for compose screen when a new message is created." + }, + "composeTitleForward": "转发", + "@composeTitleForward": { + "description": "Title for compose screen when a message is forwarded." + }, + "composeTitleReply": "回复", + "@composeTitleReply": { + "description": "Title for compose screen when a message is replied." + }, + "composeEmptyMessage": "empty message", + "@composeEmptyMessage": { + "description": "Message text for message without text." + }, + "composeWarningNoSubject": "You have not specified a subject. Do you want to sent the message without a subject?", + "@composeWarningNoSubject": { + "description": "Warning shown when trying to send a message without subject." + }, + "composeActionSentWithoutSubject": "Send", + "@composeActionSentWithoutSubject": { + "description": "Action to send message without subject." + }, + "composeMailSendSuccess": "Mail sent 😊", + "@composeMailSendSuccess": { + "description": "Notification shown after a mail was sent successfully." + }, + "composeSendErrorInfo": "Sorry, your mail could not be send. We received the following error:\n{details}.", + "@composeSendErrorInfo": { + "description": "Error shown when email could not be send", + "placeholders": { + "details": { + "type": "String", + "example": "554-Reject due to policy restrictions." + } + } + }, + "composeRequestReadReceiptAction": "Request read receipt", + "@composeRequestReadReceiptAction": { + "description": "Action to request a read receipt for this message" + }, + "composeSaveDraftAction": "Save as draft", + "@composeSaveDraftAction": { + "description": "Action to save a message as draft" + }, + "composeMessageSavedAsDraft": "Draft saved", + "@composeMessageSavedAsDraft": { + "description": "Info shown when message was saved as draft successfully" + }, + "composeMessageSavedAsDraftErrorInfo": "Your draft could not be saved with the following error:\n{details}", + "@composeMessageSavedAsDraftErrorInfo": { + "description": "Info shown when message could not be saved as a draft", + "placeholders": { + "details": { + "type": "String", + "example": "Invalid header: XX" + } + } + }, + "composeConvertToPlainTextEditorAction": "Convert to plain text", + "@composeConvertToPlainTextEditorAction": { + "description": "Action to write a plain text message instead of an html message" + }, + "composeConvertToHtmlEditorAction": "Convert to rich message (HTML)", + "@composeConvertToHtmlEditorAction": { + "description": "Action to write a HTML message instead of a text message" + }, + "composeContinueEditingAction": "Continue editing", + "@composeContinueEditingAction": { + "description": "Action to return to compose screen when draft cannot be saved" + }, + "composeCreatePlusAliasAction": "Create new + alias...", + "@composeCreatePlusAliasAction": { + "description": "Action to create a new + alias as a sender" + }, + "composeSenderHint": "Sender", + "@composeSenderHint": { + "description": "Hint for From input field" + }, + "composeRecipientHint": "Recipient email", + "@composeRecipientHint": { + "description": "Hint for To input field" + }, + "composeSubjectLabel": "Subject", + "@composeSubjectLabel": { + "description": "Label for Subject input field" + }, + "composeSubjectHint": "Message subject", + "@composeSubjectHint": { + "description": "Hint for Subject input field" + }, + "composeAddAttachmentAction": "Add", + "@composeAddAttachmentAction": { + "description": "Action to add an attachment - should be short!" + }, + "composeRemoveAttachmentAction": "Remove {name}", + "@composeRemoveAttachmentAction": { + "description": "Action to remove an attachment", + "placeholders": { + "name": { + "type": "String", + "example": "funny.png" + } + } + }, + "composeLeftByMistake": "Left by mistake?", + "@composeLeftByMistake": { + "description": "Info shown after leaving compose screen to allow an easy return" + }, + "attachTypeFile": "File", + "@attachTypeFile": { + "description": "Attachment type to add" + }, + "attachTypePhoto": "Photo", + "@attachTypePhoto": { + "description": "Attachment type to add" + }, + "attachTypeVideo": "Video", + "@attachTypeVideo": { + "description": "Attachment type to add" + }, + "attachTypeAudio": "Audio", + "@attachTypeAudio": { + "description": "Attachment type to add" + }, + "attachTypeLocation": "Location", + "@attachTypeLocation": { + "description": "Attachment type to add" + }, + "attachTypeGif": "Animated Gif", + "@attachTypeGif": { + "description": "Attachment type to add" + }, + "attachTypeGifSearch": "search GIPHY", + "@attachTypeGifSearch": { + "description": "Text for searching in GIPHY service for GIF" + }, + "attachTypeSticker": "Sticker", + "@attachTypeSticker": { + "description": "Attachment type to add" + }, + "attachTypeStickerSearch": "search GIPHY", + "@attachTypeStickerSearch": { + "description": "Text for searching in GIPHY service for sticker" + }, + "attachTypeAppointment": "Appointment", + "@attachTypeAppointment": { + "description": "Attachment type to add" + }, + "languageSettingTitle": "Language", + "@languageSettingTitle": { + "description": "Title of language setting screen" + }, + "languageSettingLabel": "Choose the language for Maily:", + "@languageSettingLabel": { + "description": "Label for language setting dropdown screen" + }, + "languageSettingSystemOption": "System language", + "@languageSettingSystemOption": { + "description": "Option to use the system's settings" + }, + "languageSettingConfirmationTitle": "Use English for Maily?", + "@languageSettingConfirmationTitle": { + "description": "Title of dialog to confirm when switching the language" + }, + "languageSettingConfirmationQuery": "Please confirm to use English as your chosen language.", + "@languageSettingConfirmationQuery": { + "description": "Query to be confirmed by user when switching the language" + }, + "languageSetInfo": "Maily is now shown in English.", + "@languageSetInfo": { + "description": "Info text after having specified the language." + }, + "languageSystemSetInfo": "Maily will now use the system's language or English if the system's language is not supported.", + "@languageSystemSetInfo": { + "description": "Info text after choosing the system's language for Maily." + }, + "swipeSettingTitle": "Swipe gestures", + "@swipeSettingTitle": { + "description": "Title of swipe setting screen" + }, + "swipeSettingLeftToRightLabel": "Left to right swipe", + "@swipeSettingLeftToRightLabel": { + "description": "Label for swipe gesture" + }, + "swipeSettingRightToLeftLabel": "Right to left swipe", + "@swipeSettingRightToLeftLabel": { + "description": "Label for swipe gesture" + }, + "swipeSettingChangeAction": "Change", + "@swipeSettingChangeAction": { + "description": "Action for changing a swipe gesture" + }, + "signatureSettingsTitle": "Signature", + "@signatureSettingsTitle": { + "description": "Title of signature setting screen" + }, + "signatureSettingsComposeActionsInfo": "Enable the signature for the following messages:", + "@signatureSettingsComposeActionsInfo": { + "description": "Text before selecting message types for a signature (new, forward, reply)." + }, + "signatureSettingsAccountInfo": "You can specify account specific signatures in the account settings.", + "@signatureSettingsAccountInfo": { + "description": "Informational text before showing link to account settings." + }, + "signatureSettingsAddForAccount": "Add signature for {account}", + "@signatureSettingsAddForAccount": { + "description": "Action to add account specific signature.", + "placeholders": { + "account": { + "type": "String", + "example": "domain.com" + } + } + }, + "defaultSenderSettingsTitle": "Default sender", + "@defaultSenderSettingsTitle": { + "description": "Title of default sender setting screen" + }, + "defaultSenderSettingsLabel": "Select the sender for new messages.", + "@defaultSenderSettingsLabel": { + "description": "Description of default sender setting screen" + }, + "defaultSenderSettingsFirstAccount": "First account ({email})", + "@defaultSenderSettingsFirstAccount": { + "description": "The default sender is the one from the first account", + "placeholders": { + "email": { + "type": "String", + "example": "email@domain.com" + } + } + }, + "defaultSenderSettingsAliasInfo": "You can set up email alias addresses in the [AS].", + "@defaultSenderSettingsAliasInfo": { + "description": "Info about that email aliases can be set up in the account settings. [AS] is the place, where defaultSenderSettingsAliasAccountSettings is included as a link." + }, + "defaultSenderSettingsAliasAccountSettings": "account settings", + "@defaultSenderSettingsAliasAccountSettings": { + "description": "Text of the account settings link." + }, + "replySettingsTitle": "Message format", + "@replySettingsTitle": { + "description": "Reply settings title." + }, + "replySettingsIntro": "In what format do you want to answer or forward email by default?", + "@replySettingsIntro": { + "description": "Reply settings introduction text." + }, + "replySettingsFormatHtml": "Always rich format (HTML)", + "@replySettingsFormatHtml": { + "description": "Reply settings option." + }, + "replySettingsFormatSameAsOriginal": "Use same format as originating email", + "@replySettingsFormatSameAsOriginal": { + "description": "Reply settings option." + }, + "replySettingsFormatPlainText": "Always text-only", + "@replySettingsFormatPlainText": { + "description": "Reply settings option." + }, + "moveTitle": "Move message", + "@moveTitle": { + "description": "Title of move to mailbox dialog." + }, + "moveSuccess": "Messaged moved to {mailbox}.", + "@moveSuccess": { + "description": "Message after moving message successfully.", + "placeholders": { + "mailbox": { + "type": "String", + "example": "Inbox" + } + } + }, + "editorArtInputLabel": "Your input", + "@editorArtInputLabel": { + "description": "Label of input field when inserting a formatted text" + }, + "editorArtInputHint": "Enter text here", + "@editorArtInputHint": { + "description": "Hint of input field when inserting a formatted text" + }, + "editorArtWaitingForInputHint": "waiting for input...", + "@editorArtWaitingForInputHint": { + "description": "Text shown while waiting for input" + }, + "fontSerifBold": "Serif bold", + "@fontSerifBold": { + "description": "Font name" + }, + "fontSerifItalic": "Serif italic", + "@fontSerifItalic": { + "description": "Font name" + }, + "fontSerifBoldItalic": "Serif bold italic", + "@fontSerifBoldItalic": { + "description": "Font name" + }, + "fontSans": "Sans", + "@fontSans": { + "description": "Font name" + }, + "fontSansBold": "Sans bold", + "@fontSansBold": { + "description": "Font name" + }, + "fontSansItalic": "Sans italic", + "@fontSansItalic": { + "description": "Font name" + }, + "fontSansBoldItalic": "Sans bold italic", + "@fontSansBoldItalic": { + "description": "Font name" + }, + "fontScript": "Script", + "@fontScript": { + "description": "Font name" + }, + "fontScriptBold": "Script bold", + "@fontScriptBold": { + "description": "Font name" + }, + "fontFraktur": "Fraktur", + "@fontFraktur": { + "description": "Font name" + }, + "fontFrakturBold": "Fraktur bold", + "@fontFrakturBold": { + "description": "Font name" + }, + "fontMonospace": "Monospace", + "@fontMonospace": { + "description": "Font name" + }, + "fontFullwidth": "Fullwidth", + "@fontFullwidth": { + "description": "Font name" + }, + "fontDoublestruck": "Double struck", + "@fontDoublestruck": { + "description": "Font name" + }, + "fontCapitalized": "Capitalized", + "@fontCapitalized": { + "description": "Font name" + }, + "fontCircled": "Circled", + "@fontCircled": { + "description": "Font name" + }, + "fontParenthesized": "Parenthesized", + "@fontParenthesized": { + "description": "Font name" + }, + "fontUnderlinedSingle": "Underlined", + "@fontUnderlinedSingle": { + "description": "Font name" + }, + "fontUnderlinedDouble": "Underlined double", + "@fontUnderlinedDouble": { + "description": "Font name" + }, + "fontStrikethroughSingle": "Strike through", + "@fontStrikethroughSingle": { + "description": "Font name" + }, + "fontCrosshatch": "Crosshatch", + "@fontCrosshatch": { + "description": "Font name" + }, + "accountLoadError": "Unable to connect to your account {name}. Has the password been changed?", + "@accountLoadError": { + "description": "Message shown when single account could not be loaded.", + "placeholders": { + "name": { + "type": "String", + "example": "domain.com" + } + } + }, + "accountLoadErrorEditAction": "Edit account", + "@accountLoadErrorEditAction": { + "description": "Action to edit account" + }, + "extensionsTitle": "Extensions", + "@extensionsTitle": { + "description": "Title of extension section within the development settings" + }, + "extensionsIntro": "With extensions e-mail service providers, companies and developers can adapt Maily with useful functionalities.", + "@extensionsIntro": { + "description": "Explanation of extensions" + }, + "extensionsLearnMoreAction": "Learn more about extensions", + "@extensionsLearnMoreAction": { + "description": "Label for launching a website with more information" + }, + "extensionsReloadAction": "Reload extensions", + "@extensionsReloadAction": { + "description": "Action to refresh extensions" + }, + "extensionDeactivateAllAction": "Deactivate all extensions", + "@extensionDeactivateAllAction": { + "description": "Action to deactivate / unload any extension" + }, + "extensionsManualAction": "Load manually", + "@extensionsManualAction": { + "description": "Action to load extension manually" + }, + "extensionsManualUrlLabel": "Url of extension", + "@extensionsManualUrlLabel": { + "description": "Label for URL input field" + }, + "extensionsManualLoadingError": "Unable to download extension from \"{url}\".", + "@extensionsManualLoadingError": { + "description": "Message shown when extensions could not be loaded.", + "placeholders": { + "url": { + "type": "String", + "example": "https://domain.com/.maily.json" + } + } + }, + "icalendarAcceptTentatively": "Tentatively", + "@icalendarAcceptTentatively": { + "description": "Action to accept an icalendar invitation tentatively" + }, + "icalendarActionChangeParticipantStatus": "Change", + "@icalendarActionChangeParticipantStatus": { + "description": "Action to change an icalendar invitation participant status" + }, + "icalendarLabelSummary": "Title", + "@icalendarLabelSummary": { + "description": "Label of the summary info of an icalendar object" + }, + "icalendarNoSummaryInfo": "(no title)", + "@icalendarNoSummaryInfo": { + "description": "Info shown when the icalendar object has no summary (no title)" + }, + "icalendarLabelDescription": "Description", + "@icalendarLabelDescription": { + "description": "Label of the description info of an icalendar object" + }, + "icalendarLabelStart": "Start", + "@icalendarLabelStart": { + "description": "Label of the start datetime info of an icalendar object" + }, + "icalendarLabelEnd": "End", + "@icalendarLabelEnd": { + "description": "Label of the end datetime info of an icalendar object" + }, + "icalendarLabelDuration": "Duration", + "@icalendarLabelDuration": { + "description": "Label of the duration info of an icalendar object" + }, + "icalendarLabelLocation": "Location", + "@icalendarLabelLocation": { + "description": "Label of the location info of an icalendar object" + }, + "icalendarLabelTeamsUrl": "Link", + "@icalendarLabelTeamsUrl": { + "description": "Label of the ms teams url info of an icalendar object" + }, + "icalendarLabelRecurrenceRule": "Repeats", + "@icalendarLabelRecurrenceRule": { + "description": "Label of the recurrence info of an icalendar object" + }, + "icalendarLabelParticipants": "Participants", + "@icalendarLabelParticipants": { + "description": "Label of the participants info of an icalendar object" + }, + "icalendarParticipantStatusNeedsAction": "You are asked to answer this invitation.", + "@icalendarParticipantStatusNeedsAction": { + "description": "Participant status of the current user for a icalendar object" + }, + "icalendarParticipantStatusAccepted": "You have accepted this invitation.", + "@icalendarParticipantStatusAccepted": { + "description": "Participant status of the current user for a icalendar object" + }, + "icalendarParticipantStatusDeclined": "You have declined this invitation.", + "@icalendarParticipantStatusDeclined": { + "description": "Participant status of the current user for a icalendar object" + }, + "icalendarParticipantStatusAcceptedTentatively": "You have tentatively accepted this invitation.", + "@icalendarParticipantStatusAcceptedTentatively": { + "description": "Participant status of the current user for a icalendar object" + }, + "icalendarParticipantStatusDelegated": "You have delegated this invitation.", + "@icalendarParticipantStatusDelegated": { + "description": "Participant status of the current user for a icalendar object" + }, + "icalendarParticipantStatusInProcess": "The task is in progress.", + "@icalendarParticipantStatusInProcess": { + "description": "Participant status of the current user for a icalendar object" + }, + "icalendarParticipantStatusPartial": "The task is partially done.", + "@icalendarParticipantStatusPartial": { + "description": "Participant status of the current user for a icalendar object" + }, + "icalendarParticipantStatusCompleted": "The task is done.", + "@icalendarParticipantStatusCompleted": { + "description": "Participant status of the current user for a icalendar object" + }, + "icalendarParticipantStatusOther": "Your status is unknown.", + "@icalendarParticipantStatusOther": { + "description": "Participant status of the current user for a icalendar object" + }, + "icalendarParticipantStatusChangeTitle": "Your Status", + "@icalendarParticipantStatusChangeTitle": { + "description": "Title for dialog to change participant status" + }, + "icalendarParticipantStatusChangeText": "Do you want to accept this invitation?", + "@icalendarParticipantStatusChangeText": { + "description": "Text of dialog to change participant status" + }, + "icalendarParticipantStatusSentFailure": "Unable to send reply.\nThe server responded with the following details:\n{details}", + "@icalendarParticipantStatusSentFailure": { + "description": "Failure message for a status change reply", + "placeholders": { + "details": { + "type": "String", + "example": "No internet connection" + } + } + }, + "icalendarExportAction": "Export", + "@icalendarExportAction": { + "description": "Action to export the invite to the native calendar" + }, + "icalendarReplyStatusNeedsAction": "{attendee} has not answered this invitation.", + "@icalendarReplyStatusNeedsAction": { + "description": "Valid Calendar reply", + "placeholders": { + "attendee": { + "type": "String", + "example": "User Name " + } + } + }, + "icalendarReplyStatusAccepted": "{attendee} has accepted the appointment.", + "@icalendarReplyStatusAccepted": { + "description": "Valid Calendar reply", + "placeholders": { + "attendee": { + "type": "String", + "example": "User Name " + } + } + }, + "icalendarReplyStatusDeclined": "{attendee} has declined this invitation.", + "@icalendarReplyStatusDeclined": { + "description": "Valid Calendar reply", + "placeholders": { + "attendee": { + "type": "String", + "example": "User Name " + } + } + }, + "icalendarReplyStatusAcceptedTentatively": "{attendee} has tentatively accepted this invitation.", + "@icalendarReplyStatusAcceptedTentatively": { + "description": "Valid Calendar reply", + "placeholders": { + "attendee": { + "type": "String", + "example": "User Name " + } + } + }, + "icalendarReplyStatusDelegated": "{attendee} has delegated this invitation.", + "@icalendarReplyStatusDelegated": { + "description": "Valid Calendar reply", + "placeholders": { + "attendee": { + "type": "String", + "example": "User Name " + } + } + }, + "icalendarReplyStatusInProcess": "{attendee} has started this task.", + "@icalendarReplyStatusInProcess": { + "description": "Valid Calendar reply", + "placeholders": { + "attendee": { + "type": "String", + "example": "User Name " + } + } + }, + "icalendarReplyStatusPartial": "{attendee} has partially done this task.", + "@icalendarReplyStatusPartial": { + "description": "Valid Calendar reply", + "placeholders": { + "attendee": { + "type": "String", + "example": "User Name " + } + } + }, + "icalendarReplyStatusCompleted": "{attendee} has finished this task.", + "@icalendarReplyStatusCompleted": { + "description": "Valid Calendar reply", + "placeholders": { + "attendee": { + "type": "String", + "example": "User Name " + } + } + }, + "icalendarReplyStatusOther": "{attendee} has answered with an unknown status.", + "@icalendarReplyStatusOther": { + "description": "Valid Calendar reply", + "placeholders": { + "attendee": { + "type": "String", + "example": "User Name " + } + } + }, + "icalendarReplyWithoutParticipants": "This calendar reply contains no participants.", + "@icalendarReplyWithoutParticipants": { + "description": "Calendar reply without any participant" + }, + "icalendarReplyWithoutStatus": "{attendee} replied without an participation status.", + "@icalendarReplyWithoutStatus": { + "description": "Calendar reply without any participant status", + "placeholders": { + "attendee": { + "type": "String", + "example": "User Name " + } + } + }, + "composeAppointmentTitle": "Create Appointment", + "@composeAppointmentTitle": { + "description": "Title for adding a new appointment screen" + }, + "composeAppointmentLabelDay": "day", + "@composeAppointmentLabelDay": { + "description": "Label for select day button" + }, + "composeAppointmentLabelTime": "time", + "@composeAppointmentLabelTime": { + "description": "Label for select time button" + }, + "composeAppointmentLabelAllDayEvent": "All day", + "@composeAppointmentLabelAllDayEvent": { + "description": "Label for is all day toggle" + }, + "composeAppointmentLabelRepeat": "Repeat", + "@composeAppointmentLabelRepeat": { + "description": "Label for repeat drop-down" + }, + "composeAppointmentLabelRepeatOptionNever": "从不", + "@composeAppointmentLabelRepeatOptionNever": { + "description": "Option for repeat drop-down" + }, + "composeAppointmentLabelRepeatOptionDaily": "Daily", + "@composeAppointmentLabelRepeatOptionDaily": { + "description": "Option for repeat drop-down" + }, + "composeAppointmentLabelRepeatOptionWeekly": "Weekly", + "@composeAppointmentLabelRepeatOptionWeekly": { + "description": "Option for repeat drop-down" + }, + "composeAppointmentLabelRepeatOptionMonthly": "Monthly", + "@composeAppointmentLabelRepeatOptionMonthly": { + "description": "Option for repeat drop-down" + }, + "composeAppointmentLabelRepeatOptionYearly": "Annually", + "@composeAppointmentLabelRepeatOptionYearly": { + "description": "Option for repeat drop-down" + }, + "composeAppointmentRecurrenceFrequencyLabel": "Frequency", + "@composeAppointmentRecurrenceFrequencyLabel": { + "description": "Label for frequency drop-down" + }, + "composeAppointmentRecurrenceIntervalLabel": "Interval", + "@composeAppointmentRecurrenceIntervalLabel": { + "description": "Label for interval drop-down" + }, + "composeAppointmentRecurrenceDaysLabel": "On days", + "@composeAppointmentRecurrenceDaysLabel": { + "description": "Label for days selection area in a weekly or monthly recurrence" + }, + "composeAppointmentRecurrenceUntilLabel": "Until", + "@composeAppointmentRecurrenceUntilLabel": { + "description": "Label for choosing end date of recurrence" + }, + "composeAppointmentRecurrenceUntilOptionUnlimited": "Unlimited", + "@composeAppointmentRecurrenceUntilOptionUnlimited": { + "description": "Option for no end date of recurrence" + }, + "composeAppointmentRecurrenceUntilOptionRecommended": "Recommended ({duration})", + "@composeAppointmentRecurrenceUntilOptionRecommended": { + "description": "Option for standard end date of recurrence with the given duration", + "placeholders": { + "duration": { + "type": "String", + "example": "3 months" + } + } + }, + "composeAppointmentRecurrenceUntilOptionSpecificDate": "Until chosen date", + "@composeAppointmentRecurrenceUntilOptionSpecificDate": { + "description": "Option for specific end date of recurrence" + }, + "composeAppointmentRecurrenceMonthlyOnDayOfMonth": "On the {day}. day of the month", + "@composeAppointmentRecurrenceMonthlyOnDayOfMonth": { + "description": "Option for repeating an event always on that day of the month", + "placeholders": { + "day": { + "type": "int", + "example": "3", + "format": "compactLong" + } + } + }, + "composeAppointmentRecurrenceMonthlyOnWeekDay": "Weekday in month", + "@composeAppointmentRecurrenceMonthlyOnWeekDay": { + "description": "Monthly repeat on weekday of a chosen week" + }, + "composeAppointmentRecurrenceFirst": "First", + "@composeAppointmentRecurrenceFirst": { + "description": "Monthly day option" + }, + "composeAppointmentRecurrenceSecond": "Second", + "@composeAppointmentRecurrenceSecond": { + "description": "Monthly day option" + }, + "composeAppointmentRecurrenceThird": "Third", + "@composeAppointmentRecurrenceThird": { + "description": "Monthly day option" + }, + "composeAppointmentRecurrenceLast": "Last", + "@composeAppointmentRecurrenceLast": { + "description": "Monthly day option" + }, + "composeAppointmentRecurrenceSecondLast": "Second-last", + "@composeAppointmentRecurrenceSecondLast": { + "description": "Monthly day option" + }, + "durationYears": "{number,plural, =1{1 year} other{{number} years}}", + "@durationYears": { + "description": "Duration. Message formatted using the plural JSON scheme.", + "placeholders": { + "number": { + "type": "int", + "example": "2", + "format": "compactLong" + } + } + }, + "durationMonths": "{number,plural, =1{1 month} other{{number} months}}", + "@durationMonths": { + "description": "Duration. Message formatted using the plural JSON scheme.", + "placeholders": { + "number": { + "type": "int", + "example": "2", + "format": "compactLong" + } + } + }, + "durationWeeks": "{number,plural, =1{1 week} other{{number} weeks}}", + "@durationWeeks": { + "description": "Duration. Message formatted using the plural JSON scheme.", + "placeholders": { + "number": { + "type": "int", + "example": "2", + "format": "compactLong" + } + } + }, + "durationDays": "{number,plural, =1{1 day} other{{number} days}}", + "@durationDays": { + "description": "Duration. Message formatted using the plural JSON scheme.", + "placeholders": { + "number": { + "type": "int", + "example": "2", + "format": "compactLong" + } + } + }, + "durationHours": "{number,plural, =1{1 hour} other{{number} hours}}", + "@durationHours": { + "description": "Duration. Message formatted using the plural JSON scheme.", + "placeholders": { + "number": { + "type": "int", + "example": "2", + "format": "compactLong" + } + } + }, + "durationMinutes": "{number,plural, =1{1 minute} other{{number} minutes}}", + "@durationMinutes": { + "description": "Duration. Message formatted using the plural JSON scheme.", + "placeholders": { + "number": { + "type": "int", + "example": "2", + "format": "compactLong" + } + } + }, + "durationEmpty": "No duration", + "@durationEmpty": { + "description": "Text shown when the duration is 0" + } +} \ No newline at end of file diff --git a/lib/src/settings/view/settings_language_screen.dart b/lib/src/settings/view/settings_language_screen.dart index 7318fa2..7e658e5 100644 --- a/lib/src/settings/view/settings_language_screen.dart +++ b/lib/src/settings/view/settings_language_screen.dart @@ -20,6 +20,7 @@ class SettingsLanguageScreen extends HookConsumerWidget { 'de': 'deutsch', 'en': 'English', 'es': 'español', + 'zh': '简体中文', }; final available = AppLocalizations.supportedLocales .map( diff --git a/pubspec.yaml b/pubspec.yaml index 35633cd..502a1dc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -178,7 +178,7 @@ flutter: uses-material-design: true # For localization / l10n: - generate: false + generate: true # To add assets to your application, add an assets section, like this: assets: