From c8aa4c8a35eff6d1fcb3a1171404950b5a339bb5 Mon Sep 17 00:00:00 2001 From: Zixuan James Li Date: Tue, 4 Feb 2025 19:27:27 -0500 Subject: [PATCH 1/7] i18n [nfc]: Explain why we skip translating licenses Signed-off-by: Zixuan James Li --- lib/licenses.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/licenses.dart b/lib/licenses.dart index a52c3f3240..c23882bb83 100644 --- a/lib/licenses.dart +++ b/lib/licenses.dart @@ -23,6 +23,12 @@ Stream additionalLicenses() async* { rootBundle.loadString('assets/Pygments/AUTHORS.txt'), ]); + // This does not need to be translated, as it is just a small fragment + // of text surrounded by a large quantity of English text that isn't + // translated anyway. + // (And it would be logistically tricky to translate, as this code is + // called from the `main` function before the [ZulipApp] widget is built, + // let alone has updated [GlobalLocalizations].) return '$licenseFileText\n\nAUTHORS file follows:\n\n$authorsFileText'; }()); yield LicenseEntryWithLineBreaks( From 6dab833dc58255d5d0f2047e48b3651db3fb2f2c Mon Sep 17 00:00:00 2001 From: Zixuan James Li Date: Thu, 6 Feb 2025 12:27:58 -0500 Subject: [PATCH 2/7] about_zulip: Translate unknown app version placeholder Signed-off-by: Zixuan James Li --- assets/l10n/app_en.arb | 4 ++++ lib/generated/l10n/zulip_localizations.dart | 6 ++++++ lib/generated/l10n/zulip_localizations_ar.dart | 3 +++ lib/generated/l10n/zulip_localizations_en.dart | 3 +++ lib/generated/l10n/zulip_localizations_ja.dart | 3 +++ lib/generated/l10n/zulip_localizations_nb.dart | 3 +++ lib/generated/l10n/zulip_localizations_pl.dart | 3 +++ lib/generated/l10n/zulip_localizations_ru.dart | 3 +++ lib/generated/l10n/zulip_localizations_sk.dart | 3 +++ lib/widgets/about_zulip.dart | 3 ++- 10 files changed, 33 insertions(+), 1 deletion(-) diff --git a/assets/l10n/app_en.arb b/assets/l10n/app_en.arb index ba02a819b1..63ba6f02ad 100644 --- a/assets/l10n/app_en.arb +++ b/assets/l10n/app_en.arb @@ -808,5 +808,9 @@ "scrollToBottomTooltip": "Scroll to bottom", "@scrollToBottomTooltip": { "description": "Tooltip for button to scroll to bottom." + }, + "appVersionUnknownPlaceholder": "(…)", + "@appVersionUnknownPlaceholder": { + "description": "Placeholder to show in place of the app version when it is unknown." } } diff --git a/lib/generated/l10n/zulip_localizations.dart b/lib/generated/l10n/zulip_localizations.dart index 9be039ef72..c3a2f34065 100644 --- a/lib/generated/l10n/zulip_localizations.dart +++ b/lib/generated/l10n/zulip_localizations.dart @@ -1190,6 +1190,12 @@ abstract class ZulipLocalizations { /// In en, this message translates to: /// **'Scroll to bottom'** String get scrollToBottomTooltip; + + /// Placeholder to show in place of the app version when it is unknown. + /// + /// In en, this message translates to: + /// **'(…)'** + String get appVersionUnknownPlaceholder; } class _ZulipLocalizationsDelegate extends LocalizationsDelegate { diff --git a/lib/generated/l10n/zulip_localizations_ar.dart b/lib/generated/l10n/zulip_localizations_ar.dart index 2e59dae8af..2ab2f86f0e 100644 --- a/lib/generated/l10n/zulip_localizations_ar.dart +++ b/lib/generated/l10n/zulip_localizations_ar.dart @@ -632,4 +632,7 @@ class ZulipLocalizationsAr extends ZulipLocalizations { @override String get scrollToBottomTooltip => 'Scroll to bottom'; + + @override + String get appVersionUnknownPlaceholder => '(…)'; } diff --git a/lib/generated/l10n/zulip_localizations_en.dart b/lib/generated/l10n/zulip_localizations_en.dart index a0e86b7d35..4650e84227 100644 --- a/lib/generated/l10n/zulip_localizations_en.dart +++ b/lib/generated/l10n/zulip_localizations_en.dart @@ -632,4 +632,7 @@ class ZulipLocalizationsEn extends ZulipLocalizations { @override String get scrollToBottomTooltip => 'Scroll to bottom'; + + @override + String get appVersionUnknownPlaceholder => '(…)'; } diff --git a/lib/generated/l10n/zulip_localizations_ja.dart b/lib/generated/l10n/zulip_localizations_ja.dart index 6e7f1559ac..e4b30f4ea0 100644 --- a/lib/generated/l10n/zulip_localizations_ja.dart +++ b/lib/generated/l10n/zulip_localizations_ja.dart @@ -632,4 +632,7 @@ class ZulipLocalizationsJa extends ZulipLocalizations { @override String get scrollToBottomTooltip => 'Scroll to bottom'; + + @override + String get appVersionUnknownPlaceholder => '(…)'; } diff --git a/lib/generated/l10n/zulip_localizations_nb.dart b/lib/generated/l10n/zulip_localizations_nb.dart index 32bea953d9..7cbc1f26d1 100644 --- a/lib/generated/l10n/zulip_localizations_nb.dart +++ b/lib/generated/l10n/zulip_localizations_nb.dart @@ -632,4 +632,7 @@ class ZulipLocalizationsNb extends ZulipLocalizations { @override String get scrollToBottomTooltip => 'Scroll to bottom'; + + @override + String get appVersionUnknownPlaceholder => '(…)'; } diff --git a/lib/generated/l10n/zulip_localizations_pl.dart b/lib/generated/l10n/zulip_localizations_pl.dart index 7ed4ff789d..b05275d3b1 100644 --- a/lib/generated/l10n/zulip_localizations_pl.dart +++ b/lib/generated/l10n/zulip_localizations_pl.dart @@ -632,4 +632,7 @@ class ZulipLocalizationsPl extends ZulipLocalizations { @override String get scrollToBottomTooltip => 'Przewiń do dołu'; + + @override + String get appVersionUnknownPlaceholder => '(…)'; } diff --git a/lib/generated/l10n/zulip_localizations_ru.dart b/lib/generated/l10n/zulip_localizations_ru.dart index 99bd72c62f..1970f7223c 100644 --- a/lib/generated/l10n/zulip_localizations_ru.dart +++ b/lib/generated/l10n/zulip_localizations_ru.dart @@ -632,4 +632,7 @@ class ZulipLocalizationsRu extends ZulipLocalizations { @override String get scrollToBottomTooltip => 'Scroll to bottom'; + + @override + String get appVersionUnknownPlaceholder => '(…)'; } diff --git a/lib/generated/l10n/zulip_localizations_sk.dart b/lib/generated/l10n/zulip_localizations_sk.dart index 13646eafd5..f3b9e7c2eb 100644 --- a/lib/generated/l10n/zulip_localizations_sk.dart +++ b/lib/generated/l10n/zulip_localizations_sk.dart @@ -632,4 +632,7 @@ class ZulipLocalizationsSk extends ZulipLocalizations { @override String get scrollToBottomTooltip => 'Scroll to bottom'; + + @override + String get appVersionUnknownPlaceholder => '(…)'; } diff --git a/lib/widgets/about_zulip.dart b/lib/widgets/about_zulip.dart index d0c1c8d29e..8abfa97c49 100644 --- a/lib/widgets/about_zulip.dart +++ b/lib/widgets/about_zulip.dart @@ -43,7 +43,8 @@ class _AboutZulipPageState extends State { child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [ ListTile( title: Text(zulipLocalizations.aboutPageAppVersion), - subtitle: Text(_packageInfo?.version ?? '(…)')), + subtitle: Text(_packageInfo?.version + ?? zulipLocalizations.appVersionUnknownPlaceholder)), ListTile( title: Text(zulipLocalizations.aboutPageOpenSourceLicenses), subtitle: Text(zulipLocalizations.aboutPageTapToView), From 0ac905c2bad6ea5b622889471af09acf89080e24 Mon Sep 17 00:00:00 2001 From: Zixuan James Li Date: Thu, 6 Feb 2025 12:55:18 -0500 Subject: [PATCH 3/7] app: Translate (well, transliterate) app title Signed-off-by: Zixuan James Li --- assets/l10n/app_en.arb | 4 ++++ lib/generated/l10n/zulip_localizations.dart | 6 ++++++ lib/generated/l10n/zulip_localizations_ar.dart | 3 +++ lib/generated/l10n/zulip_localizations_en.dart | 3 +++ lib/generated/l10n/zulip_localizations_ja.dart | 3 +++ lib/generated/l10n/zulip_localizations_nb.dart | 3 +++ lib/generated/l10n/zulip_localizations_pl.dart | 3 +++ lib/generated/l10n/zulip_localizations_ru.dart | 3 +++ lib/generated/l10n/zulip_localizations_sk.dart | 3 +++ lib/widgets/app.dart | 4 +++- 10 files changed, 34 insertions(+), 1 deletion(-) diff --git a/assets/l10n/app_en.arb b/assets/l10n/app_en.arb index 63ba6f02ad..f1d992939e 100644 --- a/assets/l10n/app_en.arb +++ b/assets/l10n/app_en.arb @@ -812,5 +812,9 @@ "appVersionUnknownPlaceholder": "(…)", "@appVersionUnknownPlaceholder": { "description": "Placeholder to show in place of the app version when it is unknown." + }, + "zulipAppTitle": "Zulip", + "@zulipAppTitle": { + "description": "The name of Zulip. This should be either 'Zulip' or a transliteration." } } diff --git a/lib/generated/l10n/zulip_localizations.dart b/lib/generated/l10n/zulip_localizations.dart index c3a2f34065..b09b0c1853 100644 --- a/lib/generated/l10n/zulip_localizations.dart +++ b/lib/generated/l10n/zulip_localizations.dart @@ -1196,6 +1196,12 @@ abstract class ZulipLocalizations { /// In en, this message translates to: /// **'(…)'** String get appVersionUnknownPlaceholder; + + /// The name of Zulip. This should be either 'Zulip' or a transliteration. + /// + /// In en, this message translates to: + /// **'Zulip'** + String get zulipAppTitle; } class _ZulipLocalizationsDelegate extends LocalizationsDelegate { diff --git a/lib/generated/l10n/zulip_localizations_ar.dart b/lib/generated/l10n/zulip_localizations_ar.dart index 2ab2f86f0e..9dd7dcdd0c 100644 --- a/lib/generated/l10n/zulip_localizations_ar.dart +++ b/lib/generated/l10n/zulip_localizations_ar.dart @@ -635,4 +635,7 @@ class ZulipLocalizationsAr extends ZulipLocalizations { @override String get appVersionUnknownPlaceholder => '(…)'; + + @override + String get zulipAppTitle => 'Zulip'; } diff --git a/lib/generated/l10n/zulip_localizations_en.dart b/lib/generated/l10n/zulip_localizations_en.dart index 4650e84227..547800440c 100644 --- a/lib/generated/l10n/zulip_localizations_en.dart +++ b/lib/generated/l10n/zulip_localizations_en.dart @@ -635,4 +635,7 @@ class ZulipLocalizationsEn extends ZulipLocalizations { @override String get appVersionUnknownPlaceholder => '(…)'; + + @override + String get zulipAppTitle => 'Zulip'; } diff --git a/lib/generated/l10n/zulip_localizations_ja.dart b/lib/generated/l10n/zulip_localizations_ja.dart index e4b30f4ea0..7eda5b1e21 100644 --- a/lib/generated/l10n/zulip_localizations_ja.dart +++ b/lib/generated/l10n/zulip_localizations_ja.dart @@ -635,4 +635,7 @@ class ZulipLocalizationsJa extends ZulipLocalizations { @override String get appVersionUnknownPlaceholder => '(…)'; + + @override + String get zulipAppTitle => 'Zulip'; } diff --git a/lib/generated/l10n/zulip_localizations_nb.dart b/lib/generated/l10n/zulip_localizations_nb.dart index 7cbc1f26d1..f52d8be760 100644 --- a/lib/generated/l10n/zulip_localizations_nb.dart +++ b/lib/generated/l10n/zulip_localizations_nb.dart @@ -635,4 +635,7 @@ class ZulipLocalizationsNb extends ZulipLocalizations { @override String get appVersionUnknownPlaceholder => '(…)'; + + @override + String get zulipAppTitle => 'Zulip'; } diff --git a/lib/generated/l10n/zulip_localizations_pl.dart b/lib/generated/l10n/zulip_localizations_pl.dart index b05275d3b1..7174cc56a6 100644 --- a/lib/generated/l10n/zulip_localizations_pl.dart +++ b/lib/generated/l10n/zulip_localizations_pl.dart @@ -635,4 +635,7 @@ class ZulipLocalizationsPl extends ZulipLocalizations { @override String get appVersionUnknownPlaceholder => '(…)'; + + @override + String get zulipAppTitle => 'Zulip'; } diff --git a/lib/generated/l10n/zulip_localizations_ru.dart b/lib/generated/l10n/zulip_localizations_ru.dart index 1970f7223c..6b8a34f65a 100644 --- a/lib/generated/l10n/zulip_localizations_ru.dart +++ b/lib/generated/l10n/zulip_localizations_ru.dart @@ -635,4 +635,7 @@ class ZulipLocalizationsRu extends ZulipLocalizations { @override String get appVersionUnknownPlaceholder => '(…)'; + + @override + String get zulipAppTitle => 'Zulip'; } diff --git a/lib/generated/l10n/zulip_localizations_sk.dart b/lib/generated/l10n/zulip_localizations_sk.dart index f3b9e7c2eb..d5de3f98a2 100644 --- a/lib/generated/l10n/zulip_localizations_sk.dart +++ b/lib/generated/l10n/zulip_localizations_sk.dart @@ -635,4 +635,7 @@ class ZulipLocalizationsSk extends ZulipLocalizations { @override String get appVersionUnknownPlaceholder => '(…)'; + + @override + String get zulipAppTitle => 'Zulip'; } diff --git a/lib/widgets/app.dart b/lib/widgets/app.dart index 9525dffdfe..f20e9f8fcc 100644 --- a/lib/widgets/app.dart +++ b/lib/widgets/app.dart @@ -181,7 +181,9 @@ class _ZulipAppState extends State with WidgetsBindingObserver { // TODO(#524) choose initial account as last one used final initialAccountId = globalStore.accounts.firstOrNull?.id; return MaterialApp( - title: 'Zulip', + onGenerateTitle: (BuildContext context) { + return ZulipLocalizations.of(context).zulipAppTitle; + }, localizationsDelegates: ZulipLocalizations.localizationsDelegates, supportedLocales: ZulipLocalizations.supportedLocales, theme: themeData, From a08dcda2fe7e6a4b4a91a12ff422443957512f5e Mon Sep 17 00:00:00 2001 From: Zixuan James Li Date: Thu, 6 Feb 2025 13:11:40 -0500 Subject: [PATCH 4/7] compose: Translate message for a filename with size The string is used at the end of the "errorFilesTooLarge" message, which includes a list of files with its size that are too large. Signed-off-by: Zixuan James Li --- assets/l10n/app_en.arb | 8 ++++++++ lib/generated/l10n/zulip_localizations.dart | 6 ++++++ lib/generated/l10n/zulip_localizations_ar.dart | 5 +++++ lib/generated/l10n/zulip_localizations_en.dart | 5 +++++ lib/generated/l10n/zulip_localizations_ja.dart | 5 +++++ lib/generated/l10n/zulip_localizations_nb.dart | 5 +++++ lib/generated/l10n/zulip_localizations_pl.dart | 5 +++++ lib/generated/l10n/zulip_localizations_ru.dart | 5 +++++ lib/generated/l10n/zulip_localizations_sk.dart | 5 +++++ lib/widgets/compose_box.dart | 3 ++- 10 files changed, 51 insertions(+), 1 deletion(-) diff --git a/assets/l10n/app_en.arb b/assets/l10n/app_en.arb index f1d992939e..6e86442855 100644 --- a/assets/l10n/app_en.arb +++ b/assets/l10n/app_en.arb @@ -171,6 +171,14 @@ "filename": {"type": "String", "example": "file.txt"} } }, + "filenameAndSizeInMiB": "{filename}: {size} MiB", + "@filenameAndSizeInMiB": { + "description": "The name of a file, and its size in mebibytes.", + "placeholders": { + "filename": {"type": "String", "example": "foo.txt"}, + "size": {"type": "String", "example": "20.2"} + } + }, "errorFilesTooLarge": "{num, plural, =1{File is} other{{num} files are}} larger than the server's limit of {maxFileUploadSizeMib} MiB and will not be uploaded:\n\n{listMessage}", "@errorFilesTooLarge": { "description": "Error message when attached files are too large in size.", diff --git a/lib/generated/l10n/zulip_localizations.dart b/lib/generated/l10n/zulip_localizations.dart index b09b0c1853..bbd9f4f4c9 100644 --- a/lib/generated/l10n/zulip_localizations.dart +++ b/lib/generated/l10n/zulip_localizations.dart @@ -351,6 +351,12 @@ abstract class ZulipLocalizations { /// **'Failed to upload file: {filename}'** String errorFailedToUploadFileTitle(String filename); + /// The name of a file, and its size in mebibytes. + /// + /// In en, this message translates to: + /// **'{filename}: {size} MiB'** + String filenameAndSizeInMiB(String filename, String size); + /// Error message when attached files are too large in size. /// /// In en, this message translates to: diff --git a/lib/generated/l10n/zulip_localizations_ar.dart b/lib/generated/l10n/zulip_localizations_ar.dart index 9dd7dcdd0c..df0d1087db 100644 --- a/lib/generated/l10n/zulip_localizations_ar.dart +++ b/lib/generated/l10n/zulip_localizations_ar.dart @@ -137,6 +137,11 @@ class ZulipLocalizationsAr extends ZulipLocalizations { return 'Failed to upload file: $filename'; } + @override + String filenameAndSizeInMiB(String filename, String size) { + return '$filename: $size MiB'; + } + @override String errorFilesTooLarge(int num, int maxFileUploadSizeMib, String listMessage) { String _temp0 = intl.Intl.pluralLogic( diff --git a/lib/generated/l10n/zulip_localizations_en.dart b/lib/generated/l10n/zulip_localizations_en.dart index 547800440c..6d689e01a8 100644 --- a/lib/generated/l10n/zulip_localizations_en.dart +++ b/lib/generated/l10n/zulip_localizations_en.dart @@ -137,6 +137,11 @@ class ZulipLocalizationsEn extends ZulipLocalizations { return 'Failed to upload file: $filename'; } + @override + String filenameAndSizeInMiB(String filename, String size) { + return '$filename: $size MiB'; + } + @override String errorFilesTooLarge(int num, int maxFileUploadSizeMib, String listMessage) { String _temp0 = intl.Intl.pluralLogic( diff --git a/lib/generated/l10n/zulip_localizations_ja.dart b/lib/generated/l10n/zulip_localizations_ja.dart index 7eda5b1e21..dae7fc8bd2 100644 --- a/lib/generated/l10n/zulip_localizations_ja.dart +++ b/lib/generated/l10n/zulip_localizations_ja.dart @@ -137,6 +137,11 @@ class ZulipLocalizationsJa extends ZulipLocalizations { return 'Failed to upload file: $filename'; } + @override + String filenameAndSizeInMiB(String filename, String size) { + return '$filename: $size MiB'; + } + @override String errorFilesTooLarge(int num, int maxFileUploadSizeMib, String listMessage) { String _temp0 = intl.Intl.pluralLogic( diff --git a/lib/generated/l10n/zulip_localizations_nb.dart b/lib/generated/l10n/zulip_localizations_nb.dart index f52d8be760..d5604f1be8 100644 --- a/lib/generated/l10n/zulip_localizations_nb.dart +++ b/lib/generated/l10n/zulip_localizations_nb.dart @@ -137,6 +137,11 @@ class ZulipLocalizationsNb extends ZulipLocalizations { return 'Failed to upload file: $filename'; } + @override + String filenameAndSizeInMiB(String filename, String size) { + return '$filename: $size MiB'; + } + @override String errorFilesTooLarge(int num, int maxFileUploadSizeMib, String listMessage) { String _temp0 = intl.Intl.pluralLogic( diff --git a/lib/generated/l10n/zulip_localizations_pl.dart b/lib/generated/l10n/zulip_localizations_pl.dart index 7174cc56a6..87dc1ce4ba 100644 --- a/lib/generated/l10n/zulip_localizations_pl.dart +++ b/lib/generated/l10n/zulip_localizations_pl.dart @@ -137,6 +137,11 @@ class ZulipLocalizationsPl extends ZulipLocalizations { return 'Nie udało się załadować pliku: $filename'; } + @override + String filenameAndSizeInMiB(String filename, String size) { + return '$filename: $size MiB'; + } + @override String errorFilesTooLarge(int num, int maxFileUploadSizeMib, String listMessage) { String _temp0 = intl.Intl.pluralLogic( diff --git a/lib/generated/l10n/zulip_localizations_ru.dart b/lib/generated/l10n/zulip_localizations_ru.dart index 6b8a34f65a..9d67cff8b0 100644 --- a/lib/generated/l10n/zulip_localizations_ru.dart +++ b/lib/generated/l10n/zulip_localizations_ru.dart @@ -137,6 +137,11 @@ class ZulipLocalizationsRu extends ZulipLocalizations { return 'Не удалось загрузить файл: $filename'; } + @override + String filenameAndSizeInMiB(String filename, String size) { + return '$filename: $size MiB'; + } + @override String errorFilesTooLarge(int num, int maxFileUploadSizeMib, String listMessage) { String _temp0 = intl.Intl.pluralLogic( diff --git a/lib/generated/l10n/zulip_localizations_sk.dart b/lib/generated/l10n/zulip_localizations_sk.dart index d5de3f98a2..eaa1969d42 100644 --- a/lib/generated/l10n/zulip_localizations_sk.dart +++ b/lib/generated/l10n/zulip_localizations_sk.dart @@ -137,6 +137,11 @@ class ZulipLocalizationsSk extends ZulipLocalizations { return 'Nepodarilo sa nahrať súbor: $filename'; } + @override + String filenameAndSizeInMiB(String filename, String size) { + return '$filename: $size MiB'; + } + @override String errorFilesTooLarge(int num, int maxFileUploadSizeMib, String listMessage) { String _temp0 = intl.Intl.pluralLogic( diff --git a/lib/widgets/compose_box.dart b/lib/widgets/compose_box.dart index 9ee87754b8..2b1756e4fe 100644 --- a/lib/widgets/compose_box.dart +++ b/lib/widgets/compose_box.dart @@ -709,7 +709,8 @@ Future _uploadFiles({ if (tooLargeFiles.isNotEmpty) { final listMessage = tooLargeFiles - .map((file) => '${file.filename}: ${(file.length / (1 << 20)).toStringAsFixed(1)} MiB') + .map((file) => zulipLocalizations.filenameAndSizeInMiB( + file.filename, (file.length / (1 << 20)).toStringAsFixed(1))) .join('\n'); showErrorDialog( context: context, From 9ba7faf027d259901f4c34a4b469423f0fd7aa8c Mon Sep 17 00:00:00 2001 From: Zixuan James Li Date: Thu, 6 Feb 2025 13:17:08 -0500 Subject: [PATCH 5/7] i18n [nfc]: Improve errorFilesTooLarge example for listMessage The message, when used in lib/widgets/compose_box.dart, substitutes `listMessage` with newline separated lines of filenames with size. Update the example to match this usage. Signed-off-by: Zixuan James Li --- assets/l10n/app_en.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/l10n/app_en.arb b/assets/l10n/app_en.arb index 6e86442855..87edb26a0b 100644 --- a/assets/l10n/app_en.arb +++ b/assets/l10n/app_en.arb @@ -185,7 +185,7 @@ "placeholders": { "num": {"type": "int", "example": "2"}, "maxFileUploadSizeMib": {"type": "int", "example": "15"}, - "listMessage": {"type": "String", "example": "foo.txt\nbar.txt"} + "listMessage": {"type": "String", "example": "foo.txt: 10.1 MiB\nbar.txt 20.2 MiB"} } }, "errorFilesTooLargeTitle": "{num, plural, =1{File} other{Files}} too large", From c6db6aa0dbd857239ee5fd8a0a0e56094783e3bc Mon Sep 17 00:00:00 2001 From: Zixuan James Li Date: Thu, 6 Feb 2025 13:28:49 -0500 Subject: [PATCH 6/7] login [nfc]: Shorten string for server URL input label to match the labels for the other fields (loginEmailLabel, loginPasswordLabel, etc.) This also updates existing translations in other languages to match. Signed-off-by: Zixuan James Li --- assets/l10n/app_en.arb | 6 +++--- assets/l10n/app_pl.arb | 6 +++--- assets/l10n/app_ru.arb | 6 +++--- assets/l10n/app_sk.arb | 6 +++--- lib/generated/l10n/zulip_localizations.dart | 4 ++-- lib/generated/l10n/zulip_localizations_ar.dart | 2 +- lib/generated/l10n/zulip_localizations_en.dart | 2 +- lib/generated/l10n/zulip_localizations_ja.dart | 2 +- lib/generated/l10n/zulip_localizations_nb.dart | 2 +- lib/generated/l10n/zulip_localizations_pl.dart | 2 +- lib/generated/l10n/zulip_localizations_ru.dart | 2 +- lib/generated/l10n/zulip_localizations_sk.dart | 2 +- lib/widgets/login.dart | 2 +- 13 files changed, 22 insertions(+), 22 deletions(-) diff --git a/assets/l10n/app_en.arb b/assets/l10n/app_en.arb index 87edb26a0b..0640af9ee1 100644 --- a/assets/l10n/app_en.arb +++ b/assets/l10n/app_en.arb @@ -483,9 +483,9 @@ "@loginAddAnAccountPageTitle": { "description": "Title for page to add a Zulip account." }, - "loginServerUrlInputLabel": "Your Zulip server URL", - "@loginServerUrlInputLabel": { - "description": "Input label in login page for Zulip server URL entry." + "loginServerUrlLabel": "Your Zulip server URL", + "@loginServerUrlLabel": { + "description": "Label in login page for Zulip server URL entry." }, "loginHidePassword": "Hide password", "@loginHidePassword": { diff --git a/assets/l10n/app_pl.arb b/assets/l10n/app_pl.arb index e51a31771d..770a670212 100644 --- a/assets/l10n/app_pl.arb +++ b/assets/l10n/app_pl.arb @@ -355,9 +355,9 @@ "@loginAddAnAccountPageTitle": { "description": "Title for page to add a Zulip account." }, - "loginServerUrlInputLabel": "URL serwera Zulip", - "@loginServerUrlInputLabel": { - "description": "Input label in login page for Zulip server URL entry." + "loginServerUrlLabel": "URL serwera Zulip", + "@loginServerUrlLabel": { + "description": "Label in login page for Zulip server URL entry." }, "loginHidePassword": "Ukryj hasło", "@loginHidePassword": { diff --git a/assets/l10n/app_ru.arb b/assets/l10n/app_ru.arb index 04e971cb4b..ef38533bb2 100644 --- a/assets/l10n/app_ru.arb +++ b/assets/l10n/app_ru.arb @@ -207,9 +207,9 @@ "@loginAddAnAccountPageTitle": { "description": "Title for page to add a Zulip account." }, - "loginServerUrlInputLabel": "URL вашего сервера Zulip", - "@loginServerUrlInputLabel": { - "description": "Input label in login page for Zulip server URL entry." + "loginServerUrlLabel": "URL вашего сервера Zulip", + "@loginServerUrlLabel": { + "description": "Label in login page for Zulip server URL entry." }, "loginHidePassword": "Скрыть пароль", "@loginHidePassword": { diff --git a/assets/l10n/app_sk.arb b/assets/l10n/app_sk.arb index 4ad83e6790..087f459697 100644 --- a/assets/l10n/app_sk.arb +++ b/assets/l10n/app_sk.arb @@ -69,9 +69,9 @@ } } }, - "loginServerUrlInputLabel": "Adresa vášho Zulip servera", - "@loginServerUrlInputLabel": { - "description": "Input label in login page for Zulip server URL entry." + "loginServerUrlLabel": "Adresa vášho Zulip servera", + "@loginServerUrlLabel": { + "description": "Label in login page for Zulip server URL entry." }, "errorMessageNotSent": "Správa nebola odoslaná", "@errorMessageNotSent": { diff --git a/lib/generated/l10n/zulip_localizations.dart b/lib/generated/l10n/zulip_localizations.dart index bbd9f4f4c9..3cbd917563 100644 --- a/lib/generated/l10n/zulip_localizations.dart +++ b/lib/generated/l10n/zulip_localizations.dart @@ -741,11 +741,11 @@ abstract class ZulipLocalizations { /// **'Add an account'** String get loginAddAnAccountPageTitle; - /// Input label in login page for Zulip server URL entry. + /// Label in login page for Zulip server URL entry. /// /// In en, this message translates to: /// **'Your Zulip server URL'** - String get loginServerUrlInputLabel; + String get loginServerUrlLabel; /// Icon label for button to hide password in input form. /// diff --git a/lib/generated/l10n/zulip_localizations_ar.dart b/lib/generated/l10n/zulip_localizations_ar.dart index df0d1087db..0304fd3e6f 100644 --- a/lib/generated/l10n/zulip_localizations_ar.dart +++ b/lib/generated/l10n/zulip_localizations_ar.dart @@ -375,7 +375,7 @@ class ZulipLocalizationsAr extends ZulipLocalizations { String get loginAddAnAccountPageTitle => 'Add an account'; @override - String get loginServerUrlInputLabel => 'Your Zulip server URL'; + String get loginServerUrlLabel => 'Your Zulip server URL'; @override String get loginHidePassword => 'Hide password'; diff --git a/lib/generated/l10n/zulip_localizations_en.dart b/lib/generated/l10n/zulip_localizations_en.dart index 6d689e01a8..7af8cd7bab 100644 --- a/lib/generated/l10n/zulip_localizations_en.dart +++ b/lib/generated/l10n/zulip_localizations_en.dart @@ -375,7 +375,7 @@ class ZulipLocalizationsEn extends ZulipLocalizations { String get loginAddAnAccountPageTitle => 'Add an account'; @override - String get loginServerUrlInputLabel => 'Your Zulip server URL'; + String get loginServerUrlLabel => 'Your Zulip server URL'; @override String get loginHidePassword => 'Hide password'; diff --git a/lib/generated/l10n/zulip_localizations_ja.dart b/lib/generated/l10n/zulip_localizations_ja.dart index dae7fc8bd2..6ac34645e2 100644 --- a/lib/generated/l10n/zulip_localizations_ja.dart +++ b/lib/generated/l10n/zulip_localizations_ja.dart @@ -375,7 +375,7 @@ class ZulipLocalizationsJa extends ZulipLocalizations { String get loginAddAnAccountPageTitle => 'Add an account'; @override - String get loginServerUrlInputLabel => 'Your Zulip server URL'; + String get loginServerUrlLabel => 'Your Zulip server URL'; @override String get loginHidePassword => 'Hide password'; diff --git a/lib/generated/l10n/zulip_localizations_nb.dart b/lib/generated/l10n/zulip_localizations_nb.dart index d5604f1be8..b3360e9f62 100644 --- a/lib/generated/l10n/zulip_localizations_nb.dart +++ b/lib/generated/l10n/zulip_localizations_nb.dart @@ -375,7 +375,7 @@ class ZulipLocalizationsNb extends ZulipLocalizations { String get loginAddAnAccountPageTitle => 'Add an account'; @override - String get loginServerUrlInputLabel => 'Your Zulip server URL'; + String get loginServerUrlLabel => 'Your Zulip server URL'; @override String get loginHidePassword => 'Hide password'; diff --git a/lib/generated/l10n/zulip_localizations_pl.dart b/lib/generated/l10n/zulip_localizations_pl.dart index 87dc1ce4ba..cab571c163 100644 --- a/lib/generated/l10n/zulip_localizations_pl.dart +++ b/lib/generated/l10n/zulip_localizations_pl.dart @@ -375,7 +375,7 @@ class ZulipLocalizationsPl extends ZulipLocalizations { String get loginAddAnAccountPageTitle => 'Dodaj konto'; @override - String get loginServerUrlInputLabel => 'URL serwera Zulip'; + String get loginServerUrlLabel => 'URL serwera Zulip'; @override String get loginHidePassword => 'Ukryj hasło'; diff --git a/lib/generated/l10n/zulip_localizations_ru.dart b/lib/generated/l10n/zulip_localizations_ru.dart index 9d67cff8b0..babbc976fd 100644 --- a/lib/generated/l10n/zulip_localizations_ru.dart +++ b/lib/generated/l10n/zulip_localizations_ru.dart @@ -375,7 +375,7 @@ class ZulipLocalizationsRu extends ZulipLocalizations { String get loginAddAnAccountPageTitle => 'Добавление учетной записи'; @override - String get loginServerUrlInputLabel => 'URL вашего сервера Zulip'; + String get loginServerUrlLabel => 'URL вашего сервера Zulip'; @override String get loginHidePassword => 'Скрыть пароль'; diff --git a/lib/generated/l10n/zulip_localizations_sk.dart b/lib/generated/l10n/zulip_localizations_sk.dart index eaa1969d42..964dbc29ad 100644 --- a/lib/generated/l10n/zulip_localizations_sk.dart +++ b/lib/generated/l10n/zulip_localizations_sk.dart @@ -375,7 +375,7 @@ class ZulipLocalizationsSk extends ZulipLocalizations { String get loginAddAnAccountPageTitle => 'Pridať účet'; @override - String get loginServerUrlInputLabel => 'Adresa vášho Zulip servera'; + String get loginServerUrlLabel => 'Adresa vášho Zulip servera'; @override String get loginHidePassword => 'Skryť heslo'; diff --git a/lib/widgets/login.dart b/lib/widgets/login.dart index ce1cf09438..a970d8059c 100644 --- a/lib/widgets/login.dart +++ b/lib/widgets/login.dart @@ -230,7 +230,7 @@ class _AddAccountPageState extends State { // …but leave out unfocusing the input in case more editing is needed. }, decoration: InputDecoration( - labelText: zulipLocalizations.loginServerUrlInputLabel, + labelText: zulipLocalizations.loginServerUrlLabel, errorText: errorText, helperText: kLayoutPinningHelperText, hintText: 'your-org.zulipchat.com')), From 0417c87ef7ab6b30cd74c3d4fe8e65e0de3955db Mon Sep 17 00:00:00 2001 From: Greg Price Date: Fri, 7 Feb 2025 17:42:36 -0800 Subject: [PATCH 7/7] login [nfc]: Document need for "server URL" hint value to be reserved --- lib/widgets/login.dart | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/widgets/login.dart b/lib/widgets/login.dart index a970d8059c..195bf75e62 100644 --- a/lib/widgets/login.dart +++ b/lib/widgets/login.dart @@ -115,6 +115,20 @@ class AddAccountPage extends StatefulWidget { return _LoginSequenceRoute(page: const AddAccountPage()); } + /// The hint text to show in the "Zulip server URL" input. + /// + /// If this contains an example value, it must be one that has been reserved + /// so that it cannot point to a real Zulip realm (nor any unknown other site). + /// The realm name `your-org` under zulipchat.com is reserved for this reason. + /// See discussion: + /// https://chat.zulip.org/#narrow/channel/243-mobile-team/topic/flutter.3A.20login.20URL/near/1570347 + // TODO(i18n): In principle this should be translated, because it's trying to + // convey to the user the English phrase "your org". But doing that is + // tricky because of the need to have the example name reserved. + // Realistically that probably means we'll only ever translate this for + // at most a handful of languages, most likely none. + static const _serverUrlHint = 'your-org.zulipchat.com'; + @override State createState() => _AddAccountPageState(); } @@ -233,7 +247,7 @@ class _AddAccountPageState extends State { labelText: zulipLocalizations.loginServerUrlLabel, errorText: errorText, helperText: kLayoutPinningHelperText, - hintText: 'your-org.zulipchat.com')), + hintText: AddAccountPage._serverUrlHint)), const SizedBox(height: 8), ElevatedButton( onPressed: !_inProgress && errorText == null