diff --git a/assets/l10n/app_en.arb b/assets/l10n/app_en.arb index 1f52ac32ba..7165a6a76e 100644 --- a/assets/l10n/app_en.arb +++ b/assets/l10n/app_en.arb @@ -80,8 +80,8 @@ "@allChannelsPageTitle": { "description": "Title for the 'All channels' page." }, - "allChannelsEmptyPlaceholder": "There are no channels you can view in this organization.", - "@allChannelsEmptyPlaceholder": { + "allChannelsEmptyPlaceholderHeader": "There are no channels you can view in this organization.", + "@allChannelsEmptyPlaceholderHeader": { "description": "Centered text on the 'All channels' page saying that there is no content to show." }, "profileButtonSendDirectMessage": "Send direct message", @@ -687,6 +687,75 @@ "@emptyMessageList": { "description": "Placeholder for some message-list pages when there are no messages." }, + "emptyMessageListCombinedFeed": "There are no messages in your combined feed.", + "@emptyMessageListCombinedFeed": { + "description": "Placeholder for the 'Combined feed' page when there are no messages." + }, + "emptyMessageListChannelWithoutContentAccess": "You don’t have content access to this channel.", + "@emptyMessageListChannelWithoutContentAccess": { + "description": "Placeholder for a channel or topic page when there are no messages and you don’t have content access." + }, + "emptyMessageListChannelUnavailable": "This channel doesn’t exist, or you are not allowed to view it.", + "@emptyMessageListChannelUnavailable": { + "description": "Placeholder for a channel page when there are no messages and the channel does not exist or you don't have access to it." + }, + "emptyMessageListSelfDmHeader": "You have not sent any direct messages to yourself yet!", + "@emptyMessageListSelfDmHeader": { + "description": "Placeholder for the self-DM page when there are no messages." + }, + "emptyMessageListSelfDmMessage": "Use this space for personal notes, or to test out Zulip features.", + "@emptyMessageListSelfDmMessage": { + "description": "Extra detail in the placeholder for the self-DM page when there are no messages." + }, + "emptyMessageListDm": "You have no direct messages with {person} yet.", + "@emptyMessageListDm": { + "description": "Placeholder for a 1:1 DM page when there are no messages.", + "placeholders": { + "person": {"type": "String", "example": "Alice"} + } + }, + "emptyMessageListDmDeactivatedUser": "You have no direct messages with {person}.", + "@emptyMessageListDmDeactivatedUser": { + "description": "Placeholder for a 1:1 DM page when there are no messages and the other user is deactivated.", + "placeholders": { + "person": {"type": "String", "example": "Alice"} + } + }, + "emptyMessageListDmUnknownUser": "You have no direct messages with this user.", + "@emptyMessageListDmUnknownUser": { + "description": "Placeholder for a 1:1 DM page when there are no messages and the other user's name is unavailable." + }, + "emptyMessageListGroupDm": "You have no direct messages with these users yet.", + "@emptyMessageListGroupDm": { + "description": "Placeholder for a group DM page when there are no messages." + }, + "emptyMessageListGroupDmDeactivatedUser": "You have no direct messages with these users.", + "@emptyMessageListGroupDmDeactivatedUser": { + "description": "Placeholder for a group DM page when there are no messages and one or more participants is deactivated." + }, + "emptyMessageListDmStartConversation": "Why not start the conversation?", + "@emptyMessageListDmStartConversation": { + "description": "Extra detail in the placeholder for some DM pages when there are no messages." + }, + "emptyMessageListMentionsHeader": "This view will show messages where you are mentioned.", + "@emptyMessageListMentionsHeader": { + "description": "Placeholder for the 'Mentions' page when there are no messages." + }, + "emptyMessageListMentionsMessage": "To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.", + "@emptyMessageListMentionsMessage": { + "description": "Extra detail in the placeholder for the 'Mentions' page when there are no messages." + }, + "emptyMessageListStarredHeader": "You have no starred messages.", + "@emptyMessageListStarredHeader": { + "description": "Placeholder for the 'Starred' page when there are no messages." + }, + "emptyMessageListStarredMessage": "Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “{button}.”", + "@emptyMessageListStarredMessage": { + "description": "Extra detail in the placeholder for the 'Starred' page when there are no messages. The {button} placeholder will be the button's translated text.", + "placeholders": { + "button": {"type": "String", "example": "Star message"} + } + }, "emptyMessageListSearch": "No search results.", "@emptyMessageListSearch": { "description": "Placeholder for the 'Search' page when there are no messages." @@ -1090,10 +1159,14 @@ "@inboxPageTitle": { "description": "Title for the page with unreads." }, - "inboxEmptyPlaceholder": "There are no unread messages in your inbox. Use the buttons below to view the combined feed or list of channels.", - "@inboxEmptyPlaceholder": { + "inboxEmptyPlaceholderHeader": "There are no unread messages in your inbox.", + "@inboxEmptyPlaceholderHeader": { "description": "Centered text on the 'Inbox' page saying that there is no content to show." }, + "inboxEmptyPlaceholderMessage": "Use the buttons below to view the combined feed or list of channels.", + "@inboxEmptyPlaceholderMessage": { + "description": "Additional centered text on the 'Inbox' page saying that there is no content to show." + }, "recentDmConversationsPageTitle": "Direct messages", "@recentDmConversationsPageTitle": { "description": "Title for the page with a list of DM conversations." @@ -1102,10 +1175,14 @@ "@recentDmConversationsSectionHeader": { "description": "Heading for direct messages section on the 'Inbox' message view." }, - "recentDmConversationsEmptyPlaceholder": "You have no direct messages yet! Why not start the conversation?", - "@recentDmConversationsEmptyPlaceholder": { + "recentDmConversationsEmptyPlaceholderHeader": "You have no direct messages yet!", + "@recentDmConversationsEmptyPlaceholderHeader": { "description": "Centered text on the 'Direct messages' page saying that there is no content to show." }, + "recentDmConversationsEmptyPlaceholderMessage": "Why not start a conversation?", + "@recentDmConversationsEmptyPlaceholderMessage": { + "description": "Additional centered text on the 'Direct messages' page saying that there is no content to show." + }, "combinedFeedPageTitle": "Combined feed", "@combinedFeedPageTitle": { "description": "Page title for the 'Combined feed' message view." @@ -1122,12 +1199,12 @@ "@channelsPageTitle": { "description": "Title for the page with a list of subscribed channels." }, - "channelsEmptyPlaceholder": "You’re not subscribed to any channels yet.", - "@channelsEmptyPlaceholder": { + "channelsEmptyPlaceholderHeader": "You’re not subscribed to any channels yet.", + "@channelsEmptyPlaceholderHeader": { "description": "Centered text on the 'Channels' page saying that there is no content to show." }, - "channelsEmptyPlaceholderWithAllChannelsLink": "You’re not subscribed to any channels yet. Try going to {allChannelsPageTitle} and joining some of them.", - "@channelsEmptyPlaceholderWithAllChannelsLink": { + "channelsEmptyPlaceholderMessage": "Try going to {allChannelsPageTitle} and joining some of them.", + "@channelsEmptyPlaceholderMessage": { "description": "Centered text on the 'Channels' page saying that there is no content to show, with a link to 'All channels'.", "placeholders": { "allChannelsPageTitle": {"type": "String", "example": "All channels"} diff --git a/lib/generated/l10n/zulip_localizations.dart b/lib/generated/l10n/zulip_localizations.dart index 31d472227d..26f83cc1b6 100644 --- a/lib/generated/l10n/zulip_localizations.dart +++ b/lib/generated/l10n/zulip_localizations.dart @@ -263,7 +263,7 @@ abstract class ZulipLocalizations { /// /// In en, this message translates to: /// **'There are no channels you can view in this organization.'** - String get allChannelsEmptyPlaceholder; + String get allChannelsEmptyPlaceholderHeader; /// Label for button in profile screen to navigate to DMs with the shown user. /// @@ -1065,6 +1065,96 @@ abstract class ZulipLocalizations { /// **'There are no messages here.'** String get emptyMessageList; + /// Placeholder for the 'Combined feed' page when there are no messages. + /// + /// In en, this message translates to: + /// **'There are no messages in your combined feed.'** + String get emptyMessageListCombinedFeed; + + /// Placeholder for a channel or topic page when there are no messages and you don’t have content access. + /// + /// In en, this message translates to: + /// **'You don’t have content access to this channel.'** + String get emptyMessageListChannelWithoutContentAccess; + + /// Placeholder for a channel page when there are no messages and the channel does not exist or you don't have access to it. + /// + /// In en, this message translates to: + /// **'This channel doesn’t exist, or you are not allowed to view it.'** + String get emptyMessageListChannelUnavailable; + + /// Placeholder for the self-DM page when there are no messages. + /// + /// In en, this message translates to: + /// **'You have not sent any direct messages to yourself yet!'** + String get emptyMessageListSelfDmHeader; + + /// Extra detail in the placeholder for the self-DM page when there are no messages. + /// + /// In en, this message translates to: + /// **'Use this space for personal notes, or to test out Zulip features.'** + String get emptyMessageListSelfDmMessage; + + /// Placeholder for a 1:1 DM page when there are no messages. + /// + /// In en, this message translates to: + /// **'You have no direct messages with {person} yet.'** + String emptyMessageListDm(String person); + + /// Placeholder for a 1:1 DM page when there are no messages and the other user is deactivated. + /// + /// In en, this message translates to: + /// **'You have no direct messages with {person}.'** + String emptyMessageListDmDeactivatedUser(String person); + + /// Placeholder for a 1:1 DM page when there are no messages and the other user's name is unavailable. + /// + /// In en, this message translates to: + /// **'You have no direct messages with this user.'** + String get emptyMessageListDmUnknownUser; + + /// Placeholder for a group DM page when there are no messages. + /// + /// In en, this message translates to: + /// **'You have no direct messages with these users yet.'** + String get emptyMessageListGroupDm; + + /// Placeholder for a group DM page when there are no messages and one or more participants is deactivated. + /// + /// In en, this message translates to: + /// **'You have no direct messages with these users.'** + String get emptyMessageListGroupDmDeactivatedUser; + + /// Extra detail in the placeholder for some DM pages when there are no messages. + /// + /// In en, this message translates to: + /// **'Why not start the conversation?'** + String get emptyMessageListDmStartConversation; + + /// Placeholder for the 'Mentions' page when there are no messages. + /// + /// In en, this message translates to: + /// **'This view will show messages where you are mentioned.'** + String get emptyMessageListMentionsHeader; + + /// Extra detail in the placeholder for the 'Mentions' page when there are no messages. + /// + /// In en, this message translates to: + /// **'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'** + String get emptyMessageListMentionsMessage; + + /// Placeholder for the 'Starred' page when there are no messages. + /// + /// In en, this message translates to: + /// **'You have no starred messages.'** + String get emptyMessageListStarredHeader; + + /// Extra detail in the placeholder for the 'Starred' page when there are no messages. The {button} placeholder will be the button's translated text. + /// + /// In en, this message translates to: + /// **'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “{button}.”'** + String emptyMessageListStarredMessage(String button); + /// Placeholder for the 'Search' page when there are no messages. /// /// In en, this message translates to: @@ -1620,8 +1710,14 @@ abstract class ZulipLocalizations { /// Centered text on the 'Inbox' page saying that there is no content to show. /// /// In en, this message translates to: - /// **'There are no unread messages in your inbox. Use the buttons below to view the combined feed or list of channels.'** - String get inboxEmptyPlaceholder; + /// **'There are no unread messages in your inbox.'** + String get inboxEmptyPlaceholderHeader; + + /// Additional centered text on the 'Inbox' page saying that there is no content to show. + /// + /// In en, this message translates to: + /// **'Use the buttons below to view the combined feed or list of channels.'** + String get inboxEmptyPlaceholderMessage; /// Title for the page with a list of DM conversations. /// @@ -1638,8 +1734,14 @@ abstract class ZulipLocalizations { /// Centered text on the 'Direct messages' page saying that there is no content to show. /// /// In en, this message translates to: - /// **'You have no direct messages yet! Why not start the conversation?'** - String get recentDmConversationsEmptyPlaceholder; + /// **'You have no direct messages yet!'** + String get recentDmConversationsEmptyPlaceholderHeader; + + /// Additional centered text on the 'Direct messages' page saying that there is no content to show. + /// + /// In en, this message translates to: + /// **'Why not start a conversation?'** + String get recentDmConversationsEmptyPlaceholderMessage; /// Page title for the 'Combined feed' message view. /// @@ -1669,15 +1771,13 @@ abstract class ZulipLocalizations { /// /// In en, this message translates to: /// **'You’re not subscribed to any channels yet.'** - String get channelsEmptyPlaceholder; + String get channelsEmptyPlaceholderHeader; /// Centered text on the 'Channels' page saying that there is no content to show, with a link to 'All channels'. /// /// In en, this message translates to: - /// **'You’re not subscribed to any channels yet. Try going to {allChannelsPageTitle} and joining some of them.'** - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ); + /// **'Try going to {allChannelsPageTitle} and joining some of them.'** + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle); /// Title for the page about sharing content received from other apps. /// diff --git a/lib/generated/l10n/zulip_localizations_ar.dart b/lib/generated/l10n/zulip_localizations_ar.dart index 1a292881ec..83e585eee7 100644 --- a/lib/generated/l10n/zulip_localizations_ar.dart +++ b/lib/generated/l10n/zulip_localizations_ar.dart @@ -74,7 +74,7 @@ class ZulipLocalizationsAr extends ZulipLocalizations { String get allChannelsPageTitle => 'All channels'; @override - String get allChannelsEmptyPlaceholder => + String get allChannelsEmptyPlaceholderHeader => 'There are no channels you can view in this organization.'; @override @@ -568,6 +568,68 @@ class ZulipLocalizationsAr extends ZulipLocalizations { @override String get emptyMessageList => 'There are no messages here.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'No search results.'; @@ -911,8 +973,12 @@ class ZulipLocalizationsAr extends ZulipLocalizations { String get inboxPageTitle => 'Inbox'; @override - String get inboxEmptyPlaceholder => - 'There are no unread messages in your inbox. Use the buttons below to view the combined feed or list of channels.'; + 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'; @@ -921,8 +987,12 @@ class ZulipLocalizationsAr extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Direct messages'; @override - String get recentDmConversationsEmptyPlaceholder => - 'You have no direct messages yet! Why not start the conversation?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Combined feed'; @@ -937,14 +1007,12 @@ class ZulipLocalizationsAr extends ZulipLocalizations { String get channelsPageTitle => 'Channels'; @override - String get channelsEmptyPlaceholder => + String get channelsEmptyPlaceholderHeader => 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'You’re not subscribed to any channels yet. Try going to $allChannelsPageTitle and joining some of them.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_de.dart b/lib/generated/l10n/zulip_localizations_de.dart index 06e2ea1a29..669931292d 100644 --- a/lib/generated/l10n/zulip_localizations_de.dart +++ b/lib/generated/l10n/zulip_localizations_de.dart @@ -74,8 +74,8 @@ class ZulipLocalizationsDe extends ZulipLocalizations { String get allChannelsPageTitle => 'Alle Kanäle'; @override - String get allChannelsEmptyPlaceholder => - 'Es gibt in dieser Organisation keine Kanäle die du ansehen kannst.'; + String get allChannelsEmptyPlaceholderHeader => + 'There are no channels you can view in this organization.'; @override String get profileButtonSendDirectMessage => 'Direktnachricht senden'; @@ -587,6 +587,68 @@ class ZulipLocalizationsDe extends ZulipLocalizations { @override String get emptyMessageList => 'Hier gibt es keine Nachrichten.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'Keine Suchergebnisse.'; @@ -936,8 +998,12 @@ class ZulipLocalizationsDe extends ZulipLocalizations { String get inboxPageTitle => 'Eingang'; @override - String get inboxEmptyPlaceholder => - 'Es sind keine ungelesenen Nachrichten in deinem Eingang. Verwende die Buttons unten, um den kombinierten Feed oder die Kanalliste anzusehen.'; + 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 => 'Direktnachrichten'; @@ -946,8 +1012,12 @@ class ZulipLocalizationsDe extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Direktnachrichten'; @override - String get recentDmConversationsEmptyPlaceholder => - 'Du hast noch keine Direktnachrichten! Warum nicht die Unterhaltung beginnen?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Kombinierter Feed'; @@ -962,13 +1032,12 @@ class ZulipLocalizationsDe extends ZulipLocalizations { String get channelsPageTitle => 'Kanäle'; @override - String get channelsEmptyPlaceholder => 'Du hast noch keine Kanäle abonniert.'; + String get channelsEmptyPlaceholderHeader => + 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'Du hast noch keine Kanäle abonniert. Probiere zu $allChannelsPageTitle zu gehen und ein paar von ihnen beizutreten.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_el.dart b/lib/generated/l10n/zulip_localizations_el.dart index ab2e6e686c..030966263c 100644 --- a/lib/generated/l10n/zulip_localizations_el.dart +++ b/lib/generated/l10n/zulip_localizations_el.dart @@ -74,7 +74,7 @@ class ZulipLocalizationsEl extends ZulipLocalizations { String get allChannelsPageTitle => 'All channels'; @override - String get allChannelsEmptyPlaceholder => + String get allChannelsEmptyPlaceholderHeader => 'There are no channels you can view in this organization.'; @override @@ -568,6 +568,68 @@ class ZulipLocalizationsEl extends ZulipLocalizations { @override String get emptyMessageList => 'There are no messages here.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'No search results.'; @@ -911,8 +973,12 @@ class ZulipLocalizationsEl extends ZulipLocalizations { String get inboxPageTitle => 'Inbox'; @override - String get inboxEmptyPlaceholder => - 'There are no unread messages in your inbox. Use the buttons below to view the combined feed or list of channels.'; + 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'; @@ -921,8 +987,12 @@ class ZulipLocalizationsEl extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Direct messages'; @override - String get recentDmConversationsEmptyPlaceholder => - 'You have no direct messages yet! Why not start the conversation?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Combined feed'; @@ -937,14 +1007,12 @@ class ZulipLocalizationsEl extends ZulipLocalizations { String get channelsPageTitle => 'Channels'; @override - String get channelsEmptyPlaceholder => + String get channelsEmptyPlaceholderHeader => 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'You’re not subscribed to any channels yet. Try going to $allChannelsPageTitle and joining some of them.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_en.dart b/lib/generated/l10n/zulip_localizations_en.dart index 80c1c2c475..03ae1f5571 100644 --- a/lib/generated/l10n/zulip_localizations_en.dart +++ b/lib/generated/l10n/zulip_localizations_en.dart @@ -74,7 +74,7 @@ class ZulipLocalizationsEn extends ZulipLocalizations { String get allChannelsPageTitle => 'All channels'; @override - String get allChannelsEmptyPlaceholder => + String get allChannelsEmptyPlaceholderHeader => 'There are no channels you can view in this organization.'; @override @@ -568,6 +568,68 @@ class ZulipLocalizationsEn extends ZulipLocalizations { @override String get emptyMessageList => 'There are no messages here.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'No search results.'; @@ -911,8 +973,12 @@ class ZulipLocalizationsEn extends ZulipLocalizations { String get inboxPageTitle => 'Inbox'; @override - String get inboxEmptyPlaceholder => - 'There are no unread messages in your inbox. Use the buttons below to view the combined feed or list of channels.'; + 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'; @@ -921,8 +987,12 @@ class ZulipLocalizationsEn extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Direct messages'; @override - String get recentDmConversationsEmptyPlaceholder => - 'You have no direct messages yet! Why not start the conversation?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Combined feed'; @@ -937,14 +1007,12 @@ class ZulipLocalizationsEn extends ZulipLocalizations { String get channelsPageTitle => 'Channels'; @override - String get channelsEmptyPlaceholder => + String get channelsEmptyPlaceholderHeader => 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'You’re not subscribed to any channels yet. Try going to $allChannelsPageTitle and joining some of them.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_es.dart b/lib/generated/l10n/zulip_localizations_es.dart index 7058e699fd..0756069a36 100644 --- a/lib/generated/l10n/zulip_localizations_es.dart +++ b/lib/generated/l10n/zulip_localizations_es.dart @@ -74,7 +74,7 @@ class ZulipLocalizationsEs extends ZulipLocalizations { String get allChannelsPageTitle => 'All channels'; @override - String get allChannelsEmptyPlaceholder => + String get allChannelsEmptyPlaceholderHeader => 'There are no channels you can view in this organization.'; @override @@ -568,6 +568,68 @@ class ZulipLocalizationsEs extends ZulipLocalizations { @override String get emptyMessageList => 'There are no messages here.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'No search results.'; @@ -911,8 +973,12 @@ class ZulipLocalizationsEs extends ZulipLocalizations { String get inboxPageTitle => 'Inbox'; @override - String get inboxEmptyPlaceholder => - 'There are no unread messages in your inbox. Use the buttons below to view the combined feed or list of channels.'; + 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'; @@ -921,8 +987,12 @@ class ZulipLocalizationsEs extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Direct messages'; @override - String get recentDmConversationsEmptyPlaceholder => - 'You have no direct messages yet! Why not start the conversation?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Combined feed'; @@ -937,14 +1007,12 @@ class ZulipLocalizationsEs extends ZulipLocalizations { String get channelsPageTitle => 'Channels'; @override - String get channelsEmptyPlaceholder => + String get channelsEmptyPlaceholderHeader => 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'You’re not subscribed to any channels yet. Try going to $allChannelsPageTitle and joining some of them.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_fr.dart b/lib/generated/l10n/zulip_localizations_fr.dart index 2e430ea046..ee92f30af5 100644 --- a/lib/generated/l10n/zulip_localizations_fr.dart +++ b/lib/generated/l10n/zulip_localizations_fr.dart @@ -75,7 +75,7 @@ class ZulipLocalizationsFr extends ZulipLocalizations { String get allChannelsPageTitle => 'All channels'; @override - String get allChannelsEmptyPlaceholder => + String get allChannelsEmptyPlaceholderHeader => 'There are no channels you can view in this organization.'; @override @@ -584,6 +584,68 @@ class ZulipLocalizationsFr extends ZulipLocalizations { @override String get emptyMessageList => 'There are no messages here.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'No search results.'; @@ -927,8 +989,12 @@ class ZulipLocalizationsFr extends ZulipLocalizations { String get inboxPageTitle => 'Boîte de réception'; @override - String get inboxEmptyPlaceholder => - 'Aucun message non lu dans votre boîte de réception. Utilisez les boutons ci-dessous pour voir le fil groupé ou la liste des chaînes.'; + 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 => 'Messages directs'; @@ -937,8 +1003,12 @@ class ZulipLocalizationsFr extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Messages directs'; @override - String get recentDmConversationsEmptyPlaceholder => - 'Vous n\'avez aucun message direct pour l\'instant ! Et si vous lanciez une conversation ?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Fil groupé'; @@ -953,14 +1023,12 @@ class ZulipLocalizationsFr extends ZulipLocalizations { String get channelsPageTitle => 'Chaînes'; @override - String get channelsEmptyPlaceholder => - 'Vous n\'êtes abonné à aucune chaîne pour l\'instant.'; + String get channelsEmptyPlaceholderHeader => + 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'Vous n\'êtes abonné à aucune chaîne pour l\'instant. Allez sur $allChannelsPageTitle pour vous abonner.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_he.dart b/lib/generated/l10n/zulip_localizations_he.dart index 16324eede7..c5d09ec112 100644 --- a/lib/generated/l10n/zulip_localizations_he.dart +++ b/lib/generated/l10n/zulip_localizations_he.dart @@ -74,7 +74,7 @@ class ZulipLocalizationsHe extends ZulipLocalizations { String get allChannelsPageTitle => 'All channels'; @override - String get allChannelsEmptyPlaceholder => + String get allChannelsEmptyPlaceholderHeader => 'There are no channels you can view in this organization.'; @override @@ -568,6 +568,68 @@ class ZulipLocalizationsHe extends ZulipLocalizations { @override String get emptyMessageList => 'There are no messages here.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'No search results.'; @@ -911,8 +973,12 @@ class ZulipLocalizationsHe extends ZulipLocalizations { String get inboxPageTitle => 'Inbox'; @override - String get inboxEmptyPlaceholder => - 'There are no unread messages in your inbox. Use the buttons below to view the combined feed or list of channels.'; + 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'; @@ -921,8 +987,12 @@ class ZulipLocalizationsHe extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Direct messages'; @override - String get recentDmConversationsEmptyPlaceholder => - 'You have no direct messages yet! Why not start the conversation?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Combined feed'; @@ -937,14 +1007,12 @@ class ZulipLocalizationsHe extends ZulipLocalizations { String get channelsPageTitle => 'Channels'; @override - String get channelsEmptyPlaceholder => + String get channelsEmptyPlaceholderHeader => 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'You’re not subscribed to any channels yet. Try going to $allChannelsPageTitle and joining some of them.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_hu.dart b/lib/generated/l10n/zulip_localizations_hu.dart index 4e3da8f3ef..1b8d14b673 100644 --- a/lib/generated/l10n/zulip_localizations_hu.dart +++ b/lib/generated/l10n/zulip_localizations_hu.dart @@ -74,7 +74,7 @@ class ZulipLocalizationsHu extends ZulipLocalizations { String get allChannelsPageTitle => 'All channels'; @override - String get allChannelsEmptyPlaceholder => + String get allChannelsEmptyPlaceholderHeader => 'There are no channels you can view in this organization.'; @override @@ -568,6 +568,68 @@ class ZulipLocalizationsHu extends ZulipLocalizations { @override String get emptyMessageList => 'There are no messages here.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'No search results.'; @@ -911,8 +973,12 @@ class ZulipLocalizationsHu extends ZulipLocalizations { String get inboxPageTitle => 'Inbox'; @override - String get inboxEmptyPlaceholder => - 'There are no unread messages in your inbox. Use the buttons below to view the combined feed or list of channels.'; + 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'; @@ -921,8 +987,12 @@ class ZulipLocalizationsHu extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Direct messages'; @override - String get recentDmConversationsEmptyPlaceholder => - 'You have no direct messages yet! Why not start the conversation?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Combined feed'; @@ -937,14 +1007,12 @@ class ZulipLocalizationsHu extends ZulipLocalizations { String get channelsPageTitle => 'Channels'; @override - String get channelsEmptyPlaceholder => + String get channelsEmptyPlaceholderHeader => 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'You’re not subscribed to any channels yet. Try going to $allChannelsPageTitle and joining some of them.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_it.dart b/lib/generated/l10n/zulip_localizations_it.dart index 5d5dd0e278..bb32dfb720 100644 --- a/lib/generated/l10n/zulip_localizations_it.dart +++ b/lib/generated/l10n/zulip_localizations_it.dart @@ -75,7 +75,7 @@ class ZulipLocalizationsIt extends ZulipLocalizations { String get allChannelsPageTitle => 'Titolo per la pagina \"Tutti i canali\".'; @override - String get allChannelsEmptyPlaceholder => + String get allChannelsEmptyPlaceholderHeader => 'There are no channels you can view in this organization.'; @override @@ -581,6 +581,68 @@ class ZulipLocalizationsIt extends ZulipLocalizations { @override String get emptyMessageList => 'There are no messages here.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'No search results.'; @@ -930,8 +992,12 @@ class ZulipLocalizationsIt extends ZulipLocalizations { String get inboxPageTitle => 'Inbox'; @override - String get inboxEmptyPlaceholder => - 'Non ci sono messaggi non letti nella posta in arrivo. Usare i pulsanti sotto per visualizzare il feed combinato o l\'elenco dei canali.'; + 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 => 'Messaggi diretti'; @@ -940,8 +1006,12 @@ class ZulipLocalizationsIt extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Messaggi diretti'; @override - String get recentDmConversationsEmptyPlaceholder => - 'Non ci sono ancora messaggi diretti! Perché non iniziare la conversazione?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Feed combinato'; @@ -956,14 +1026,12 @@ class ZulipLocalizationsIt extends ZulipLocalizations { String get channelsPageTitle => 'Canali'; @override - String get channelsEmptyPlaceholder => - 'Non sei ancora iscritto ad alcun canale.'; + String get channelsEmptyPlaceholderHeader => + 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'You’re not subscribed to any channels yet. Try going to $allChannelsPageTitle and joining some of them.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_ja.dart b/lib/generated/l10n/zulip_localizations_ja.dart index eae3a0c3eb..c8b31c5e52 100644 --- a/lib/generated/l10n/zulip_localizations_ja.dart +++ b/lib/generated/l10n/zulip_localizations_ja.dart @@ -73,7 +73,7 @@ class ZulipLocalizationsJa extends ZulipLocalizations { String get allChannelsPageTitle => 'All channels'; @override - String get allChannelsEmptyPlaceholder => + String get allChannelsEmptyPlaceholderHeader => 'There are no channels you can view in this organization.'; @override @@ -556,6 +556,68 @@ class ZulipLocalizationsJa extends ZulipLocalizations { @override String get emptyMessageList => 'ここにはメッセージがありません。'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => '検索結果はありません。'; @@ -891,8 +953,12 @@ class ZulipLocalizationsJa extends ZulipLocalizations { String get inboxPageTitle => '受信箱'; @override - String get inboxEmptyPlaceholder => - '未読メッセージはありません。下のボタンから、統合フィードまたはチャンネル一覧を表示できます。'; + 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 => 'ダイレクトメッセージ'; @@ -901,8 +967,12 @@ class ZulipLocalizationsJa extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'ダイレクトメッセージ'; @override - String get recentDmConversationsEmptyPlaceholder => - 'まだダイレクトメッセージはありません!会話を始めてみませんか?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => '統合フィード'; @@ -917,13 +987,12 @@ class ZulipLocalizationsJa extends ZulipLocalizations { String get channelsPageTitle => 'チャンネル'; @override - String get channelsEmptyPlaceholder => 'まだ参加しているチャンネルはありません。'; + String get channelsEmptyPlaceholderHeader => + 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'You’re not subscribed to any channels yet. Try going to $allChannelsPageTitle and joining some of them.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_nb.dart b/lib/generated/l10n/zulip_localizations_nb.dart index cc2c5e1852..ae3e3c1fef 100644 --- a/lib/generated/l10n/zulip_localizations_nb.dart +++ b/lib/generated/l10n/zulip_localizations_nb.dart @@ -74,7 +74,7 @@ class ZulipLocalizationsNb extends ZulipLocalizations { String get allChannelsPageTitle => 'All channels'; @override - String get allChannelsEmptyPlaceholder => + String get allChannelsEmptyPlaceholderHeader => 'There are no channels you can view in this organization.'; @override @@ -568,6 +568,68 @@ class ZulipLocalizationsNb extends ZulipLocalizations { @override String get emptyMessageList => 'There are no messages here.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'No search results.'; @@ -911,8 +973,12 @@ class ZulipLocalizationsNb extends ZulipLocalizations { String get inboxPageTitle => 'Inbox'; @override - String get inboxEmptyPlaceholder => - 'There are no unread messages in your inbox. Use the buttons below to view the combined feed or list of channels.'; + 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'; @@ -921,8 +987,12 @@ class ZulipLocalizationsNb extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Direct messages'; @override - String get recentDmConversationsEmptyPlaceholder => - 'You have no direct messages yet! Why not start the conversation?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Combined feed'; @@ -937,14 +1007,12 @@ class ZulipLocalizationsNb extends ZulipLocalizations { String get channelsPageTitle => 'Channels'; @override - String get channelsEmptyPlaceholder => + String get channelsEmptyPlaceholderHeader => 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'You’re not subscribed to any channels yet. Try going to $allChannelsPageTitle and joining some of them.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_pl.dart b/lib/generated/l10n/zulip_localizations_pl.dart index b038e14fed..fdacfce947 100644 --- a/lib/generated/l10n/zulip_localizations_pl.dart +++ b/lib/generated/l10n/zulip_localizations_pl.dart @@ -74,8 +74,8 @@ class ZulipLocalizationsPl extends ZulipLocalizations { String get allChannelsPageTitle => 'Wszystkie kanały'; @override - String get allChannelsEmptyPlaceholder => - 'Brak kanałów, które możesz przeglądać w tej organizacji.'; + String get allChannelsEmptyPlaceholderHeader => + 'There are no channels you can view in this organization.'; @override String get profileButtonSendDirectMessage => 'Wyślij wiadomość bezpośrednią'; @@ -581,6 +581,68 @@ class ZulipLocalizationsPl extends ZulipLocalizations { @override String get emptyMessageList => 'Póki co brak wiadomości.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'Brak wyników wyszukiwania.'; @@ -927,8 +989,12 @@ class ZulipLocalizationsPl extends ZulipLocalizations { String get inboxPageTitle => 'Odebrane'; @override - String get inboxEmptyPlaceholder => - 'Obecnie brak nowych wiadomości. Skorzystaj z przycisków u dołu ekranu aby przejść do widoku mieszanego lub listy kanałów.'; + 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 => 'Wiadomości bezpośrednie'; @@ -937,8 +1003,12 @@ class ZulipLocalizationsPl extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Wiadomości bezpośrednie'; @override - String get recentDmConversationsEmptyPlaceholder => - 'Brak wiadomości w archiwum! Może warto rozpocząć dyskusję?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Mieszany widok'; @@ -953,13 +1023,12 @@ class ZulipLocalizationsPl extends ZulipLocalizations { String get channelsPageTitle => 'Kanały'; @override - String get channelsEmptyPlaceholder => 'Nie śledzisz żadnego z kanałów.'; + String get channelsEmptyPlaceholderHeader => + 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'Nie śledzisz żadnego z kanałów. Sprawdź dostępne $allChannelsPageTitle i dołącz do części z nich.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_ru.dart b/lib/generated/l10n/zulip_localizations_ru.dart index e13c7cc1a6..275ba49c42 100644 --- a/lib/generated/l10n/zulip_localizations_ru.dart +++ b/lib/generated/l10n/zulip_localizations_ru.dart @@ -74,8 +74,8 @@ class ZulipLocalizationsRu extends ZulipLocalizations { String get allChannelsPageTitle => 'Все каналы'; @override - String get allChannelsEmptyPlaceholder => - 'В этой организации нет доступных вам для просмотра каналов.'; + String get allChannelsEmptyPlaceholderHeader => + 'There are no channels you can view in this organization.'; @override String get profileButtonSendDirectMessage => 'Отправить личное сообщение'; @@ -582,6 +582,68 @@ class ZulipLocalizationsRu extends ZulipLocalizations { @override String get emptyMessageList => 'Здесь нет сообщений.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'Ничего не найдено.'; @@ -936,8 +998,12 @@ class ZulipLocalizationsRu extends ZulipLocalizations { String get inboxPageTitle => 'Входящие'; @override - String get inboxEmptyPlaceholder => - 'Нет непрочитанных входящих сообщений. Используйте кнопки ниже для просмотра объединенной ленты или списка каналов.'; + 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 => 'Личные сообщения'; @@ -946,8 +1012,12 @@ class ZulipLocalizationsRu extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Личные сообщения'; @override - String get recentDmConversationsEmptyPlaceholder => - 'У вас пока нет личных сообщений! Почему бы не начать беседу?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Объединенная лента'; @@ -962,14 +1032,12 @@ class ZulipLocalizationsRu extends ZulipLocalizations { String get channelsPageTitle => 'Каналы'; @override - String get channelsEmptyPlaceholder => - 'Вы ещё не подписаны ни на один канал.'; + String get channelsEmptyPlaceholderHeader => + 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'Вы ещё не подписаны ни на один канал. Можете посмотреть $allChannelsPageTitle и подписаться на какие-то из них.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_sk.dart b/lib/generated/l10n/zulip_localizations_sk.dart index ca321e40a6..c01152d607 100644 --- a/lib/generated/l10n/zulip_localizations_sk.dart +++ b/lib/generated/l10n/zulip_localizations_sk.dart @@ -74,7 +74,7 @@ class ZulipLocalizationsSk extends ZulipLocalizations { String get allChannelsPageTitle => 'All channels'; @override - String get allChannelsEmptyPlaceholder => + String get allChannelsEmptyPlaceholderHeader => 'There are no channels you can view in this organization.'; @override @@ -568,6 +568,68 @@ class ZulipLocalizationsSk extends ZulipLocalizations { @override String get emptyMessageList => 'There are no messages here.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'No search results.'; @@ -913,8 +975,12 @@ class ZulipLocalizationsSk extends ZulipLocalizations { String get inboxPageTitle => 'Inbox'; @override - String get inboxEmptyPlaceholder => - 'There are no unread messages in your inbox. Use the buttons below to view the combined feed or list of channels.'; + 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 => 'Priama správa'; @@ -923,8 +989,12 @@ class ZulipLocalizationsSk extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Direct messages'; @override - String get recentDmConversationsEmptyPlaceholder => - 'You have no direct messages yet! Why not start the conversation?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Zlúčený kanál'; @@ -939,14 +1009,12 @@ class ZulipLocalizationsSk extends ZulipLocalizations { String get channelsPageTitle => 'Kanály'; @override - String get channelsEmptyPlaceholder => + String get channelsEmptyPlaceholderHeader => 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'You’re not subscribed to any channels yet. Try going to $allChannelsPageTitle and joining some of them.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_sl.dart b/lib/generated/l10n/zulip_localizations_sl.dart index 4c34d94983..77ca38bbe6 100644 --- a/lib/generated/l10n/zulip_localizations_sl.dart +++ b/lib/generated/l10n/zulip_localizations_sl.dart @@ -73,8 +73,8 @@ class ZulipLocalizationsSl extends ZulipLocalizations { String get allChannelsPageTitle => 'Vsi kanali'; @override - String get allChannelsEmptyPlaceholder => - 'V tej organizaciji ni kanalov, ki bi si jih lahko ogledali.'; + String get allChannelsEmptyPlaceholderHeader => + 'There are no channels you can view in this organization.'; @override String get profileButtonSendDirectMessage => 'Pošlji neposredno sporočilo'; @@ -593,6 +593,68 @@ class ZulipLocalizationsSl extends ZulipLocalizations { @override String get emptyMessageList => 'Tukaj ni sporočil.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'Ni zadetkov iskanja.'; @@ -947,8 +1009,12 @@ class ZulipLocalizationsSl extends ZulipLocalizations { String get inboxPageTitle => 'Nabiralnik'; @override - String get inboxEmptyPlaceholder => - 'V vašem nabiralniku ni neprebranih sporočil. Uporabite spodnje gumbe za ogled združenega prikaza ali seznama kanalov.'; + 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 => 'Neposredna sporočila'; @@ -957,8 +1023,12 @@ class ZulipLocalizationsSl extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Neposredna sporočila'; @override - String get recentDmConversationsEmptyPlaceholder => - 'Zaenkrat še nimate neposrednih sporočil! Zakaj ne bi začeli pogovora?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Združen prikaz'; @@ -973,13 +1043,12 @@ class ZulipLocalizationsSl extends ZulipLocalizations { String get channelsPageTitle => 'Kanali'; @override - String get channelsEmptyPlaceholder => 'Niste še naročeni na noben kanal.'; + String get channelsEmptyPlaceholderHeader => + 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'Naročeni še niste na noben kanal. Poskusite odpreti $allChannelsPageTitle in se pridružiti kateremu od njih.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_uk.dart b/lib/generated/l10n/zulip_localizations_uk.dart index d9bc2ae98c..fb0cd0c57a 100644 --- a/lib/generated/l10n/zulip_localizations_uk.dart +++ b/lib/generated/l10n/zulip_localizations_uk.dart @@ -74,8 +74,8 @@ class ZulipLocalizationsUk extends ZulipLocalizations { String get allChannelsPageTitle => 'Усі канали'; @override - String get allChannelsEmptyPlaceholder => - 'У цій організації немає каналів, які ви можете переглянути.'; + String get allChannelsEmptyPlaceholderHeader => + 'There are no channels you can view in this organization.'; @override String get profileButtonSendDirectMessage => @@ -582,6 +582,68 @@ class ZulipLocalizationsUk extends ZulipLocalizations { @override String get emptyMessageList => 'Тут немає повідомлень.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'Немає результатів пошуку.'; @@ -928,8 +990,12 @@ class ZulipLocalizationsUk extends ZulipLocalizations { String get inboxPageTitle => 'Вхідні'; @override - String get inboxEmptyPlaceholder => - 'Немає непрочитаних вхідних повідомлень. Використовуйте кнопки знизу для перегляду обʼєднаної стрічки або списку каналів.'; + 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 => 'Особисті повідомлення'; @@ -938,8 +1004,12 @@ class ZulipLocalizationsUk extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Особисті повідомлення'; @override - String get recentDmConversationsEmptyPlaceholder => - 'У вас поки що немає особистих повідомлень! Чому б не розпочати бесіду?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Об\'єднана стрічка'; @@ -954,13 +1024,12 @@ class ZulipLocalizationsUk extends ZulipLocalizations { String get channelsPageTitle => 'Канали'; @override - String get channelsEmptyPlaceholder => 'Ви ще не підписані на жодний канал.'; + String get channelsEmptyPlaceholderHeader => + 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'Ви ще не підписані на жодний канал. Спробуйте перейти за посиланням $allChannelsPageTitle та приєднатися до деяких із них.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override diff --git a/lib/generated/l10n/zulip_localizations_zh.dart b/lib/generated/l10n/zulip_localizations_zh.dart index 9a5015cf01..0130d421a5 100644 --- a/lib/generated/l10n/zulip_localizations_zh.dart +++ b/lib/generated/l10n/zulip_localizations_zh.dart @@ -74,7 +74,7 @@ class ZulipLocalizationsZh extends ZulipLocalizations { String get allChannelsPageTitle => 'All channels'; @override - String get allChannelsEmptyPlaceholder => + String get allChannelsEmptyPlaceholderHeader => 'There are no channels you can view in this organization.'; @override @@ -568,6 +568,68 @@ class ZulipLocalizationsZh extends ZulipLocalizations { @override String get emptyMessageList => 'There are no messages here.'; + @override + String get emptyMessageListCombinedFeed => + 'There are no messages in your combined feed.'; + + @override + String get emptyMessageListChannelWithoutContentAccess => + 'You don’t have content access to this channel.'; + + @override + String get emptyMessageListChannelUnavailable => + 'This channel doesn’t exist, or you are not allowed to view it.'; + + @override + String get emptyMessageListSelfDmHeader => + 'You have not sent any direct messages to yourself yet!'; + + @override + String get emptyMessageListSelfDmMessage => + 'Use this space for personal notes, or to test out Zulip features.'; + + @override + String emptyMessageListDm(String person) { + return 'You have no direct messages with $person yet.'; + } + + @override + String emptyMessageListDmDeactivatedUser(String person) { + return 'You have no direct messages with $person.'; + } + + @override + String get emptyMessageListDmUnknownUser => + 'You have no direct messages with this user.'; + + @override + String get emptyMessageListGroupDm => + 'You have no direct messages with these users yet.'; + + @override + String get emptyMessageListGroupDmDeactivatedUser => + 'You have no direct messages with these users.'; + + @override + String get emptyMessageListDmStartConversation => + 'Why not start the conversation?'; + + @override + String get emptyMessageListMentionsHeader => + 'This view will show messages where you are mentioned.'; + + @override + String get emptyMessageListMentionsMessage => + 'To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you’d like to mention from the list of suggestions.'; + + @override + String get emptyMessageListStarredHeader => 'You have no starred messages.'; + + @override + String emptyMessageListStarredMessage(String button) { + return 'Starring is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, long-press it and tap “$button.”'; + } + @override String get emptyMessageListSearch => 'No search results.'; @@ -911,8 +973,12 @@ class ZulipLocalizationsZh extends ZulipLocalizations { String get inboxPageTitle => 'Inbox'; @override - String get inboxEmptyPlaceholder => - 'There are no unread messages in your inbox. Use the buttons below to view the combined feed or list of channels.'; + 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'; @@ -921,8 +987,12 @@ class ZulipLocalizationsZh extends ZulipLocalizations { String get recentDmConversationsSectionHeader => 'Direct messages'; @override - String get recentDmConversationsEmptyPlaceholder => - 'You have no direct messages yet! Why not start the conversation?'; + String get recentDmConversationsEmptyPlaceholderHeader => + 'You have no direct messages yet!'; + + @override + String get recentDmConversationsEmptyPlaceholderMessage => + 'Why not start a conversation?'; @override String get combinedFeedPageTitle => 'Combined feed'; @@ -937,14 +1007,12 @@ class ZulipLocalizationsZh extends ZulipLocalizations { String get channelsPageTitle => 'Channels'; @override - String get channelsEmptyPlaceholder => + String get channelsEmptyPlaceholderHeader => 'You’re not subscribed to any channels yet.'; @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return 'You’re not subscribed to any channels yet. Try going to $allChannelsPageTitle and joining some of them.'; + String channelsEmptyPlaceholderMessage(String allChannelsPageTitle) { + return 'Try going to $allChannelsPageTitle and joining some of them.'; } @override @@ -1232,9 +1300,6 @@ class ZulipLocalizationsZhHansCn extends ZulipLocalizationsZh { @override String get allChannelsPageTitle => '所有频道'; - @override - String get allChannelsEmptyPlaceholder => '在该组织里你没有可以查看的频道。'; - @override String get profileButtonSendDirectMessage => '发送私信'; @@ -2024,18 +2089,12 @@ class ZulipLocalizationsZhHansCn extends ZulipLocalizationsZh { @override String get inboxPageTitle => '收件箱'; - @override - String get inboxEmptyPlaceholder => '您的收件箱中没有未读消息。您可以通过底部导航栏访问综合消息或者频道列表。'; - @override String get recentDmConversationsPageTitle => '私信'; @override String get recentDmConversationsSectionHeader => '私信'; - @override - String get recentDmConversationsEmptyPlaceholder => '您还没有任何私信消息!何不开启一个新对话?'; - @override String get combinedFeedPageTitle => '综合消息'; @@ -2048,16 +2107,6 @@ class ZulipLocalizationsZhHansCn extends ZulipLocalizationsZh { @override String get channelsPageTitle => '频道'; - @override - String get channelsEmptyPlaceholder => '您还没有订阅任何频道。'; - - @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return '你还没订阅任何频道。可以访问 $allChannelsPageTitle然后加入。'; - } - @override String get sharePageTitle => '分享'; @@ -2338,9 +2387,6 @@ class ZulipLocalizationsZhHantTw extends ZulipLocalizationsZh { @override String get allChannelsPageTitle => '所有頻道'; - @override - String get allChannelsEmptyPlaceholder => '在此組織中沒有您可以查看的頻道。'; - @override String get profileButtonSendDirectMessage => '發送私訊'; @@ -3149,18 +3195,12 @@ class ZulipLocalizationsZhHantTw extends ZulipLocalizationsZh { @override String get inboxPageTitle => '收件匣'; - @override - String get inboxEmptyPlaceholder => '您的收件匣中沒有未讀訊息。請使用下方按鈕查看整合訊息流或頻道清單。'; - @override String get recentDmConversationsPageTitle => '私人訊息'; @override String get recentDmConversationsSectionHeader => '私人訊息'; - @override - String get recentDmConversationsEmptyPlaceholder => '您尚未有任何私人訊息!不如開始一段對話吧?'; - @override String get combinedFeedPageTitle => '綜合饋給'; @@ -3173,16 +3213,6 @@ class ZulipLocalizationsZhHantTw extends ZulipLocalizationsZh { @override String get channelsPageTitle => '頻道'; - @override - String get channelsEmptyPlaceholder => '您尚未訂閱任何頻道。'; - - @override - String channelsEmptyPlaceholderWithAllChannelsLink( - String allChannelsPageTitle, - ) { - return '您尚未訂閱任何頻道。請前往 $allChannelsPageTitle 並加入一些頻道。'; - } - @override String get sharePageTitle => '分享'; diff --git a/lib/widgets/all_channels.dart b/lib/widgets/all_channels.dart index 3aaf0d8baf..304cbbaffd 100644 --- a/lib/widgets/all_channels.dart +++ b/lib/widgets/all_channels.dart @@ -54,7 +54,7 @@ class AllChannelsPageBody extends StatelessWidget { if (channels.isEmpty) { return PageBodyEmptyContentPlaceholder( - message: zulipLocalizations.allChannelsEmptyPlaceholder); + header: zulipLocalizations.allChannelsEmptyPlaceholderHeader); } final items = channels.values.toList(); diff --git a/lib/widgets/inbox.dart b/lib/widgets/inbox.dart index 24832480c0..00887b17ff 100644 --- a/lib/widgets/inbox.dart +++ b/lib/widgets/inbox.dart @@ -165,7 +165,8 @@ class _InboxPageState extends State with PerAccountStoreAwareStat if (sections.isEmpty) { return PageBodyEmptyContentPlaceholder( // TODO(#315) add e.g. "You might be interested in recent conversations." - message: zulipLocalizations.inboxEmptyPlaceholder); + header: zulipLocalizations.inboxEmptyPlaceholderHeader, + message: zulipLocalizations.inboxEmptyPlaceholderMessage); } return SafeArea( // horizontal insets diff --git a/lib/widgets/message_list.dart b/lib/widgets/message_list.dart index 4802a3b93f..6b4a6f325c 100644 --- a/lib/widgets/message_list.dart +++ b/lib/widgets/message_list.dart @@ -1027,19 +1027,10 @@ class _MessageListState extends State with PerAccountStoreAwareStat @override Widget build(BuildContext context) { - final zulipLocalizations = ZulipLocalizations.of(context); - if (!model.fetched) return const Center(child: CircularProgressIndicator()); if (model.items.isEmpty && model.haveNewest && model.haveOldest) { - final String message; - if (widget.narrow is KeywordSearchNarrow) { - message = zulipLocalizations.emptyMessageListSearch; - } else { - message = zulipLocalizations.emptyMessageList; - } - - return PageBodyEmptyContentPlaceholder(message: message); + return _EmptyContentPlaceholder(narrow: widget.narrow); } // Pad the left and right insets, for small devices in landscape. @@ -1265,6 +1256,92 @@ class _MessageListState extends State with PerAccountStoreAwareStat } } +class _EmptyContentPlaceholder extends StatelessWidget { + const _EmptyContentPlaceholder({required this.narrow}); + + final Narrow narrow; + + @override + Widget build(BuildContext context) { + final store = PerAccountStoreWidget.of(context); + final zulipLocalizations = ZulipLocalizations.of(context); + + switch (narrow) { + case CombinedFeedNarrow(): + return PageBodyEmptyContentPlaceholder( + header: zulipLocalizations.emptyMessageListCombinedFeed); + case ChannelNarrow(:final streamId) || TopicNarrow(:final streamId): + final channel = store.streams[streamId]; + if (channel == null) { + return PageBodyEmptyContentPlaceholder( + header: zulipLocalizations.emptyMessageListChannelUnavailable); + } else if (!store.selfHasContentAccess(channel)) { + return PageBodyEmptyContentPlaceholder( + headerWithLinkMarkup: zulipLocalizations.emptyMessageListChannelWithoutContentAccess, + onTapHeaderLink: () => PlatformActions.launchUrl(context, + store.tryResolveUrl('/help/channel-permissions')!)); + } else { + return PageBodyEmptyContentPlaceholder( + header: zulipLocalizations.emptyMessageList); + } + case DmNarrow(:final otherRecipientIds) when otherRecipientIds.isEmpty: + return PageBodyEmptyContentPlaceholder( + header: zulipLocalizations.emptyMessageListSelfDmHeader, + message: zulipLocalizations.emptyMessageListSelfDmMessage); + case DmNarrow(:final otherRecipientIds) when otherRecipientIds.length == 1: + final user = store.getUser(otherRecipientIds.single); + switch (user) { + case null: + return PageBodyEmptyContentPlaceholder( + header: zulipLocalizations.emptyMessageListDmUnknownUser); + case User(isActive: false): + return PageBodyEmptyContentPlaceholder( + header: zulipLocalizations.emptyMessageListDmDeactivatedUser( + store.userDisplayName(user.userId, replaceIfMuted: false))); + case User(): + final displayName = store.userDisplayName(user.userId, replaceIfMuted: false); + return PageBodyEmptyContentPlaceholder( + header: zulipLocalizations.emptyMessageListDm(displayName), + message: store.isUserMuted(user.userId) + ? null + : zulipLocalizations.emptyMessageListDmStartConversation, + ); + } + case DmNarrow(:final otherRecipientIds) + when otherRecipientIds.any((userId) { + final user = store.getUser(userId); + return user != null && !user.isActive; + }): + return PageBodyEmptyContentPlaceholder( + header: zulipLocalizations.emptyMessageListGroupDmDeactivatedUser); + case DmNarrow(): + return PageBodyEmptyContentPlaceholder( + header: zulipLocalizations.emptyMessageListGroupDm, + message: zulipLocalizations.emptyMessageListDmStartConversation); + case MentionsNarrow(): + return PageBodyEmptyContentPlaceholder( + headerWithLinkMarkup: zulipLocalizations.emptyMessageListMentionsHeader, + onTapHeaderLink: () => PlatformActions.launchUrl(context, + store.tryResolveUrl('/help/mention-a-user-or-group')!), + message: store.zulipFeatureLevel >= 224 + // This string mentions @topic, which is new in Server 8. + ? zulipLocalizations.emptyMessageListMentionsMessage + : null, // TODO(server-8) + ); + case StarredMessagesNarrow(): + return PageBodyEmptyContentPlaceholder( + header: zulipLocalizations.emptyMessageListStarredHeader, + messageWithLinkMarkup: zulipLocalizations.emptyMessageListStarredMessage( + zulipLocalizations.actionSheetOptionStarMessage), + onTapMessageLink: () => PlatformActions.launchUrl(context, + store.tryResolveUrl('/help/star-a-message')!)); + case KeywordSearchNarrow(): + return PageBodyEmptyContentPlaceholder( + header: zulipLocalizations.emptyMessageListSearch); + } + } +} + class _MessageListHistoryStart extends StatelessWidget { const _MessageListHistoryStart(); diff --git a/lib/widgets/page.dart b/lib/widgets/page.dart index 63a78951f5..098515a76b 100644 --- a/lib/widgets/page.dart +++ b/lib/widgets/page.dart @@ -216,6 +216,8 @@ class LoadingPlaceholderPage extends StatelessWidget { /// /// Suitable for the inbox, the message-list page, etc. /// +/// Specify a header and optionally a message. +/// /// This handles the horizontal device insets /// and the bottom inset when needed (in a message list with no compose box). /// The top inset is handled externally by the app bar. @@ -228,16 +230,47 @@ class LoadingPlaceholderPage extends StatelessWidget { class PageBodyEmptyContentPlaceholder extends StatelessWidget { const PageBodyEmptyContentPlaceholder({ super.key, + this.header, + this.headerWithLinkMarkup, + this.onTapHeaderLink, this.message, this.messageWithLinkMarkup, - this.onTapLink, - }) : assert( - (message != null) - ^ (messageWithLinkMarkup != null && onTapLink != null)); + this.onTapMessageLink, + }); + final String? header; + final String? headerWithLinkMarkup; + final VoidCallback? onTapHeaderLink; final String? message; final String? messageWithLinkMarkup; - final VoidCallback? onTapLink; + final VoidCallback? onTapMessageLink; + + TextStyle _headerStyle(BuildContext context) { + final designVariables = DesignVariables.of(context); + + return TextStyle( + color: designVariables.labelSearchPrompt, + fontSize: 22, + height: 1.30, + ).merge(weightVariableTextStyle(context, wght: 600)); + } + + Widget? _buildHeader(BuildContext context) { + if (header != null) { + return Text( + textAlign: TextAlign.center, + style: _headerStyle(context), + header!); + } + if (headerWithLinkMarkup != null) { + return TextWithLink( + onTap: onTapHeaderLink!, + textAlign: TextAlign.center, + style: _headerStyle(context), + markup: headerWithLinkMarkup!); + } + return null; + } TextStyle _messageStyle(BuildContext context) { final designVariables = DesignVariables.of(context); @@ -258,25 +291,34 @@ class PageBodyEmptyContentPlaceholder extends StatelessWidget { } if (messageWithLinkMarkup != null) { return TextWithLink( - onTap: onTapLink!, + onTap: onTapMessageLink!, textAlign: TextAlign.center, style: _messageStyle(context), markup: messageWithLinkMarkup!); } - assert(false); return null; } @override Widget build(BuildContext context) { + final header = _buildHeader(context); + final message = _buildMessage(context); + assert(header != null); + return SafeArea( minimum: EdgeInsets.fromLTRB(24, 0, 24, 16), child: Padding( padding: EdgeInsets.only(top: 48), child: Align( alignment: Alignment.topCenter, - // TODO leading and trailing elements, like in Figma (given as SVGs): - // https://www.figma.com/design/1JTNtYo9memgW7vV6d0ygq/Zulip-Mobile?node-id=5957-167736&m=dev - child: _buildMessage(context)))); + child: Column( + spacing: 16, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // TODO leading and trailing elements, like in Figma (given as SVGs): + // https://www.figma.com/design/1JTNtYo9memgW7vV6d0ygq/Zulip-Mobile?node-id=5957-167736&m=dev + ?header, + ?message, + ])))); } } diff --git a/lib/widgets/recent_dm_conversations.dart b/lib/widgets/recent_dm_conversations.dart index 719568e73d..36f6a40aab 100644 --- a/lib/widgets/recent_dm_conversations.dart +++ b/lib/widgets/recent_dm_conversations.dart @@ -107,7 +107,8 @@ class _RecentDmConversationsPageBodyState extends State wit if (pinned.isEmpty && unpinned.isEmpty) { if (includeAllChannelsButton) { return PageBodyEmptyContentPlaceholder( + header: zulipLocalizations.channelsEmptyPlaceholderHeader, messageWithLinkMarkup: - zulipLocalizations.channelsEmptyPlaceholderWithAllChannelsLink( + zulipLocalizations.channelsEmptyPlaceholderMessage( zulipLocalizations.allChannelsPageTitle), - onTapLink: () => Navigator.push(context, + onTapMessageLink: () => Navigator.push(context, AllChannelsPage.buildRoute(context: context))); } else { return PageBodyEmptyContentPlaceholder( - message: zulipLocalizations.channelsEmptyPlaceholder); + header: zulipLocalizations.channelsEmptyPlaceholderHeader); } } diff --git a/test/widgets/message_list_test.dart b/test/widgets/message_list_test.dart index acdde3fd2c..e349c0a146 100644 --- a/test/widgets/message_list_test.dart +++ b/test/widgets/message_list_test.dart @@ -371,9 +371,219 @@ void main() { Finder findTextInPlaceholder(String text) => find.descendant(of: findPlaceholder, matching: find.textContaining(text)); + Future checkLink(WidgetTester tester, { + required String linkText, required Uri expectedUrl}) async { + await tester.tapOnText(find.textRange.ofSubstring(linkText)); + final (url: url, mode: _) = testBinding.takeLaunchUrlCalls().single; + check(url).equals(expectedUrl); + } + testWidgets('Combined feed', (tester) async { await setupMessageListPage(tester, narrow: CombinedFeedNarrow(), messages: []); - check(findTextInPlaceholder('There are no messages here.')).findsOne(); + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder('combined feed')).findsOne(); + }); + + testWidgets('Subscribed channel', (tester) async { + final channel = eg.stream(); + await setupMessageListPage(tester, + narrow: ChannelNarrow(channel.streamId), messages: [], streams: [channel], + skipPumpAndSettle: true); + + // The topic input is autofocused, triggering topic autocomplete. + connection.prepare(json: GetStreamTopicsResult(topics: []).toJson()); + await tester.pumpAndSettle(); + + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder('no messages')).findsOne(); + }); + + testWidgets('Channel without content access', (tester) async { + final channel = eg.stream(inviteOnly: true); + await setupMessageListPage(tester, + narrow: ChannelNarrow(channel.streamId), messages: [], streams: [channel], + skipPumpAndSettle: true); + + // The topic input is autofocused, triggering topic autocomplete. + connection.prepare(json: GetStreamTopicsResult(topics: []).toJson()); + await tester.pumpAndSettle(); + + check(store.selfHasContentAccess(channel)).isFalse(); + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder('content access')).findsOne(); + await checkLink(tester, + linkText: 'content access', + expectedUrl: store.tryResolveUrl('/help/channel-permissions')!); + }); + + testWidgets('Unknown channel', (tester) async { + final channel = eg.stream(); + await setupMessageListPage(tester, + narrow: ChannelNarrow(channel.streamId), messages: [], streams: []); + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder('This channel doesn’t exist, or you are not allowed to view it.')).findsOne(); + }); + + testWidgets('Topic in unknown channel', (tester) async { + final channel = eg.stream(); + await setupMessageListPage(tester, + narrow: TopicNarrow(channel.streamId, eg.t('topic')), messages: [], streams: []); + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder('This channel doesn’t exist, or you are not allowed to view it.')).findsOne(); + }); + + testWidgets('Topic in subscribed channel', (tester) async { + final channel = eg.stream(); + await setupMessageListPage(tester, + narrow: TopicNarrow(channel.streamId, eg.t('topic')), messages: [], streams: [channel]); + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder('no messages')).findsOne(); + }); + + testWidgets('Topic in channel without content access', (tester) async { + final channel = eg.stream(inviteOnly: true); + await setupMessageListPage(tester, + narrow: TopicNarrow(channel.streamId, eg.t('topic')), messages: [], streams: [channel], + skipPumpAndSettle: true); + + // The topic input is autofocused, triggering topic autocomplete. + connection.prepare(json: GetStreamTopicsResult(topics: []).toJson()); + await tester.pumpAndSettle(); + + check(store.selfHasContentAccess(channel)).isFalse(); + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder('content access')).findsOne(); + await checkLink(tester, + linkText: 'content access', + expectedUrl: store.tryResolveUrl('/help/channel-permissions')!); + }); + + testWidgets('Self-DM', (tester) async { + final selfUserId = eg.selfUser.userId; + await setupMessageListPage(tester, + narrow: DmNarrow.withUser(selfUserId, selfUserId: selfUserId), messages: [], users: [eg.selfUser]); + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder('yourself')).findsOne(); + check(findTextInPlaceholder('Use this space')).findsOne(); + }); + + testWidgets('1:1 DM', (tester) async { + final selfUserId = eg.selfUser.userId; + final user = eg.user(); + await setupMessageListPage(tester, + narrow: DmNarrow.withUser(user.userId, selfUserId: selfUserId), messages: [], users: [eg.selfUser, user]); + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder(user.fullName)).findsOne(); + check(findTextInPlaceholder('yet.')).findsOne(); + check(findTextInPlaceholder('Why not start the conversation?')).findsOne(); + }); + + testWidgets('1:1 DM, muted user', (tester) async { + final selfUserId = eg.selfUser.userId; + final user = eg.user(); + await setupMessageListPage(tester, + narrow: DmNarrow.withUser(user.userId, selfUserId: selfUserId), messages: [], users: [eg.selfUser, user]); + await store.handleEvent(MutedUsersEvent(id: 1, mutedUsers: [MutedUserItem(id: user.userId)])); + await tester.pump(); + check(store.isUserMuted(user.userId)).isTrue(); + check(findPlaceholder).findsOne(); + + // Probably want to show their name, not "Muted user"; + // this UI context is very much focused on the one user. + check(findTextInPlaceholder(user.fullName)).findsOne(); + check(findTextInPlaceholder('Muted user')).findsNothing(); + + // No need to encourage starting a conversation though. + check(findTextInPlaceholder('Why not start the conversation?')).findsNothing(); + }); + + testWidgets('1:1 DM, unknown user', (tester) async { + final selfUserId = eg.selfUser.userId; + await setupMessageListPage(tester, + narrow: DmNarrow.withUser(eg.user().userId, selfUserId: selfUserId), messages: [], users: [eg.selfUser]); + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder('this user')).findsOne(); + check(findTextInPlaceholder('(unknown user)')).findsNothing(); + + // No need to encourage starting a conversation...right? + check(findTextInPlaceholder('yet.')).findsNothing(); + check(findTextInPlaceholder('Why not start the conversation?')).findsNothing(); + }); + + testWidgets('1:1 DM, deactivated user', (tester) async { + final selfUserId = eg.selfUser.userId; + final user = eg.user(isActive: false); + await setupMessageListPage(tester, + narrow: DmNarrow.withUser(user.userId, selfUserId: selfUserId), messages: [], users: [eg.selfUser, user]); + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder(user.fullName)).findsOne(); + + // Sending messages isn't allowed; don't suggest that + check(findTextInPlaceholder('yet.')).findsNothing(); + check(findTextInPlaceholder('Why not start the conversation?')).findsNothing(); + }); + + testWidgets('1:1 DM, muted and deactivated user', (tester) async { + final selfUserId = eg.selfUser.userId; + final user = eg.user(isActive: false); + await setupMessageListPage(tester, + narrow: DmNarrow.withUser(user.userId, selfUserId: selfUserId), messages: [], users: [eg.selfUser, user]); + await store.handleEvent(MutedUsersEvent(id: 1, mutedUsers: [MutedUserItem(id: user.userId)])); + await tester.pump(); + check(store.isUserMuted(user.userId)).isTrue(); + check(findPlaceholder).findsOne(); + + // Probably want to show their name, not "Muted user"; + // this UI context is very much focused on the one user. + check(findTextInPlaceholder(user.fullName)).findsOne(); + check(findTextInPlaceholder('Muted user')).findsNothing(); + + // Sending messages isn't allowed; don't suggest that + check(findTextInPlaceholder('yet.')).findsNothing(); + check(findTextInPlaceholder('Why not start the conversation?')).findsNothing(); + }); + + testWidgets('Group DM', (tester) async { + final selfUserId = eg.selfUser.userId; + final user1 = eg.user(); + final user2 = eg.user(); + await setupMessageListPage(tester, + narrow: DmNarrow.withUsers([user1.userId, user2.userId], selfUserId: selfUserId), + messages: [], users: [eg.selfUser, user1, user2]); + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder('these users')).findsOne(); + check(findTextInPlaceholder('yet.')).findsOne(); + check(findTextInPlaceholder('Why not start the conversation?')).findsOne(); + }); + + testWidgets('Group DM with a deactivated user', (tester) async { + final selfUserId = eg.selfUser.userId; + final user1 = eg.user(isActive: false); + final user2 = eg.user(); + await setupMessageListPage(tester, + narrow: DmNarrow.withUsers([user1.userId, user2.userId], selfUserId: selfUserId), + messages: [], users: [eg.selfUser, user1, user2]); + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder('these users')).findsOne(); + + // Sending messages isn't allowed; don't suggest that + check(findTextInPlaceholder('yet.')).findsNothing(); + check(findTextInPlaceholder('Why not start the conversation?')).findsNothing(); + }); + + testWidgets('Mentions', (tester) async { + await setupMessageListPage(tester, narrow: MentionsNarrow(), messages: []); + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder('mentioned')).findsOne(); + }); + + testWidgets('Starred', (tester) async { + await setupMessageListPage(tester, narrow: StarredMessagesNarrow(), messages: []); + check(findPlaceholder).findsOne(); + check(findTextInPlaceholder('starred')).findsOne(); + check(findTextInPlaceholder('tap “Star message.”')).findsOne(); + await checkLink(tester, linkText: 'Starring', + expectedUrl: store.tryResolveUrl('/help/star-a-message')!); }); testWidgets('Search, empty keyword', (tester) async { diff --git a/test/widgets/recent_dm_conversations_test.dart b/test/widgets/recent_dm_conversations_test.dart index 32c1d3f28d..85ff96d6ea 100644 --- a/test/widgets/recent_dm_conversations_test.dart +++ b/test/widgets/recent_dm_conversations_test.dart @@ -73,8 +73,8 @@ void main() { group('RecentDmConversationsPage', () { testWidgets('appearance when empty', (tester) async { await setupPage(tester, users: [], dmMessages: []); - check(find.text('You have no direct messages yet! Why not start the conversation?')) - .findsOne(); + check(find.text('You have no direct messages yet!')).findsOne(); + check(find.text('Why not start a conversation?')).findsOne(); }); testWidgets('page builds; conversations appear in order', (tester) async { diff --git a/test/widgets/subscription_list_test.dart b/test/widgets/subscription_list_test.dart index 49034f2166..70ede6f70a 100644 --- a/test/widgets/subscription_list_test.dart +++ b/test/widgets/subscription_list_test.dart @@ -63,9 +63,8 @@ void main() { check(getItemCount()).equals(0); check(isPinnedHeaderInTree()).isFalse(); check(isUnpinnedHeaderInTree()).isFalse(); - check(find.text( - 'You’re not subscribed to any channels yet. Try going to All channels and joining some of them.' - )).findsOne(); + check(find.text('You’re not subscribed to any channels yet.')).findsOne(); + check(find.text('Try going to All channels and joining some of them.')).findsOne(); }); testWidgets('basic subscriptions', (tester) async {