diff --git a/assets/l10n/app_de.arb b/assets/l10n/app_de.arb
index b69742ffcc..febca32254 100644
--- a/assets/l10n/app_de.arb
+++ b/assets/l10n/app_de.arb
@@ -107,6 +107,9 @@
"@actionSheetReadReceiptsZeroReadCount": {
"description": "Label in the \"Read receipts\" bottom sheet when no one has read the message."
},
+ "@allChannelsEmptyPlaceholderHeader": {
+ "description": "Centered text on the 'All channels' page saying that there is no content to show."
+ },
"@allChannelsPageTitle": {
"description": "Title for the 'All channels' page."
},
@@ -116,6 +119,18 @@
"@channelFeedButtonTooltip": {
"description": "Tooltip for button to navigate to a given channel's feed"
},
+ "@channelsEmptyPlaceholderHeader": {
+ "description": "Centered text on the 'Channels' page saying that there is no content to show."
+ },
+ "@channelsEmptyPlaceholderMessage": {
+ "description": "Centered text on the 'Channels' page saying that there is no content to show, with a link to 'All channels'.",
+ "placeholders": {
+ "allChannelsPageTitle": {
+ "example": "All channels",
+ "type": "String"
+ }
+ }
+ },
"@channelsPageTitle": {
"description": "Title for the page with a list of subscribed channels."
},
@@ -337,6 +352,9 @@
"@errorCopyingFailed": {
"description": "Error message when copying the text of a message to the user's system clipboard failed."
},
+ "@errorCouldNotAccessUploadedFileTitle": {
+ "description": "Error title on failure in opening a file someone previously uploaded to Zulip"
+ },
"@errorCouldNotConnectTitle": {
"description": "Error title when the app could not connect to the server."
},
@@ -606,6 +624,12 @@
}
}
},
+ "@inboxEmptyPlaceholderHeader": {
+ "description": "Centered text on the 'Inbox' page saying that there is no content to show."
+ },
+ "@inboxEmptyPlaceholderMessage": {
+ "description": "Additional centered text on the 'Inbox' page saying that there is no content to show."
+ },
"@inboxPageTitle": {
"description": "Title for the page with unreads."
},
@@ -878,6 +902,12 @@
"@reactionChipsLabel": {
"description": "Text identifying the container of reaction chips on a message. (An accessibility label for assistive technology.)"
},
+ "@recentDmConversationsEmptyPlaceholderHeader": {
+ "description": "Centered text on the 'Direct messages' page saying that there is no content to show."
+ },
+ "@recentDmConversationsEmptyPlaceholderMessage": {
+ "description": "Additional centered text on the 'Direct messages' page saying that there is no content to show."
+ },
"@recentDmConversationsPageTitle": {
"description": "Title for the page with a list of DM conversations."
},
@@ -1267,9 +1297,12 @@
"actionSheetReadReceiptsErrorReadCount": "Laden von Empfangsbestätigungen fehlgeschlagen.",
"actionSheetReadReceiptsReadCount": "{count, plural, =1{Diese Nachricht wurde von einer Person gelesen:} other{Diese Nachricht wurde von {count} Personen gelesen:}}",
"actionSheetReadReceiptsZeroReadCount": "Niemand hat diese Nachricht bisher gelesen.",
+ "allChannelsEmptyPlaceholderHeader": "Es gibt keine Kanäle, die du in dieser Organisation anzeigen könntest.",
"allChannelsPageTitle": "Alle Kanäle",
"appVersionUnknownPlaceholder": "(…)",
"channelFeedButtonTooltip": "Kanal-Feed",
+ "channelsEmptyPlaceholderHeader": "Du hast noch keine Kanäle abonniert.",
+ "channelsEmptyPlaceholderMessage": "Versuche, nach {allChannelsPageTitle} zu gehen und einigen davon beizutreten.",
"channelsPageTitle": "Kanäle",
"chooseAccountButtonAddAnAccount": "Account hinzufügen",
"chooseAccountPageLogOutButton": "Abmelden",
@@ -1325,6 +1358,7 @@
"errorContentNotInsertedTitle": "Inhalt nicht eingefügt",
"errorContentToInsertIsEmpty": "Die einzufügende Datei ist leer oder kann nicht geöffnet werden.",
"errorCopyingFailed": "Kopieren fehlgeschlagen",
+ "errorCouldNotAccessUploadedFileTitle": "Konnte nicht auf die hochgeladene Datei zugreifen",
"errorCouldNotConnectTitle": "Konnte nicht verbinden",
"errorCouldNotEditMessageTitle": "Konnte Nachricht nicht bearbeiten",
"errorCouldNotFetchMessageSource": "Konnte Nachrichtenquelle nicht abrufen.",
@@ -1378,6 +1412,8 @@
"experimentalFeatureSettingsPageTitle": "Experimentelle Funktionen",
"experimentalFeatureSettingsWarning": "Diese Optionen aktivieren Funktionen, die noch in Entwicklung und nicht bereit sind. Sie funktionieren möglicherweise nicht und können Problem in anderen Bereichen der App verursachen.\n\nDer Zweck dieser Einstellungen ist das Experimentieren der Leute, die an der Entwicklung von Zulip arbeiten.",
"filenameAndSizeInMiB": "{filename}: {size} MiB",
+ "inboxEmptyPlaceholderHeader": "Es gibt keine ungelesenen Nachrichten in deinem Posteingang.",
+ "inboxEmptyPlaceholderMessage": "Nutze die Buttons unten, um den kombinierten Feed oder die Liste der Kanäle anzuzeigen.",
"inboxPageTitle": "Eingang",
"initialAnchorSettingDescription": "Du kannst auswählen ob Nachrichten-Feeds bei deiner ersten ungelesenen oder bei den neuesten Nachrichten geöffnet werden.",
"initialAnchorSettingFirstUnreadAlways": "Erste ungelesene Nachricht",
@@ -1450,6 +1486,8 @@
"reactionChipLabel": "{emojiName}: {votes}",
"reactionChipVotesYouAndOthers": "{otherUsersCount, plural, =1{Du und ein weiterer} other{Du und {otherUsersCount} weitere}}",
"reactionChipsLabel": "Reaktionen",
+ "recentDmConversationsEmptyPlaceholderHeader": "Du hast noch keine Direktnachrichten!",
+ "recentDmConversationsEmptyPlaceholderMessage": "Warum beginnst du nicht einfach eine Unterhaltung?",
"recentDmConversationsPageTitle": "Direktnachrichten",
"recentDmConversationsSectionHeader": "Direktnachrichten",
"revealButtonLabel": "Nachricht anzeigen",
@@ -1492,7 +1530,7 @@
"themeSettingTitle": "THEMA",
"today": "Heute",
"topicValidationErrorMandatoryButEmpty": "Themen sind in dieser Organisation erforderlich.",
- "topicValidationErrorTooLong": "Länge des Themas sollte 60 Zeichen nicht überschreiten.",
+ "topicValidationErrorTooLong": "Länge des Themas sollte {maxLength, plural, =1{1 Zeichen} other{{maxLength} Zeichen}} nicht überschreiten.",
"topicsButtonTooltip": "Themen",
"tryAnotherAccountButton": "Anderen Account ausprobieren",
"tryAnotherAccountMessage": "Dein Account bei {url} benötigt einige Zeit zum Laden.",
diff --git a/assets/l10n/app_fr.arb b/assets/l10n/app_fr.arb
index 5a45f6081c..420e9a8036 100644
--- a/assets/l10n/app_fr.arb
+++ b/assets/l10n/app_fr.arb
@@ -65,6 +65,9 @@
"@actionSheetOptionStarMessage": {
"description": "Label for star button on action sheet."
},
+ "@actionSheetOptionSubscribe": {
+ "description": "Label in the channel action sheet for subscribing to the channel."
+ },
"@actionSheetOptionUnfollowTopic": {
"description": "Label for unfollowing a topic on action sheet."
},
@@ -98,6 +101,9 @@
"@actionSheetReadReceiptsZeroReadCount": {
"description": "Label in the \"Read receipts\" bottom sheet when no one has read the message."
},
+ "@allChannelsEmptyPlaceholderHeader": {
+ "description": "Centered text on the 'All channels' page saying that there is no content to show."
+ },
"@channelFeedButtonTooltip": {
"description": "Tooltip for button to navigate to a given channel's feed"
},
@@ -122,9 +128,18 @@
"@composeBoxBannerButtonSave": {
"description": "Label text for the 'Save' button in the compose-box banner when you are editing a message."
},
+ "@composeBoxBannerButtonSubscribe": {
+ "description": "Label text for the 'Subscribe' button in the compose-box banner when you are viewing an unsubscribed channel."
+ },
"@composeBoxBannerLabelEditMessage": {
"description": "Label text for the compose-box banner when you are editing a message."
},
+ "@composeBoxSendTooltip": {
+ "description": "Tooltip for send button in compose box."
+ },
+ "@composeBoxTopicHintText": {
+ "description": "Hint text for topic input widget in compose box."
+ },
"@deleteMessageConfirmationDialogConfirmButton": {
"description": "Label for the 'Delete' button on a confirmation dialog for deleting a message."
},
@@ -366,6 +381,9 @@
"@mentionsPageTitle": {
"description": "Page title for the 'Mentions' message view."
},
+ "@newDmSheetComposeButtonLabel": {
+ "description": "Label for the compose button in the new DM sheet that starts composing a message to the selected users."
+ },
"@noStatusText": {
"description": "The text part of the status button sub-label in self-user profile page when status text is not set."
},
@@ -555,6 +573,9 @@
}
}
},
+ "@unknownUserName": {
+ "description": "Name placeholder to use for a user when we don't know their name."
+ },
"@unpinnedSubscriptionsLabel": {
"description": "Label for the list of unpinned subscribed channels."
},
@@ -637,6 +658,7 @@
"actionSheetOptionSeeWhoReacted": "Voir qui a réagi",
"actionSheetOptionShare": "Partager",
"actionSheetOptionStarMessage": "Mettre le message en favori",
+ "actionSheetOptionSubscribe": "S'abonner",
"actionSheetOptionUnfollowTopic": "Ne plus suivre le sujet",
"actionSheetOptionUnmuteTopic": "Rendre le sujet non silencieux",
"actionSheetOptionUnresolveTopic": "Marquer comme non résolu",
@@ -646,6 +668,7 @@
"actionSheetReadReceiptsErrorReadCount": "Échec du chargement des accusés de réception.",
"actionSheetReadReceiptsReadCount": "{count, plural, =1{Ce message a été lu par {count} personne:} other{Ce message a été lu par {count} personnes :}}",
"actionSheetReadReceiptsZeroReadCount": "Personne n'a encore lu ce message.",
+ "allChannelsEmptyPlaceholderHeader": "Il n'y a pas de canal que vous pouvez visualiser dans cette organisation.",
"channelFeedButtonTooltip": "Fil de la chaîne",
"channelsPageTitle": "Chaînes",
"chooseAccountButtonAddAnAccount": "Ajouter un compte",
@@ -654,7 +677,10 @@
"combinedFeedPageTitle": "Fil groupé",
"composeBoxBannerButtonCancel": "Annuler",
"composeBoxBannerButtonSave": "Sauvegarder",
+ "composeBoxBannerButtonSubscribe": "S'abonner",
"composeBoxBannerLabelEditMessage": "Editer le message",
+ "composeBoxSendTooltip": "Envoyer",
+ "composeBoxTopicHintText": "Sujet",
"deleteMessageConfirmationDialogConfirmButton": "Supprimer",
"deleteMessageConfirmationDialogMessage": "Supprimer un message de façon permanente le supprime pour tout le monde.",
"deleteMessageConfirmationDialogTitle": "Supprimer message ?",
@@ -706,6 +732,7 @@
"mainMenuMyProfile": "Mon profil",
"manyPeopleTyping": "Plusieurs personnes sont en train d'écrire…",
"mentionsPageTitle": "Mentions",
+ "newDmSheetComposeButtonLabel": "Rédiger",
"noStatusText": "Statut sans texte",
"notifGroupDmConversationLabel": "{senderFullName} à vous et {numOthers, plural, =1{1 other} other{{numOthers} others}}",
"notifSelfUser": "Vous",
@@ -747,6 +774,7 @@
"tryAnotherAccountButton": "Essayer un autre compte",
"tryAnotherAccountMessage": "Votre compte à {url} prend du temps à se charger.",
"twoPeopleTyping": "{typist} et {otherTypist} sont en train d'écrire…",
+ "unknownUserName": "(utilisateur inconnu)",
"unpinnedSubscriptionsLabel": "Désépingler",
"unsubscribeConfirmationDialogConfirmButton": "Se désinscrire",
"unsubscribeConfirmationDialogTitle": "Se désinscrire de {channelName}?",
diff --git a/assets/l10n/app_ja.arb b/assets/l10n/app_ja.arb
index 66c8389695..8764b275ad 100644
--- a/assets/l10n/app_ja.arb
+++ b/assets/l10n/app_ja.arb
@@ -104,6 +104,9 @@
"@actionSheetReadReceiptsZeroReadCount": {
"description": "Label in the \"Read receipts\" bottom sheet when no one has read the message."
},
+ "@allChannelsPageTitle": {
+ "description": "Title for the 'All channels' page."
+ },
"@appVersionUnknownPlaceholder": {
"description": "Placeholder to show in place of the app version when it is unknown."
},
@@ -728,6 +731,9 @@
"@mutedUser": {
"description": "Text to display in place of a muted user's name."
},
+ "@navButtonAllChannels": {
+ "description": "Title for a nav button that opens the 'All channels' page."
+ },
"@newDmFabButtonLabel": {
"description": "Label for the floating action button (FAB) that opens the new DM sheet."
},
@@ -1215,6 +1221,7 @@
"actionSheetReadReceiptsErrorReadCount": "既読情報の読み込みに失敗しました。",
"actionSheetReadReceiptsReadCount": "{count, plural, =1{このメッセージは {count} 人に読まれています:} other{このメッセージは {count} 人に読まれています:}}",
"actionSheetReadReceiptsZeroReadCount": "このメッセージはまだ誰も読んでいません。",
+ "allChannelsPageTitle": "全てのチャンネル",
"appVersionUnknownPlaceholder": "(…)",
"channelFeedButtonTooltip": "チャンネルフィード",
"channelsPageTitle": "チャンネル",
@@ -1363,6 +1370,7 @@
"messageListGroupYouWithYourself": "自分とのメッセージ",
"messageNotSentLabel": "メッセージ未送信",
"mutedUser": "ミュート中のユーザー",
+ "navButtonAllChannels": "全てのチャンネル",
"newDmFabButtonLabel": "新しいDM",
"newDmSheetComposeButtonLabel": "作成",
"newDmSheetNoUsersFound": "ユーザーが見つかりません",
diff --git a/assets/l10n/app_pl.arb b/assets/l10n/app_pl.arb
index 41126f815e..8c164b287e 100644
--- a/assets/l10n/app_pl.arb
+++ b/assets/l10n/app_pl.arb
@@ -783,6 +783,9 @@
"@mutedUser": {
"description": "Name for a muted user to display all over the app."
},
+ "@navBarMenuLabel": {
+ "description": "Label for the Menu button on the bottom navigation bar."
+ },
"@navButtonAllChannels": {
"description": "Title for a nav button that opens the 'All channels' page."
},
@@ -1459,6 +1462,7 @@
"messageListGroupYouWithYourself": "Zapiski na własne konto",
"messageNotSentLabel": "NIE WYSŁANO WIADOMOŚCI",
"mutedUser": "Wyciszony użytkownik",
+ "navBarMenuLabel": "Menu",
"navButtonAllChannels": "Wszystkie kanały",
"newDmFabButtonLabel": "Nowa DM",
"newDmSheetComposeButtonLabel": "Utwórz",
diff --git a/assets/l10n/app_ru.arb b/assets/l10n/app_ru.arb
index 147680fda9..0f9d9e3832 100644
--- a/assets/l10n/app_ru.arb
+++ b/assets/l10n/app_ru.arb
@@ -783,6 +783,9 @@
"@mutedUser": {
"description": "Name for a muted user to display all over the app."
},
+ "@navBarMenuLabel": {
+ "description": "Label for the Menu button on the bottom navigation bar."
+ },
"@navButtonAllChannels": {
"description": "Title for a nav button that opens the 'All channels' page."
},
@@ -1459,6 +1462,7 @@
"messageListGroupYouWithYourself": "Сообщения с собой",
"messageNotSentLabel": "СООБЩЕНИЕ НЕ ОТПРАВЛЕНО",
"mutedUser": "Заглушенный пользователь",
+ "navBarMenuLabel": "Меню",
"navButtonAllChannels": "Все каналы",
"newDmFabButtonLabel": "Новое ЛС",
"newDmSheetComposeButtonLabel": "Написать",
diff --git a/assets/l10n/app_uk.arb b/assets/l10n/app_uk.arb
index 55ebb93abd..1cfe498aac 100644
--- a/assets/l10n/app_uk.arb
+++ b/assets/l10n/app_uk.arb
@@ -783,6 +783,9 @@
"@mutedUser": {
"description": "Name for a muted user to display all over the app."
},
+ "@navBarMenuLabel": {
+ "description": "Label for the Menu button on the bottom navigation bar."
+ },
"@navButtonAllChannels": {
"description": "Title for a nav button that opens the 'All channels' page."
},
@@ -1459,6 +1462,7 @@
"messageListGroupYouWithYourself": "Повідомлення з собою",
"messageNotSentLabel": "ПОВІДОМЛЕННЯ НЕ ВІДПРАВЛЕНО",
"mutedUser": "Заглушений користувач",
+ "navBarMenuLabel": "Меню",
"navButtonAllChannels": "Усі канали",
"newDmFabButtonLabel": "Нове особисте повідомлення",
"newDmSheetComposeButtonLabel": "Написати",
diff --git a/assets/l10n/app_vi.arb b/assets/l10n/app_vi.arb
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/assets/l10n/app_vi.arb
@@ -0,0 +1 @@
+{}
diff --git a/assets/l10n/app_zh_Hant_TW.arb b/assets/l10n/app_zh_Hant_TW.arb
index 6ae7f7ac92..439fbfa91f 100644
--- a/assets/l10n/app_zh_Hant_TW.arb
+++ b/assets/l10n/app_zh_Hant_TW.arb
@@ -107,6 +107,9 @@
"@actionSheetReadReceiptsZeroReadCount": {
"description": "Label in the \"Read receipts\" bottom sheet when no one has read the message."
},
+ "@allChannelsEmptyPlaceholderHeader": {
+ "description": "Centered text on the 'All channels' page saying that there is no content to show."
+ },
"@allChannelsPageTitle": {
"description": "Title for the 'All channels' page."
},
@@ -116,6 +119,18 @@
"@channelFeedButtonTooltip": {
"description": "Tooltip for button to navigate to a given channel's feed"
},
+ "@channelsEmptyPlaceholderHeader": {
+ "description": "Centered text on the 'Channels' page saying that there is no content to show."
+ },
+ "@channelsEmptyPlaceholderMessage": {
+ "description": "Centered text on the 'Channels' page saying that there is no content to show, with a link to 'All channels'.",
+ "placeholders": {
+ "allChannelsPageTitle": {
+ "example": "All channels",
+ "type": "String"
+ }
+ }
+ },
"@channelsPageTitle": {
"description": "Title for the page with a list of subscribed channels."
},
@@ -609,6 +624,12 @@
}
}
},
+ "@inboxEmptyPlaceholderHeader": {
+ "description": "Centered text on the 'Inbox' page saying that there is no content to show."
+ },
+ "@inboxEmptyPlaceholderMessage": {
+ "description": "Additional centered text on the 'Inbox' page saying that there is no content to show."
+ },
"@inboxPageTitle": {
"description": "Title for the page with unreads."
},
@@ -881,6 +902,12 @@
"@reactionChipsLabel": {
"description": "Text identifying the container of reaction chips on a message. (An accessibility label for assistive technology.)"
},
+ "@recentDmConversationsEmptyPlaceholderHeader": {
+ "description": "Centered text on the 'Direct messages' page saying that there is no content to show."
+ },
+ "@recentDmConversationsEmptyPlaceholderMessage": {
+ "description": "Additional centered text on the 'Direct messages' page saying that there is no content to show."
+ },
"@recentDmConversationsPageTitle": {
"description": "Title for the page with a list of DM conversations."
},
@@ -1268,9 +1295,12 @@
"actionSheetReadReceiptsErrorReadCount": "載入已讀回條失敗。",
"actionSheetReadReceiptsReadCount": "{count, plural, =1{此訊息已被閱讀,共有 {count} 人:} other{此訊息已被閱讀,共有 {count} 人:}}",
"actionSheetReadReceiptsZeroReadCount": "尚無人閱讀此訊息。",
+ "allChannelsEmptyPlaceholderHeader": "在此組織中沒有您可以查看的頻道。",
"allChannelsPageTitle": "所有頻道",
"appVersionUnknownPlaceholder": "(…)",
"channelFeedButtonTooltip": "頻道饋給",
+ "channelsEmptyPlaceholderHeader": "您尚未訂閱任何頻道。",
+ "channelsEmptyPlaceholderMessage": "試著前往 {allChannelsPageTitle},加入一些頻道吧。",
"channelsPageTitle": "頻道",
"chooseAccountButtonAddAnAccount": "增添帳號",
"chooseAccountPageLogOutButton": "登出",
@@ -1380,6 +1410,8 @@
"experimentalFeatureSettingsPageTitle": "實驗性功能",
"experimentalFeatureSettingsWarning": "這些選項啟用的功能仍在開發中,尚未完善。它們可能無法正常運作,且可能導致應用程式其他部分出現問題。\n\n這些設定的目的是供參與 Zulip 開發的人員進行試驗使用。",
"filenameAndSizeInMiB": "{filename}: {size} MiB",
+ "inboxEmptyPlaceholderHeader": "您的收件匣中沒有未讀訊息。",
+ "inboxEmptyPlaceholderMessage": "請使用下方按鈕查看綜合動態或頻道清單。",
"inboxPageTitle": "收件匣",
"initialAnchorSettingDescription": "您可以選擇將訊息串開啟在第一則未讀訊息,或是最新的訊息。",
"initialAnchorSettingFirstUnreadAlways": "第一則未讀訊息",
@@ -1452,6 +1484,8 @@
"reactionChipLabel": "{emojiName}: {votes}",
"reactionChipVotesYouAndOthers": "{otherUsersCount, plural, =1 {你與其他 1 人} other {你與其他 {otherUsersCount} 人}}",
"reactionChipsLabel": "反應",
+ "recentDmConversationsEmptyPlaceholderHeader": "您尚未有任何私人訊息!",
+ "recentDmConversationsEmptyPlaceholderMessage": "要不要開始一段對話呢?",
"recentDmConversationsPageTitle": "私人訊息",
"recentDmConversationsSectionHeader": "私人訊息",
"revealButtonLabel": "顯示訊息",
diff --git a/lib/generated/l10n/zulip_localizations.dart b/lib/generated/l10n/zulip_localizations.dart
index fe79921c07..fb20980e7c 100644
--- a/lib/generated/l10n/zulip_localizations.dart
+++ b/lib/generated/l10n/zulip_localizations.dart
@@ -21,6 +21,7 @@ import 'zulip_localizations_ru.dart';
import 'zulip_localizations_sk.dart';
import 'zulip_localizations_sl.dart';
import 'zulip_localizations_uk.dart';
+import 'zulip_localizations_vi.dart';
import 'zulip_localizations_zh.dart';
// ignore_for_file: type=lint
@@ -126,6 +127,7 @@ abstract class ZulipLocalizations {
Locale('sk'),
Locale('sl'),
Locale('uk'),
+ Locale('vi'),
Locale('zh'),
Locale.fromSubtags(
languageCode: 'zh',
@@ -2097,6 +2099,7 @@ class _ZulipLocalizationsDelegate
'sk',
'sl',
'uk',
+ 'vi',
'zh',
].contains(locale.languageCode);
@@ -2159,6 +2162,8 @@ ZulipLocalizations lookupZulipLocalizations(Locale locale) {
return ZulipLocalizationsSl();
case 'uk':
return ZulipLocalizationsUk();
+ case 'vi':
+ return ZulipLocalizationsVi();
case 'zh':
return ZulipLocalizationsZh();
}
diff --git a/lib/generated/l10n/zulip_localizations_de.dart b/lib/generated/l10n/zulip_localizations_de.dart
index 241e886e55..7ff5111ad6 100644
--- a/lib/generated/l10n/zulip_localizations_de.dart
+++ b/lib/generated/l10n/zulip_localizations_de.dart
@@ -75,7 +75,7 @@ class ZulipLocalizationsDe extends ZulipLocalizations {
@override
String get allChannelsEmptyPlaceholderHeader =>
- 'There are no channels you can view in this organization.';
+ 'Es gibt keine Kanäle, die du in dieser Organisation anzeigen könntest.';
@override
String get profileButtonSendDirectMessage => 'Direktnachricht senden';
@@ -288,7 +288,7 @@ class ZulipLocalizationsDe extends ZulipLocalizations {
@override
String get errorCouldNotAccessUploadedFileTitle =>
- 'Could not access uploaded file';
+ 'Konnte nicht auf die hochgeladene Datei zugreifen';
@override
String get errorCopyingFailed => 'Kopieren fehlgeschlagen';
@@ -681,7 +681,13 @@ class ZulipLocalizationsDe extends ZulipLocalizations {
@override
String topicValidationErrorTooLong(int maxLength) {
- return 'Länge des Themas sollte 60 Zeichen nicht überschreiten.';
+ String _temp0 = intl.Intl.pluralLogic(
+ maxLength,
+ locale: localeName,
+ other: '$maxLength Zeichen',
+ one: '1 Zeichen',
+ );
+ return 'Länge des Themas sollte $_temp0 nicht überschreiten.';
}
@override
@@ -938,11 +944,11 @@ class ZulipLocalizationsDe extends ZulipLocalizations {
@override
String get inboxEmptyPlaceholderHeader =>
- 'There are no unread messages in your inbox.';
+ 'Es gibt keine ungelesenen Nachrichten in deinem Posteingang.';
@override
String get inboxEmptyPlaceholderMessage =>
- 'Use the buttons below to view the combined feed or list of channels.';
+ 'Nutze die Buttons unten, um den kombinierten Feed oder die Liste der Kanäle anzuzeigen.';
@override
String get recentDmConversationsPageTitle => 'Direktnachrichten';
@@ -952,11 +958,11 @@ class ZulipLocalizationsDe extends ZulipLocalizations {
@override
String get recentDmConversationsEmptyPlaceholderHeader =>
- 'You have no direct messages yet!';
+ 'Du hast noch keine Direktnachrichten!';
@override
String get recentDmConversationsEmptyPlaceholderMessage =>
- 'Why not start a conversation?';
+ 'Warum beginnst du nicht einfach eine Unterhaltung?';
@override
String get combinedFeedPageTitle => 'Kombinierter Feed';
@@ -972,11 +978,11 @@ class ZulipLocalizationsDe extends ZulipLocalizations {
@override
String get channelsEmptyPlaceholderHeader =>
- 'You’re not subscribed to any channels yet.';
+ 'Du hast noch keine Kanäle abonniert.';
@override
String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) {
- return 'Try going to $allChannelsPageTitle and joining some of them.';
+ return 'Versuche, nach $allChannelsPageTitle zu gehen und einigen davon beizutreten.';
}
@override
diff --git a/lib/generated/l10n/zulip_localizations_fr.dart b/lib/generated/l10n/zulip_localizations_fr.dart
index adb41177b2..6c76f45010 100644
--- a/lib/generated/l10n/zulip_localizations_fr.dart
+++ b/lib/generated/l10n/zulip_localizations_fr.dart
@@ -76,7 +76,7 @@ class ZulipLocalizationsFr extends ZulipLocalizations {
@override
String get allChannelsEmptyPlaceholderHeader =>
- 'There are no channels you can view in this organization.';
+ 'Il n\'y a pas de canal que vous pouvez visualiser dans cette organisation.';
@override
String get profileButtonSendDirectMessage => 'Envoyer un message direct';
@@ -100,7 +100,7 @@ class ZulipLocalizationsFr extends ZulipLocalizations {
'Pour charger des fichiers, merci d\'accorder des autorisations supplémentaires à Zulip, dans les préférences.';
@override
- String get actionSheetOptionSubscribe => 'Subscribe';
+ String get actionSheetOptionSubscribe => 'S\'abonner';
@override
String get subscribeFailedTitle => 'Failed to subscribe';
@@ -453,7 +453,7 @@ class ZulipLocalizationsFr extends ZulipLocalizations {
String get composeBoxBannerButtonRefresh => 'Refresh';
@override
- String get composeBoxBannerButtonSubscribe => 'Subscribe';
+ String get composeBoxBannerButtonSubscribe => 'S\'abonner';
@override
String get composeBoxBannerLabelEditMessage => 'Editer le message';
@@ -505,7 +505,7 @@ class ZulipLocalizationsFr extends ZulipLocalizations {
String get composeBoxGenericContentHint => 'Type a message';
@override
- String get newDmSheetComposeButtonLabel => 'Compose';
+ String get newDmSheetComposeButtonLabel => 'Rédiger';
@override
String get newDmSheetScreenTitle => 'New DM';
@@ -542,13 +542,13 @@ class ZulipLocalizationsFr extends ZulipLocalizations {
String get preparingEditMessageContentInput => 'Preparing…';
@override
- String get composeBoxSendTooltip => 'Send';
+ String get composeBoxSendTooltip => 'Envoyer';
@override
String get unknownChannelName => '(unknown channel)';
@override
- String get composeBoxTopicHintText => 'Topic';
+ String get composeBoxTopicHintText => 'Sujet';
@override
String composeBoxEnterTopicOrSkipHintText(String defaultTopicName) {
@@ -566,7 +566,7 @@ class ZulipLocalizationsFr extends ZulipLocalizations {
}
@override
- String get unknownUserName => '(unknown user)';
+ String get unknownUserName => '(utilisateur inconnu)';
@override
String get dmsWithYourselfPageTitle => 'DMs with yourself';
diff --git a/lib/generated/l10n/zulip_localizations_ja.dart b/lib/generated/l10n/zulip_localizations_ja.dart
index d11aedf19f..7042ce1589 100644
--- a/lib/generated/l10n/zulip_localizations_ja.dart
+++ b/lib/generated/l10n/zulip_localizations_ja.dart
@@ -67,10 +67,10 @@ class ZulipLocalizationsJa extends ZulipLocalizations {
String get chooseAccountButtonAddAnAccount => '新しいアカウントを追加';
@override
- String get navButtonAllChannels => 'All channels';
+ String get navButtonAllChannels => '全てのチャンネル';
@override
- String get allChannelsPageTitle => 'All channels';
+ String get allChannelsPageTitle => '全てのチャンネル';
@override
String get allChannelsEmptyPlaceholderHeader =>
diff --git a/lib/generated/l10n/zulip_localizations_ru.dart b/lib/generated/l10n/zulip_localizations_ru.dart
index 04f8903b91..06e9f90118 100644
--- a/lib/generated/l10n/zulip_localizations_ru.dart
+++ b/lib/generated/l10n/zulip_localizations_ru.dart
@@ -1084,7 +1084,7 @@ class ZulipLocalizationsRu extends ZulipLocalizations {
String get wildcardMentionTopicDescription => 'Оповестить тему';
@override
- String get navBarMenuLabel => 'Menu';
+ String get navBarMenuLabel => 'Меню';
@override
String get messageIsEditedLabel => 'ИЗМЕНЕНО';
diff --git a/lib/generated/l10n/zulip_localizations_uk.dart b/lib/generated/l10n/zulip_localizations_uk.dart
index 84df26a42e..8972488a13 100644
--- a/lib/generated/l10n/zulip_localizations_uk.dart
+++ b/lib/generated/l10n/zulip_localizations_uk.dart
@@ -1072,7 +1072,7 @@ class ZulipLocalizationsUk extends ZulipLocalizations {
String get wildcardMentionTopicDescription => 'Повідомити канал';
@override
- String get navBarMenuLabel => 'Menu';
+ String get navBarMenuLabel => 'Меню';
@override
String get messageIsEditedLabel => 'РЕДАГОВАНО';
diff --git a/lib/generated/l10n/zulip_localizations_vi.dart b/lib/generated/l10n/zulip_localizations_vi.dart
new file mode 100644
index 0000000000..c5e4a62fc5
--- /dev/null
+++ b/lib/generated/l10n/zulip_localizations_vi.dart
@@ -0,0 +1,1183 @@
+// ignore: unused_import
+import 'package:intl/intl.dart' as intl;
+import 'zulip_localizations.dart';
+
+// ignore_for_file: type=lint
+
+/// The translations for Vietnamese (`vi`).
+class ZulipLocalizationsVi extends ZulipLocalizations {
+ ZulipLocalizationsVi([String locale = 'vi']) : super(locale);
+
+ @override
+ String get aboutPageTitle => 'About Zulip';
+
+ @override
+ String get aboutPageAppVersion => 'App version';
+
+ @override
+ String get aboutPageOpenSourceLicenses => 'Open-source licenses';
+
+ @override
+ String get aboutPageTapToView => 'Tap to view';
+
+ @override
+ String get upgradeWelcomeDialogTitle => 'Welcome to the new Zulip app!';
+
+ @override
+ String get upgradeWelcomeDialogMessage =>
+ 'You’ll find a familiar experience in a faster, sleeker package.';
+
+ @override
+ String get upgradeWelcomeDialogLinkText =>
+ 'Check out the announcement blog post!';
+
+ @override
+ String get upgradeWelcomeDialogDismiss => 'Let\'s go';
+
+ @override
+ String get chooseAccountPageTitle => 'Choose account';
+
+ @override
+ String get settingsPageTitle => 'Settings';
+
+ @override
+ String get switchAccountButton => 'Switch account';
+
+ @override
+ String tryAnotherAccountMessage(Object url) {
+ return 'Your account at $url is taking a while to load.';
+ }
+
+ @override
+ String get tryAnotherAccountButton => 'Try another account';
+
+ @override
+ String get chooseAccountPageLogOutButton => 'Log out';
+
+ @override
+ String get logOutConfirmationDialogTitle => 'Log out?';
+
+ @override
+ String get logOutConfirmationDialogMessage =>
+ 'To use this account in the future, you will have to re-enter the URL for your organization and your account information.';
+
+ @override
+ String get logOutConfirmationDialogConfirmButton => 'Log out';
+
+ @override
+ String get chooseAccountButtonAddAnAccount => 'Add an account';
+
+ @override
+ String get navButtonAllChannels => 'All channels';
+
+ @override
+ String get allChannelsPageTitle => 'All channels';
+
+ @override
+ String get allChannelsEmptyPlaceholderHeader =>
+ 'There are no channels you can view in this organization.';
+
+ @override
+ String get profileButtonSendDirectMessage => 'Send direct message';
+
+ @override
+ String get errorCouldNotShowUserProfile => 'Could not show user profile.';
+
+ @override
+ String get permissionsNeededTitle => 'Permissions needed';
+
+ @override
+ String get permissionsNeededOpenSettings => 'Open settings';
+
+ @override
+ String get permissionsDeniedCameraAccess =>
+ 'To upload an image, please grant Zulip additional permissions in Settings.';
+
+ @override
+ String get permissionsDeniedReadExternalStorage =>
+ 'To upload files, please grant Zulip additional permissions in Settings.';
+
+ @override
+ String get actionSheetOptionSubscribe => 'Subscribe';
+
+ @override
+ String get subscribeFailedTitle => 'Failed to subscribe';
+
+ @override
+ String get actionSheetOptionMarkChannelAsRead => 'Mark channel as read';
+
+ @override
+ String get actionSheetOptionCopyChannelLink => 'Copy link to channel';
+
+ @override
+ String get actionSheetOptionListOfTopics => 'List of topics';
+
+ @override
+ String get actionSheetOptionChannelFeed => 'Channel feed';
+
+ @override
+ String get actionSheetOptionUnsubscribe => 'Unsubscribe';
+
+ @override
+ String unsubscribeConfirmationDialogTitle(String channelName) {
+ return 'Unsubscribe from $channelName?';
+ }
+
+ @override
+ String get unsubscribeConfirmationDialogMessageCannotResubscribe =>
+ 'Once you leave this channel, you will not be able to rejoin.';
+
+ @override
+ String get unsubscribeConfirmationDialogConfirmButton => 'Unsubscribe';
+
+ @override
+ String get unsubscribeFailedTitle => 'Failed to unsubscribe';
+
+ @override
+ String get actionSheetOptionMuteTopic => 'Mute topic';
+
+ @override
+ String get actionSheetOptionUnmuteTopic => 'Unmute topic';
+
+ @override
+ String get actionSheetOptionFollowTopic => 'Follow topic';
+
+ @override
+ String get actionSheetOptionUnfollowTopic => 'Unfollow topic';
+
+ @override
+ String get actionSheetOptionResolveTopic => 'Mark as resolved';
+
+ @override
+ String get actionSheetOptionUnresolveTopic => 'Mark as unresolved';
+
+ @override
+ String get errorResolveTopicFailedTitle => 'Failed to mark topic as resolved';
+
+ @override
+ String get errorUnresolveTopicFailedTitle =>
+ 'Failed to mark topic as unresolved';
+
+ @override
+ String get actionSheetOptionSeeWhoReacted => 'See who reacted';
+
+ @override
+ String get seeWhoReactedSheetNoReactions => 'This message has no reactions.';
+
+ @override
+ String seeWhoReactedSheetHeaderLabel(int num) {
+ return 'Emoji reactions ($num total)';
+ }
+
+ @override
+ String seeWhoReactedSheetEmojiNameWithVoteCount(String emojiName, int num) {
+ String _temp0 = intl.Intl.pluralLogic(
+ num,
+ locale: localeName,
+ other: '$num votes',
+ one: '1 vote',
+ );
+ return '$emojiName: $_temp0';
+ }
+
+ @override
+ String seeWhoReactedSheetUserListLabel(String emojiName, int num) {
+ return 'Votes for $emojiName ($num)';
+ }
+
+ @override
+ String get actionSheetOptionViewReadReceipts => 'View read receipts';
+
+ @override
+ String get actionSheetReadReceipts => 'Read receipts';
+
+ @override
+ String actionSheetReadReceiptsReadCount(int count) {
+ String _temp0 = intl.Intl.pluralLogic(
+ count,
+ locale: localeName,
+ other: 'This message has been read by $count people:',
+ one: 'This message has been read by $count person:',
+ );
+ return '$_temp0';
+ }
+
+ @override
+ String get actionSheetReadReceiptsZeroReadCount =>
+ 'No one has read this message yet.';
+
+ @override
+ String get actionSheetReadReceiptsErrorReadCount =>
+ 'Failed to load read receipts.';
+
+ @override
+ String get actionSheetOptionCopyMessageText => 'Copy message text';
+
+ @override
+ String get actionSheetOptionCopyMessageLink => 'Copy link to message';
+
+ @override
+ String get actionSheetOptionMarkAsUnread => 'Mark as unread from here';
+
+ @override
+ String get actionSheetOptionHideMutedMessage => 'Hide muted message again';
+
+ @override
+ String get actionSheetOptionShare => 'Share';
+
+ @override
+ String get actionSheetOptionQuoteMessage => 'Quote message';
+
+ @override
+ String get actionSheetOptionStarMessage => 'Star message';
+
+ @override
+ String get actionSheetOptionUnstarMessage => 'Unstar message';
+
+ @override
+ String get actionSheetOptionEditMessage => 'Edit message';
+
+ @override
+ String get actionSheetOptionDeleteMessage => 'Delete message';
+
+ @override
+ String get deleteMessageConfirmationDialogTitle => 'Delete message?';
+
+ @override
+ String get deleteMessageConfirmationDialogMessage =>
+ 'Deleting a message permanently removes it for everyone.';
+
+ @override
+ String get deleteMessageConfirmationDialogConfirmButton => 'Delete';
+
+ @override
+ String get errorDeleteMessageFailedTitle => 'Failed to delete message';
+
+ @override
+ String get actionSheetOptionMarkTopicAsRead => 'Mark topic as read';
+
+ @override
+ String get actionSheetOptionCopyTopicLink => 'Copy link to topic';
+
+ @override
+ String get errorWebAuthOperationalErrorTitle => 'Something went wrong';
+
+ @override
+ String get errorWebAuthOperationalError => 'An unexpected error occurred.';
+
+ @override
+ String get errorAccountLoggedInTitle => 'Account already logged in';
+
+ @override
+ String errorAccountLoggedIn(String email, String server) {
+ return 'The account $email at $server is already in your list of accounts.';
+ }
+
+ @override
+ String get errorCouldNotFetchMessageSource =>
+ 'Could not fetch message source.';
+
+ @override
+ String get errorCouldNotAccessUploadedFileTitle =>
+ 'Could not access uploaded file';
+
+ @override
+ String get errorCopyingFailed => 'Copying failed';
+
+ @override
+ String errorFailedToUploadFileTitle(String filename) {
+ return 'Failed to upload file: $filename';
+ }
+
+ @override
+ String filenameAndSizeInMiB(String filename, String size) {
+ return '$filename: $size MiB';
+ }
+
+ @override
+ String errorFilesTooLarge(
+ int num,
+ int maxFileUploadSizeMib,
+ String listMessage,
+ ) {
+ String _temp0 = intl.Intl.pluralLogic(
+ num,
+ locale: localeName,
+ other: '$num files are',
+ one: 'File is',
+ );
+ return '$_temp0 larger than the server\'s limit of $maxFileUploadSizeMib MiB and will not be uploaded:\n\n$listMessage';
+ }
+
+ @override
+ String errorFilesTooLargeTitle(int num) {
+ String _temp0 = intl.Intl.pluralLogic(
+ num,
+ locale: localeName,
+ other: 'Files',
+ one: 'File',
+ );
+ return '$_temp0 too large';
+ }
+
+ @override
+ String get errorLoginInvalidInputTitle => 'Invalid input';
+
+ @override
+ String get errorLoginFailedTitle => 'Login failed';
+
+ @override
+ String get errorMessageNotSent => 'Message not sent';
+
+ @override
+ String get errorMessageEditNotSaved => 'Message not saved';
+
+ @override
+ String errorLoginCouldNotConnect(String url) {
+ return 'Failed to connect to server:\n$url';
+ }
+
+ @override
+ String get errorCouldNotConnectTitle => 'Could not connect';
+
+ @override
+ String get errorMessageDoesNotSeemToExist =>
+ 'That message does not seem to exist.';
+
+ @override
+ String get errorQuotationFailed => 'Quotation failed';
+
+ @override
+ String errorServerMessage(String message) {
+ return 'The server said:\n\n$message';
+ }
+
+ @override
+ String get errorConnectingToServerShort =>
+ 'Error connecting to Zulip. Retrying…';
+
+ @override
+ String errorConnectingToServerDetails(String serverUrl, String error) {
+ return 'Error connecting to Zulip at $serverUrl. Will retry:\n\n$error';
+ }
+
+ @override
+ String get errorHandlingEventTitle =>
+ 'Error handling a Zulip event. Retrying connection…';
+
+ @override
+ String errorHandlingEventDetails(
+ String serverUrl,
+ String error,
+ String event,
+ ) {
+ return 'Error handling a Zulip event from $serverUrl; will retry.\n\nError: $error\n\nEvent: $event';
+ }
+
+ @override
+ String get errorCouldNotOpenLinkTitle => 'Unable to open link';
+
+ @override
+ String errorCouldNotOpenLink(String url) {
+ return 'Link could not be opened: $url';
+ }
+
+ @override
+ String get errorMuteTopicFailed => 'Failed to mute topic';
+
+ @override
+ String get errorUnmuteTopicFailed => 'Failed to unmute topic';
+
+ @override
+ String get errorFollowTopicFailed => 'Failed to follow topic';
+
+ @override
+ String get errorUnfollowTopicFailed => 'Failed to unfollow topic';
+
+ @override
+ String get errorSharingFailed => 'Sharing failed';
+
+ @override
+ String get errorStarMessageFailedTitle => 'Failed to star message';
+
+ @override
+ String get errorUnstarMessageFailedTitle => 'Failed to unstar message';
+
+ @override
+ String get errorCouldNotEditMessageTitle => 'Could not edit message';
+
+ @override
+ String get successLinkCopied => 'Link copied';
+
+ @override
+ String get successMessageTextCopied => 'Message text copied';
+
+ @override
+ String get successMessageLinkCopied => 'Message link copied';
+
+ @override
+ String get successTopicLinkCopied => 'Topic link copied';
+
+ @override
+ String get successChannelLinkCopied => 'Channel link copied';
+
+ @override
+ String get errorBannerDeactivatedDmLabel =>
+ 'You cannot send messages to deactivated users.';
+
+ @override
+ String get errorBannerCannotPostInChannelLabel =>
+ 'You do not have permission to post in this channel.';
+
+ @override
+ String get composeBoxBannerLabelUnsubscribedWhenCannotSend =>
+ 'New messages will not appear automatically.';
+
+ @override
+ String get composeBoxBannerButtonRefresh => 'Refresh';
+
+ @override
+ String get composeBoxBannerButtonSubscribe => 'Subscribe';
+
+ @override
+ String get composeBoxBannerLabelEditMessage => 'Edit message';
+
+ @override
+ String get composeBoxBannerButtonCancel => 'Cancel';
+
+ @override
+ String get composeBoxBannerButtonSave => 'Save';
+
+ @override
+ String get editAlreadyInProgressTitle => 'Cannot edit message';
+
+ @override
+ String get editAlreadyInProgressMessage =>
+ 'An edit is already in progress. Please wait for it to complete.';
+
+ @override
+ String get savingMessageEditLabel => 'SAVING EDIT…';
+
+ @override
+ String get savingMessageEditFailedLabel => 'EDIT NOT SAVED';
+
+ @override
+ String get discardDraftConfirmationDialogTitle =>
+ 'Discard the message you’re writing?';
+
+ @override
+ String get discardDraftForEditConfirmationDialogMessage =>
+ 'When you edit a message, the content that was previously in the compose box is discarded.';
+
+ @override
+ String get discardDraftForOutboxConfirmationDialogMessage =>
+ 'When you restore an unsent message, the content that was previously in the compose box is discarded.';
+
+ @override
+ String get discardDraftConfirmationDialogConfirmButton => 'Discard';
+
+ @override
+ String get composeBoxAttachFilesTooltip => 'Attach files';
+
+ @override
+ String get composeBoxAttachMediaTooltip => 'Attach images or videos';
+
+ @override
+ String get composeBoxAttachFromCameraTooltip => 'Take a photo';
+
+ @override
+ String get composeBoxGenericContentHint => 'Type a message';
+
+ @override
+ String get newDmSheetComposeButtonLabel => 'Compose';
+
+ @override
+ String get newDmSheetScreenTitle => 'New DM';
+
+ @override
+ String get newDmFabButtonLabel => 'New DM';
+
+ @override
+ String get newDmSheetSearchHintEmpty => 'Add one or more users';
+
+ @override
+ String get newDmSheetSearchHintSomeSelected => 'Add another user…';
+
+ @override
+ String get newDmSheetNoUsersFound => 'No users found';
+
+ @override
+ String composeBoxDmContentHint(String user) {
+ return 'Message @$user';
+ }
+
+ @override
+ String get composeBoxGroupDmContentHint => 'Message group';
+
+ @override
+ String get composeBoxSelfDmContentHint => 'Write yourself a note';
+
+ @override
+ String composeBoxChannelContentHint(String destination) {
+ return 'Message $destination';
+ }
+
+ @override
+ String get preparingEditMessageContentInput => 'Preparing…';
+
+ @override
+ String get composeBoxSendTooltip => 'Send';
+
+ @override
+ String get unknownChannelName => '(unknown channel)';
+
+ @override
+ String get composeBoxTopicHintText => 'Topic';
+
+ @override
+ String composeBoxEnterTopicOrSkipHintText(String defaultTopicName) {
+ return 'Enter a topic (skip for “$defaultTopicName”)';
+ }
+
+ @override
+ String composeBoxUploadingFilename(String filename) {
+ return 'Uploading $filename…';
+ }
+
+ @override
+ String composeBoxLoadingMessage(int messageId) {
+ return '(loading message $messageId)';
+ }
+
+ @override
+ String get unknownUserName => '(unknown user)';
+
+ @override
+ String get dmsWithYourselfPageTitle => 'DMs with yourself';
+
+ @override
+ String messageListGroupYouAndOthers(String others) {
+ return 'You and $others';
+ }
+
+ @override
+ String dmsWithOthersPageTitle(String others) {
+ return 'DMs with $others';
+ }
+
+ @override
+ String get emptyMessageList => 'There are no messages here.';
+
+ @override
+ String get emptyMessageListSearch => 'No search results.';
+
+ @override
+ String get messageListGroupYouWithYourself => 'Messages with yourself';
+
+ @override
+ String get contentValidationErrorTooLong =>
+ 'Message length shouldn\'t be greater than 10000 characters.';
+
+ @override
+ String get contentValidationErrorEmpty => 'You have nothing to send!';
+
+ @override
+ String get contentValidationErrorQuoteAndReplyInProgress =>
+ 'Please wait for the quotation to complete.';
+
+ @override
+ String get contentValidationErrorUploadInProgress =>
+ 'Please wait for the upload to complete.';
+
+ @override
+ String get dialogCancel => 'Cancel';
+
+ @override
+ String get dialogContinue => 'Continue';
+
+ @override
+ String get dialogClose => 'Close';
+
+ @override
+ String get errorDialogLearnMore => 'Learn more';
+
+ @override
+ String get errorDialogContinue => 'OK';
+
+ @override
+ String get errorDialogTitle => 'Error';
+
+ @override
+ String get snackBarDetails => 'Details';
+
+ @override
+ String get lightboxCopyLinkTooltip => 'Copy link';
+
+ @override
+ String get lightboxVideoCurrentPosition => 'Current position';
+
+ @override
+ String get lightboxVideoDuration => 'Video duration';
+
+ @override
+ String get loginPageTitle => 'Log in';
+
+ @override
+ String get loginFormSubmitLabel => 'Log in';
+
+ @override
+ String get loginMethodDivider => 'OR';
+
+ @override
+ String signInWithFoo(String method) {
+ return 'Sign in with $method';
+ }
+
+ @override
+ String get loginAddAnAccountPageTitle => 'Add an account';
+
+ @override
+ String get loginServerUrlLabel => 'Your Zulip server URL';
+
+ @override
+ String get loginHidePassword => 'Hide password';
+
+ @override
+ String get loginEmailLabel => 'Email address';
+
+ @override
+ String get loginErrorMissingEmail => 'Please enter your email.';
+
+ @override
+ String get loginPasswordLabel => 'Password';
+
+ @override
+ String get loginErrorMissingPassword => 'Please enter your password.';
+
+ @override
+ String get loginUsernameLabel => 'Username';
+
+ @override
+ String get loginErrorMissingUsername => 'Please enter your username.';
+
+ @override
+ String topicValidationErrorTooLong(int maxLength) {
+ String _temp0 = intl.Intl.pluralLogic(
+ maxLength,
+ locale: localeName,
+ other: '$maxLength characters',
+ one: '1 character',
+ );
+ return 'Topic length shouldn\'t be greater than $_temp0.';
+ }
+
+ @override
+ String get topicValidationErrorMandatoryButEmpty =>
+ 'Topics are required in this organization.';
+
+ @override
+ String get errorContentNotInsertedTitle => 'Content not inserted';
+
+ @override
+ String get errorContentToInsertIsEmpty =>
+ 'The file to be inserted is empty or cannot be accessed.';
+
+ @override
+ String errorServerVersionUnsupportedMessage(
+ String url,
+ String zulipVersion,
+ String minSupportedZulipVersion,
+ ) {
+ return '$url is running Zulip Server $zulipVersion, which is unsupported. The minimum supported version is Zulip Server $minSupportedZulipVersion.';
+ }
+
+ @override
+ String errorInvalidApiKeyMessage(String url) {
+ return 'Your account at $url could not be authenticated. Please try logging in again or use another account.';
+ }
+
+ @override
+ String get errorInvalidResponse => 'The server sent an invalid response.';
+
+ @override
+ String get errorNetworkRequestFailed => 'Network request failed';
+
+ @override
+ String errorMalformedResponse(int httpStatus) {
+ return 'Server gave malformed response; HTTP status $httpStatus';
+ }
+
+ @override
+ String errorMalformedResponseWithCause(int httpStatus, String details) {
+ return 'Server gave malformed response; HTTP status $httpStatus; $details';
+ }
+
+ @override
+ String errorRequestFailed(int httpStatus) {
+ return 'Network request failed: HTTP status $httpStatus';
+ }
+
+ @override
+ String get errorVideoPlayerFailed => 'Unable to play the video.';
+
+ @override
+ String get serverUrlValidationErrorEmpty => 'Please enter a URL.';
+
+ @override
+ String get serverUrlValidationErrorInvalidUrl => 'Please enter a valid URL.';
+
+ @override
+ String get serverUrlValidationErrorNoUseEmail =>
+ 'Please enter the server URL, not your email.';
+
+ @override
+ String get serverUrlValidationErrorUnsupportedScheme =>
+ 'The server URL must start with http:// or https://.';
+
+ @override
+ String get spoilerDefaultHeaderText => 'Spoiler';
+
+ @override
+ String get markAllAsReadLabel => 'Mark all messages as read';
+
+ @override
+ String markAsReadComplete(int num) {
+ String _temp0 = intl.Intl.pluralLogic(
+ num,
+ locale: localeName,
+ other: '$num messages',
+ one: '1 message',
+ );
+ return 'Marked $_temp0 as read.';
+ }
+
+ @override
+ String get markAsReadInProgress => 'Marking messages as read…';
+
+ @override
+ String get errorMarkAsReadFailedTitle => 'Mark as read failed';
+
+ @override
+ String markAsUnreadComplete(int num) {
+ String _temp0 = intl.Intl.pluralLogic(
+ num,
+ locale: localeName,
+ other: '$num messages',
+ one: '1 message',
+ );
+ return 'Marked $_temp0 as unread.';
+ }
+
+ @override
+ String get markAsUnreadInProgress => 'Marking messages as unread…';
+
+ @override
+ String get errorMarkAsUnreadFailedTitle => 'Mark as unread failed';
+
+ @override
+ String get today => 'Today';
+
+ @override
+ String get yesterday => 'Yesterday';
+
+ @override
+ String get userActiveNow => 'Active now';
+
+ @override
+ String get userIdle => 'Idle';
+
+ @override
+ String userActiveMinutesAgo(int minutes) {
+ String _temp0 = intl.Intl.pluralLogic(
+ minutes,
+ locale: localeName,
+ other: '$minutes minutes',
+ one: '1 minute',
+ );
+ return 'Active $_temp0 ago';
+ }
+
+ @override
+ String userActiveHoursAgo(int hours) {
+ String _temp0 = intl.Intl.pluralLogic(
+ hours,
+ locale: localeName,
+ other: '$hours hours',
+ one: '1 hour',
+ );
+ return 'Active $_temp0 ago';
+ }
+
+ @override
+ String get userActiveYesterday => 'Active yesterday';
+
+ @override
+ String userActiveDaysAgo(int days) {
+ String _temp0 = intl.Intl.pluralLogic(
+ days,
+ locale: localeName,
+ other: '$days days',
+ one: '1 day',
+ );
+ return 'Active $_temp0 ago';
+ }
+
+ @override
+ String userActiveDate(String date) {
+ return 'Active $date';
+ }
+
+ @override
+ String get userNotActiveInYear => 'Not active in the last year';
+
+ @override
+ String get invisibleMode => 'Invisible mode';
+
+ @override
+ String get turnOnInvisibleModeErrorTitle =>
+ 'Error turning on invisible mode. Please try again.';
+
+ @override
+ String get turnOffInvisibleModeErrorTitle =>
+ 'Error turning off invisible mode. Please try again.';
+
+ @override
+ String get userRoleOwner => 'Owner';
+
+ @override
+ String get userRoleAdministrator => 'Administrator';
+
+ @override
+ String get userRoleModerator => 'Moderator';
+
+ @override
+ String get userRoleMember => 'Member';
+
+ @override
+ String get userRoleGuest => 'Guest';
+
+ @override
+ String get userRoleUnknown => 'Unknown';
+
+ @override
+ String get statusButtonLabelStatusSet => 'Status';
+
+ @override
+ String get statusButtonLabelStatusUnset => 'Set status';
+
+ @override
+ String get noStatusText => 'No status text';
+
+ @override
+ String get setStatusPageTitle => 'Set status';
+
+ @override
+ String get statusClearButtonLabel => 'Clear';
+
+ @override
+ String get statusSaveButtonLabel => 'Save';
+
+ @override
+ String get statusTextHint => 'Your status';
+
+ @override
+ String get userStatusBusy => 'Busy';
+
+ @override
+ String get userStatusInAMeeting => 'In a meeting';
+
+ @override
+ String get userStatusCommuting => 'Commuting';
+
+ @override
+ String get userStatusOutSick => 'Out sick';
+
+ @override
+ String get userStatusVacationing => 'Vacationing';
+
+ @override
+ String get userStatusWorkingRemotely => 'Working remotely';
+
+ @override
+ String get userStatusAtTheOffice => 'At the office';
+
+ @override
+ String get updateStatusErrorTitle =>
+ 'Error updating user status. Please try again.';
+
+ @override
+ String get searchMessagesPageTitle => 'Search';
+
+ @override
+ String get searchMessagesHintText => 'Search';
+
+ @override
+ String get searchMessagesClearButtonTooltip => 'Clear';
+
+ @override
+ String get inboxPageTitle => 'Inbox';
+
+ @override
+ String get inboxEmptyPlaceholderHeader =>
+ 'There are no unread messages in your inbox.';
+
+ @override
+ String get inboxEmptyPlaceholderMessage =>
+ 'Use the buttons below to view the combined feed or list of channels.';
+
+ @override
+ String get recentDmConversationsPageTitle => 'Direct messages';
+
+ @override
+ String get recentDmConversationsSectionHeader => 'Direct messages';
+
+ @override
+ String get recentDmConversationsEmptyPlaceholderHeader =>
+ 'You have no direct messages yet!';
+
+ @override
+ String get recentDmConversationsEmptyPlaceholderMessage =>
+ 'Why not start a conversation?';
+
+ @override
+ String get combinedFeedPageTitle => 'Combined feed';
+
+ @override
+ String get mentionsPageTitle => 'Mentions';
+
+ @override
+ String get starredMessagesPageTitle => 'Starred messages';
+
+ @override
+ String get channelsPageTitle => 'Channels';
+
+ @override
+ String get channelsEmptyPlaceholderHeader =>
+ 'You’re not subscribed to any channels yet.';
+
+ @override
+ String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) {
+ return 'Try going to $allChannelsPageTitle and joining some of them.';
+ }
+
+ @override
+ String get sharePageTitle => 'Share';
+
+ @override
+ String get mainMenuMyProfile => 'My profile';
+
+ @override
+ String get topicsButtonTooltip => 'Topics';
+
+ @override
+ String get channelFeedButtonTooltip => 'Channel feed';
+
+ @override
+ String notifGroupDmConversationLabel(String senderFullName, int numOthers) {
+ String _temp0 = intl.Intl.pluralLogic(
+ numOthers,
+ locale: localeName,
+ other: '$numOthers others',
+ one: '1 other',
+ );
+ return '$senderFullName to you and $_temp0';
+ }
+
+ @override
+ String get pinnedSubscriptionsLabel => 'Pinned';
+
+ @override
+ String get unpinnedSubscriptionsLabel => 'Unpinned';
+
+ @override
+ String get notifSelfUser => 'You';
+
+ @override
+ String get reactedEmojiSelfUser => 'You';
+
+ @override
+ String get reactionChipsLabel => 'Reactions';
+
+ @override
+ String reactionChipLabel(String emojiName, String votes) {
+ return '$emojiName: $votes';
+ }
+
+ @override
+ String reactionChipVotesYouAndOthers(int otherUsersCount) {
+ String _temp0 = intl.Intl.pluralLogic(
+ otherUsersCount,
+ locale: localeName,
+ other: 'You and $otherUsersCount others',
+ one: 'You and 1 other',
+ );
+ return '$_temp0';
+ }
+
+ @override
+ String onePersonTyping(String typist) {
+ return '$typist is typing…';
+ }
+
+ @override
+ String twoPeopleTyping(String typist, String otherTypist) {
+ return '$typist and $otherTypist are typing…';
+ }
+
+ @override
+ String get manyPeopleTyping => 'Several people are typing…';
+
+ @override
+ String get wildcardMentionAll => 'all';
+
+ @override
+ String get wildcardMentionEveryone => 'everyone';
+
+ @override
+ String get wildcardMentionChannel => 'channel';
+
+ @override
+ String get wildcardMentionStream => 'stream';
+
+ @override
+ String get wildcardMentionTopic => 'topic';
+
+ @override
+ String get wildcardMentionChannelDescription => 'Notify channel';
+
+ @override
+ String get wildcardMentionStreamDescription => 'Notify stream';
+
+ @override
+ String get wildcardMentionAllDmDescription => 'Notify recipients';
+
+ @override
+ String get wildcardMentionTopicDescription => 'Notify topic';
+
+ @override
+ String get navBarMenuLabel => 'Menu';
+
+ @override
+ String get messageIsEditedLabel => 'EDITED';
+
+ @override
+ String get messageIsMovedLabel => 'MOVED';
+
+ @override
+ String get messageNotSentLabel => 'MESSAGE NOT SENT';
+
+ @override
+ String pollVoterNames(String voterNames) {
+ return '($voterNames)';
+ }
+
+ @override
+ String get themeSettingTitle => 'THEME';
+
+ @override
+ String get themeSettingDark => 'Dark';
+
+ @override
+ String get themeSettingLight => 'Light';
+
+ @override
+ String get themeSettingSystem => 'System';
+
+ @override
+ String get openLinksWithInAppBrowser => 'Open links with in-app browser';
+
+ @override
+ String get pollWidgetQuestionMissing => 'No question.';
+
+ @override
+ String get pollWidgetOptionsMissing => 'This poll has no options yet.';
+
+ @override
+ String get initialAnchorSettingTitle => 'Open message feeds at';
+
+ @override
+ String get initialAnchorSettingDescription =>
+ 'You can choose whether message feeds open at your first unread message or at the newest messages.';
+
+ @override
+ String get initialAnchorSettingFirstUnreadAlways => 'First unread message';
+
+ @override
+ String get initialAnchorSettingFirstUnreadConversations =>
+ 'First unread message in conversation views, newest message elsewhere';
+
+ @override
+ String get initialAnchorSettingNewestAlways => 'Newest message';
+
+ @override
+ String get markReadOnScrollSettingTitle => 'Mark messages as read on scroll';
+
+ @override
+ String get markReadOnScrollSettingDescription =>
+ 'When scrolling through messages, should they automatically be marked as read?';
+
+ @override
+ String get markReadOnScrollSettingAlways => 'Always';
+
+ @override
+ String get markReadOnScrollSettingNever => 'Never';
+
+ @override
+ String get markReadOnScrollSettingConversations =>
+ 'Only in conversation views';
+
+ @override
+ String get markReadOnScrollSettingConversationsDescription =>
+ 'Messages will be automatically marked as read only when viewing a single topic or direct message conversation.';
+
+ @override
+ String get experimentalFeatureSettingsPageTitle => 'Experimental features';
+
+ @override
+ String get experimentalFeatureSettingsWarning =>
+ 'These options enable features which are still under development and not ready. They may not work, and may cause issues in other areas of the app.\n\nThe purpose of these settings is for experimentation by people working on developing Zulip.';
+
+ @override
+ String get errorNotificationOpenTitle => 'Failed to open notification';
+
+ @override
+ String get errorNotificationOpenAccountNotFound =>
+ 'The account associated with this notification could not be found.';
+
+ @override
+ String get errorReactionAddingFailedTitle => 'Adding reaction failed';
+
+ @override
+ String get errorReactionRemovingFailedTitle => 'Removing reaction failed';
+
+ @override
+ String get errorSharingTitle => 'Failed to share content';
+
+ @override
+ String get errorSharingAccountNotLoggedIn =>
+ 'There is no account logged in. Please log in to an account and try again.';
+
+ @override
+ String get emojiReactionsMore => 'more';
+
+ @override
+ String get emojiPickerSearchEmoji => 'Search emoji';
+
+ @override
+ String get noEarlierMessages => 'No earlier messages';
+
+ @override
+ String get revealButtonLabel => 'Reveal message';
+
+ @override
+ String get mutedUser => 'Muted user';
+
+ @override
+ String get scrollToBottomTooltip => 'Scroll to bottom';
+
+ @override
+ String get appVersionUnknownPlaceholder => '(…)';
+
+ @override
+ String get zulipAppTitle => 'Zulip';
+}
diff --git a/lib/generated/l10n/zulip_localizations_zh.dart b/lib/generated/l10n/zulip_localizations_zh.dart
index b08c25004e..4023ab6f69 100644
--- a/lib/generated/l10n/zulip_localizations_zh.dart
+++ b/lib/generated/l10n/zulip_localizations_zh.dart
@@ -2337,6 +2337,9 @@ class ZulipLocalizationsZhHantTw extends ZulipLocalizationsZh {
@override
String get allChannelsPageTitle => '所有頻道';
+ @override
+ String get allChannelsEmptyPlaceholderHeader => '在此組織中沒有您可以查看的頻道。';
+
@override
String get profileButtonSendDirectMessage => '發送私訊';
@@ -3147,12 +3150,24 @@ class ZulipLocalizationsZhHantTw extends ZulipLocalizationsZh {
@override
String get inboxPageTitle => '收件匣';
+ @override
+ String get inboxEmptyPlaceholderHeader => '您的收件匣中沒有未讀訊息。';
+
+ @override
+ String get inboxEmptyPlaceholderMessage => '請使用下方按鈕查看綜合動態或頻道清單。';
+
@override
String get recentDmConversationsPageTitle => '私人訊息';
@override
String get recentDmConversationsSectionHeader => '私人訊息';
+ @override
+ String get recentDmConversationsEmptyPlaceholderHeader => '您尚未有任何私人訊息!';
+
+ @override
+ String get recentDmConversationsEmptyPlaceholderMessage => '要不要開始一段對話呢?';
+
@override
String get combinedFeedPageTitle => '綜合饋給';
@@ -3165,6 +3180,14 @@ class ZulipLocalizationsZhHantTw extends ZulipLocalizationsZh {
@override
String get channelsPageTitle => '頻道';
+ @override
+ String get channelsEmptyPlaceholderHeader => '您尚未訂閱任何頻道。';
+
+ @override
+ String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) {
+ return '試著前往 $allChannelsPageTitle,加入一些頻道吧。';
+ }
+
@override
String get sharePageTitle => '分享';