feat(mobile): use Weblate for i18n (2) (#17620)

* feat(mobile): use Weblate for i18n (2)

* remove old translation files

* dedup keys

* remove migration report

* chore

* remove localizely.yml
This commit is contained in:
Alex
2025-04-15 10:54:26 -05:00
committed by GitHub
parent 17e720440d
commit b2c903c000
156 changed files with 25537 additions and 30968 deletions
@@ -73,7 +73,7 @@ class AlbumAdditionalSharedUserSelectionPage extends HookConsumerWidget {
Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
'select_additional_user_for_sharing_page_suggestions'.tr(),
'suggestions'.tr(),
style: const TextStyle(
fontSize: 14,
color: Colors.grey,
@@ -126,7 +126,7 @@ class AlbumAdditionalSharedUserSelectionPage extends HookConsumerWidget {
return Scaffold(
appBar: AppBar(
title: const Text(
'share_invite',
'invite_to_album',
).tr(),
elevation: 0,
centerTitle: false,
@@ -141,7 +141,7 @@ class AlbumAdditionalSharedUserSelectionPage extends HookConsumerWidget {
onPressed:
sharedUsersList.value.isEmpty ? null : addNewUsersHandler,
child: const Text(
"share_add",
"add",
style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold),
).tr(),
),
@@ -53,7 +53,7 @@ class AlbumAssetSelectionPage extends HookConsumerWidget {
),
title: selected.value.isEmpty
? const Text(
'share_add_photos',
'add_photos',
style: TextStyle(fontSize: 18),
).tr()
: const Text(
@@ -71,7 +71,7 @@ class AlbumAssetSelectionPage extends HookConsumerWidget {
.popForced<AssetSelectionPageResult>(payload);
},
child: Text(
canDeselect ? "share_done" : "share_add",
canDeselect ? "done" : "add",
style: TextStyle(
fontWeight: FontWeight.bold,
color: context.primaryColor,
@@ -36,7 +36,7 @@ class AlbumControlButton extends ConsumerWidget {
key: const ValueKey('add_photos_button'),
iconData: Icons.add_photo_alternate_outlined,
onPressed: onAddPhotosPressed,
labelText: "share_add_photos".tr(),
labelText: "add_photos".tr(),
),
if (isOwner)
AlbumActionFilledButton(
@@ -140,7 +140,7 @@ class AlbumOptionsPage extends HookConsumerWidget {
style: TextStyle(color: context.colorScheme.onSurfaceSecondary),
),
trailing: Text(
"shared_album_section_people_owner_label",
"owner",
style: context.textTheme.labelLarge,
).tr(),
);
@@ -195,7 +195,7 @@ class AlbumOptionsPage extends HookConsumerWidget {
onPressed: () => context.maybePop(null),
),
centerTitle: true,
title: Text("translated_text_options".tr()),
title: Text("options".tr()),
),
body: ListView(
children: [
@@ -215,12 +215,12 @@ class AlbumOptionsPage extends HookConsumerWidget {
: context.themeData.disabledColor,
dense: true,
title: Text(
"shared_album_activity_setting_title",
"comments_and_likes",
style: context.textTheme.titleMedium
?.copyWith(fontWeight: FontWeight.w500),
).tr(),
subtitle: Text(
"shared_album_activity_setting_subtitle",
"let_others_respond",
style: context.textTheme.labelLarge?.copyWith(
color: context.colorScheme.onSurfaceSecondary,
),
@@ -93,7 +93,7 @@ class AlbumSharedUserSelectionPage extends HookConsumerWidget {
Padding(
padding: const EdgeInsets.all(16.0),
child: const Text(
'select_user_for_sharing_page_share_suggestions',
'suggestions',
style: TextStyle(
fontSize: 14,
color: Colors.grey,
@@ -139,7 +139,7 @@ class AlbumSharedUserSelectionPage extends HookConsumerWidget {
return Scaffold(
appBar: AppBar(
title: Text(
'share_invite',
'invite_to_album',
style: TextStyle(color: context.primaryColor),
).tr(),
elevation: 0,
@@ -157,7 +157,7 @@ class AlbumSharedUserSelectionPage extends HookConsumerWidget {
),
onPressed: sharedUsersList.value.isEmpty ? null : createSharedAlbum,
child: const Text(
"share_create_album",
"create_album",
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,
+1 -1
View File
@@ -233,7 +233,7 @@ class AlbumsPage extends HookConsumerWidget {
args: ['${sorted[index].assetCount}'],
) : 'album_thumbnail_card_items'.tr(
args: ['${sorted[index].assetCount}'],
))} ${sorted[index].ownerId != userId ? 'album_thumbnail_shared_by'.tr(args: [sorted[index].ownerName!]) : 'album_thumbnail_owned'.tr()}',
))} ${sorted[index].ownerId != userId ? 'album_thumbnail_shared_by'.tr(args: [sorted[index].ownerName!]) : 'owned'.tr()}',
overflow: TextOverflow.ellipsis,
style:
context.textTheme.bodyMedium?.copyWith(
@@ -91,7 +91,7 @@ class BackupControllerPage extends HookConsumerWidget {
if (albums.isNotEmpty) {
for (var album in albums) {
if (album.name == "Recent" || album.name == "Recents") {
text += "${album.name} (${'backup_all'.tr()}), ";
text += "${album.name} (${'all'.tr()}), ";
} else {
text += "${album.name}, ";
}
@@ -188,7 +188,7 @@ class BackupControllerPage extends HookConsumerWidget {
ref.read(albumProvider.notifier).refreshDeviceAlbums();
},
child: const Text(
"backup_controller_page_select",
"select",
style: TextStyle(
fontWeight: FontWeight.bold,
),
@@ -231,7 +231,7 @@ class BackupControllerPage extends HookConsumerWidget {
}
},
child: const Text(
"backup_controller_page_cancel",
"cancel",
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,
@@ -309,7 +309,7 @@ class BackupControllerPage extends HookConsumerWidget {
? [
buildFolderSelectionTile(),
BackupInfoCard(
title: "backup_controller_page_total".tr(),
title: "total".tr(),
subtitle: "backup_controller_page_total_sub".tr(),
info: ref.watch(backupProvider).availableAlbums.isEmpty
? "..."
@@ -142,7 +142,7 @@ class CreateAlbumPage extends HookConsumerWidget {
AlbumActionFilledButton(
iconData: Icons.add_photo_alternate_outlined,
onPressed: onSelectPhotosButtonPressed,
labelText: "share_add_photos".tr(),
labelText: "add_photos".tr(),
),
],
),
@@ -207,7 +207,7 @@ class CreateAlbumPage extends HookConsumerWidget {
icon: const Icon(Icons.close_rounded),
),
title: const Text(
'share_create_album',
'create_album',
).tr(),
actions: [
TextButton(
@@ -215,7 +215,7 @@ class CreateAlbumPage extends HookConsumerWidget {
? createNonSharedAlbum
: null,
child: Text(
'create_shared_album_page_create'.tr(),
'create'.tr(),
style: TextStyle(
fontWeight: FontWeight.bold,
color: albumTitleController.text.isNotEmpty
@@ -60,7 +60,7 @@ class HeaderSettingsPage extends HookConsumerWidget {
return Scaffold(
appBar: AppBar(
title: const Text('header_settings_page_title').tr(),
title: const Text('advanced_settings_proxy_headers_title').tr(),
centerTitle: false,
actions: [
IconButton(
+3 -3
View File
@@ -15,7 +15,7 @@ import 'package:immich_mobile/routing/router.dart';
enum SettingSection {
advanced(
'advanced_settings_tile_title',
'advanced',
Icons.build_outlined,
"advanced_settings_tile_subtitle",
),
@@ -40,7 +40,7 @@ enum SettingSection {
"networking_subtitle",
),
notifications(
'setting_notifications_title',
'notifications',
Icons.notifications_none_rounded,
"setting_notifications_subtitle",
),
@@ -83,7 +83,7 @@ class SettingsPage extends StatelessWidget {
return Scaffold(
appBar: AppBar(
centerTitle: false,
title: const Text('setting_pages_app_bar_settings').tr(),
title: const Text('settings').tr(),
),
body: context.isMobile ? _MobileLayout() : _TabletLayout(),
);
@@ -65,7 +65,7 @@ class TabControllerPage extends HookConsumerWidget {
final navigationDestinations = [
NavigationDestination(
label: 'tab_controller_nav_photos'.tr(),
label: 'photos'.tr(),
icon: const Icon(
Icons.photo_library_outlined,
),
@@ -78,7 +78,7 @@ class TabControllerPage extends HookConsumerWidget {
),
),
NavigationDestination(
label: 'tab_controller_nav_search'.tr(),
label: 'search'.tr(),
icon: const Icon(
Icons.search_rounded,
),
+1 -1
View File
@@ -91,7 +91,7 @@ class EditImagePage extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
return Scaffold(
appBar: AppBar(
title: Text("edit_image_title".tr()),
title: Text("edit".tr()),
backgroundColor: context.scaffoldBackgroundColor,
leading: IconButton(
icon: Icon(
+1 -1
View File
@@ -21,7 +21,7 @@ class FavoritesPage extends HookConsumerWidget {
centerTitle: true,
automaticallyImplyLeading: false,
title: const Text(
'favorites_page_title',
'favorites',
).tr(),
);
}
@@ -72,7 +72,7 @@ class PartnerPage extends HookConsumerWidget {
context: context,
builder: (BuildContext context) {
return ConfirmDialog(
title: "partner_page_stop_sharing_title",
title: "stop_photo_sharing",
content: "partner_page_stop_sharing_content".tr(args: [u.name]),
onOk: () => ref.read(partnerServiceProvider).removePartner(u),
);
@@ -131,7 +131,7 @@ class PartnerPage extends HookConsumerWidget {
data: (data) => addNewUsersHandler,
),
icon: const Icon(Icons.person_add),
label: const Text("partner_page_add_partner").tr(),
label: const Text("add_partner").tr(),
),
),
],
@@ -151,7 +151,7 @@ class PartnerPage extends HookConsumerWidget {
onPressed:
availableUsers.whenOrNull(data: (data) => addNewUsersHandler),
icon: const Icon(Icons.person_add),
tooltip: "partner_page_add_partner".tr(),
tooltip: "add_partner".tr(),
),
],
),
@@ -81,7 +81,7 @@ class PeopleCollectionPage extends HookConsumerWidget {
Icons.search_rounded,
color: context.colorScheme.primary,
),
hintText: 'search_filter_people_hint'.tr(),
hintText: 'filter_people'.tr(),
),
autofocus: true,
)
@@ -48,7 +48,7 @@ class SharedLinkPage extends HookConsumerWidget {
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: const Text(
"shared_link_empty",
"you_dont_have_any_shared_links",
style: TextStyle(fontSize: 14),
).tr(),
),
@@ -49,7 +49,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
return Row(
children: [
const Text(
'shared_link_public_album',
'public_album',
style: TextStyle(fontWeight: FontWeight.bold),
).tr(),
const Text(
@@ -94,7 +94,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
}
return const Text(
"shared_link_create_info",
"create_link_to_share_description",
style: TextStyle(fontWeight: FontWeight.bold),
).tr();
}
@@ -107,7 +107,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
textInputAction: TextInputAction.done,
autofocus: false,
decoration: InputDecoration(
labelText: 'shared_link_edit_description'.tr(),
labelText: 'description'.tr(),
labelStyle: TextStyle(
fontWeight: FontWeight.bold,
color: colorScheme.primary,
@@ -133,7 +133,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
enabled: newShareLink.value.isEmpty,
autofocus: false,
decoration: InputDecoration(
labelText: 'shared_link_edit_password'.tr(),
labelText: 'password'.tr(),
labelStyle: TextStyle(
fontWeight: FontWeight.bold,
color: colorScheme.primary,
@@ -161,7 +161,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
activeColor: colorScheme.primary,
dense: true,
title: Text(
"shared_link_edit_show_meta",
"show_metadata",
style: themeData.textTheme.labelLarge
?.copyWith(fontWeight: FontWeight.bold),
).tr(),
@@ -177,7 +177,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
activeColor: colorScheme.primary,
dense: true,
title: Text(
"shared_link_edit_allow_download",
"allow_public_user_to_download",
style: themeData.textTheme.labelLarge
?.copyWith(fontWeight: FontWeight.bold),
).tr(),
@@ -193,7 +193,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
activeColor: colorScheme.primary,
dense: true,
title: Text(
"shared_link_edit_allow_upload",
"allow_public_user_to_upload",
style: themeData.textTheme.labelLarge
?.copyWith(fontWeight: FontWeight.bold),
).tr(),
@@ -209,7 +209,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
activeColor: colorScheme.primary,
dense: true,
title: Text(
"shared_link_edit_change_expiry",
"change_expiration_time",
style: themeData.textTheme.labelLarge
?.copyWith(fontWeight: FontWeight.bold),
).tr(),
@@ -219,7 +219,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
Widget buildExpiryAfterButton() {
return DropdownMenu(
label: Text(
"shared_link_edit_expire_after",
"expire_after",
style: TextStyle(
fontWeight: FontWeight.bold,
color: colorScheme.primary,
@@ -237,7 +237,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
dropdownMenuEntries: [
DropdownMenuEntry(
value: 0,
label: "shared_link_edit_expire_after_option_never".tr(),
label: "never".tr(),
),
DropdownMenuEntry(
value: 30,
@@ -324,7 +324,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
context.maybePop();
},
child: const Text(
"share_done",
"done",
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,
@@ -430,9 +430,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
return Scaffold(
appBar: AppBar(
title: Text(
existingLink == null
? "shared_link_create_app_bar_title"
: "shared_link_edit_app_bar_title",
existingLink == null ? "create_link_to_share" : "edit_link",
).tr(),
elevation: 0,
leading: const CloseButton(),
@@ -505,7 +503,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
child: Text(
existingLink != null
? "shared_link_edit_submit_button"
: "shared_link_create_submit_button",
: "create_link",
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,
+6 -6
View File
@@ -57,8 +57,8 @@ class TrashPage extends HookConsumerWidget {
context: context,
builder: (context) => ConfirmDialog(
onOk: () => onEmptyTrash(),
title: "trash_page_empty_trash_btn".tr(),
ok: "trash_page_empty_trash_dialog_ok".tr(),
title: "empty_trash".tr(),
ok: "ok".tr(),
content: "trash_page_empty_trash_dialog_content".tr(),
),
);
@@ -161,11 +161,11 @@ class TrashPage extends HookConsumerWidget {
return [
PopupMenuItem(
value: () => selectionEnabledHook.value = true,
child: const Text('trash_page_select_btn').tr(),
child: const Text('select').tr(),
),
PopupMenuItem(
value: handleEmptyTrash,
child: const Text('trash_page_empty_trash_btn').tr(),
child: const Text('empty_trash').tr(),
),
];
},
@@ -194,7 +194,7 @@ class TrashPage extends HookConsumerWidget {
label: Text(
selection.value.isEmpty
? 'trash_page_delete_all'.tr()
: 'trash_page_delete'.tr(),
: 'delete'.tr(),
style: TextStyle(
fontSize: 14,
color: Colors.red[400],
@@ -214,7 +214,7 @@ class TrashPage extends HookConsumerWidget {
label: Text(
selection.value.isEmpty
? 'trash_page_restore_all'.tr()
: 'trash_page_restore'.tr(),
: 'restore'.tr(),
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,
@@ -44,7 +44,7 @@ class PermissionOnboardingPage extends HookConsumerWidget {
}
}),
child: const Text(
'permission_onboarding_grant_permission',
'grant_permission',
).tr(),
),
],
@@ -168,7 +168,7 @@ class PermissionOnboardingPage extends HookConsumerWidget {
),
),
TextButton(
child: const Text('permission_onboarding_back').tr(),
child: const Text('back').tr(),
onPressed: () => context.maybePop(),
),
],
@@ -16,7 +16,7 @@ class AllMotionPhotosPage extends HookConsumerWidget {
return Scaffold(
appBar: AppBar(
title: const Text('motion_photos_page_title').tr(),
title: const Text('search_page_motion_photos').tr(),
leading: IconButton(
onPressed: () => context.maybePop(),
icon: const Icon(Icons.arrow_back_ios_rounded),
+1 -1
View File
@@ -18,7 +18,7 @@ class AllPeoplePage extends HookConsumerWidget {
return Scaffold(
appBar: AppBar(
title: const Text(
'all_people_page_title',
'people',
).tr(),
leading: IconButton(
onPressed: () => context.maybePop(),
+1 -1
View File
@@ -19,7 +19,7 @@ class AllPlacesPage extends HookConsumerWidget {
return Scaffold(
appBar: AppBar(
title: const Text(
'curated_location_page_title',
'places',
).tr(),
leading: IconButton(
onPressed: () => context.maybePop(),
+1 -1
View File
@@ -13,7 +13,7 @@ class AllVideosPage extends HookConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
return Scaffold(
appBar: AppBar(
title: const Text('all_videos_page_title').tr(),
title: const Text('videos').tr(),
leading: IconButton(
onPressed: () => context.maybePop(),
icon: const Icon(Icons.arrow_back_ios_rounded),
@@ -55,7 +55,7 @@ class PersonResultPage extends HookConsumerWidget {
ListTile(
leading: const Icon(Icons.edit_outlined),
title: const Text(
'search_page_person_edit_name',
'edit_name',
style: TextStyle(fontWeight: FontWeight.bold),
).tr(),
onTap: showEditNameDialog,
@@ -75,13 +75,13 @@ class PersonResultPage extends HookConsumerWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'search_page_person_add_name_title',
'add_a_name',
style: context.textTheme.titleMedium?.copyWith(
color: context.primaryColor,
),
).tr(),
Text(
'search_page_person_add_name_subtitle',
'find_them_fast',
style: context.textTheme.labelLarge,
).tr(),
],
+17 -17
View File
@@ -33,7 +33,7 @@ class SearchPage extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final textSearchType = useState<TextSearchType>(TextSearchType.context);
final searchHintText = useState<String>('contextual_search'.tr());
final searchHintText = useState<String>('sunrise_on_the_beach'.tr());
final textSearchController = useTextEditingController();
final filter = useState<SearchFilter>(
SearchFilter(
@@ -308,9 +308,9 @@ class SearchPage extends HookConsumerWidget {
end: filter.value.date.takenBefore ?? lastDate,
),
helpText: 'search_filter_date_title'.tr(),
cancelText: 'action_common_cancel'.tr(),
confirmText: 'action_common_select'.tr(),
saveText: 'action_common_save'.tr(),
cancelText: 'cancel'.tr(),
confirmText: 'select'.tr(),
saveText: 'save'.tr(),
errorFormatText: 'invalid_date_format'.tr(),
errorInvalidText: 'invalid_date'.tr(),
fieldStartHintText: 'start_date'.tr(),
@@ -372,10 +372,10 @@ class SearchPage extends HookConsumerWidget {
mediaTypeCurrentFilterWidget.value = Text(
assetType == AssetType.image
? 'search_filter_media_type_image'.tr()
? 'image'.tr()
: assetType == AssetType.video
? 'search_filter_media_type_video'.tr()
: 'search_filter_media_type_all'.tr(),
? 'video'.tr()
: 'all'.tr(),
style: context.textTheme.labelLarge,
);
}
@@ -427,7 +427,7 @@ class SearchPage extends HookConsumerWidget {
),
);
if (value) {
filterText.add('search_filter_display_option_archive'.tr());
filterText.add('archive'.tr());
}
break;
case DisplayOption.favorite:
@@ -437,7 +437,7 @@ class SearchPage extends HookConsumerWidget {
),
);
if (value) {
filterText.add('search_filter_display_option_favorite'.tr());
filterText.add('favorite'.tr());
}
break;
}
@@ -470,7 +470,7 @@ class SearchPage extends HookConsumerWidget {
showFilterBottomSheet(
context: context,
child: FilterBottomSheetScaffold(
title: 'search_filter_display_options_title'.tr(),
title: 'display_options'.tr(),
onSearch: search,
onClear: handleClear,
child: DisplayOptionPicker(
@@ -563,7 +563,7 @@ class SearchPage extends HookConsumerWidget {
child: ListTile(
leading: const Icon(Icons.image_search_rounded),
title: Text(
'search_filter_contextual'.tr(),
'search_by_context'.tr(),
style: context.textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.w500,
color: textSearchType.value == TextSearchType.context
@@ -576,7 +576,7 @@ class SearchPage extends HookConsumerWidget {
),
onPressed: () {
textSearchType.value = TextSearchType.context;
searchHintText.value = 'contextual_search'.tr();
searchHintText.value = 'sunrise_on_the_beach'.tr();
},
),
MenuItemButton(
@@ -596,14 +596,14 @@ class SearchPage extends HookConsumerWidget {
),
onPressed: () {
textSearchType.value = TextSearchType.filename;
searchHintText.value = 'filename_search'.tr();
searchHintText.value = 'file_name_or_extension'.tr();
},
),
MenuItemButton(
child: ListTile(
leading: const Icon(Icons.text_snippet_outlined),
title: Text(
'search_filter_description'.tr(),
'search_by_description'.tr(),
style: context.textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.w500,
color:
@@ -618,7 +618,7 @@ class SearchPage extends HookConsumerWidget {
),
onPressed: () {
textSearchType.value = TextSearchType.description;
searchHintText.value = 'description_search'.tr();
searchHintText.value = 'search_by_description_example'.tr();
},
),
],
@@ -675,7 +675,7 @@ class SearchPage extends HookConsumerWidget {
SearchFilterChip(
icon: Icons.people_alt_outlined,
onTap: showPeoplePicker,
label: 'search_filter_people'.tr(),
label: 'people'.tr(),
currentFilter: peopleCurrentFilterWidget.value,
),
SearchFilterChip(
@@ -687,7 +687,7 @@ class SearchPage extends HookConsumerWidget {
SearchFilterChip(
icon: Icons.camera_alt_outlined,
onTap: showCameraPicker,
label: 'search_filter_camera'.tr(),
label: 'camera'.tr(),
currentFilter: cameraCurrentFilterWidget.value,
),
SearchFilterChip(