1
0
mirror of https://github.com/immich-app/immich.git synced 2025-08-10 23:22:22 +02:00

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

View File

@@ -2,51 +2,44 @@ import 'dart:ui';
const Map<String, Locale> locales = {
// Default locale
'English (en_US)': Locale('en', 'US'),
'English (en)': Locale('en'),
// Additional locales
'Arabic (ar_JO)': Locale('ar', 'JO'),
'Arabic (ar)': Locale('ar'),
'Catalan (ca)': Locale('ca'),
'Chinese Simplified (zh_CN)': Locale('zh', 'CN'),
'Chinese Traditional (zh_TW)': Locale('zh', 'TW'),
'Czech (cs_CZ)': Locale('cs', 'CZ'),
'Danish (da_DK)': Locale('da', 'DK'),
'Dutch (nl_NL)': Locale('nl', 'NL'),
'Finnish (fi_FI)': Locale('fi', 'FI'),
'French (fr_CA)': Locale('fr', 'CA'),
'French (fr_FR)': Locale('fr', 'FR'),
'Galician (gl_ES)': Locale('gl', 'ES'),
'German (de_DE)': Locale('de', 'DE'),
'Greek (el_GR)': Locale('el', 'GR'),
'Hebrew (he_IL)': Locale('he', 'IL'),
'Hindi (hi_IN)': Locale('hi', 'IN'),
'Hungarian (hu_HU)': Locale('hu', 'HU'),
'Indonesian (id_ID)': Locale('id', 'ID'),
'Italian (it_IT)': Locale('it', 'IT'),
'Irish (ga_IE)': Locale('ga', 'IE'),
'Japanese (ja_JP)': Locale('ja', 'JP'),
'Korean (ko_KR)': Locale('ko', 'KR'),
'Latvian (lv_LV)': Locale('lv', 'LV'),
'Lithuanian (lt_LT)': Locale('lt', 'LT'),
'Mongolian (mn_MN)': Locale('mn', 'MN'),
'Chinese Simplified (zh_CN)': Locale('zh', 'SIMPLIFIED'),
'Chinese Traditional (zh_TW)': Locale('zh', 'Hant'),
'Czech (cs)': Locale('cs'),
'Danish (da)': Locale('da'),
'Dutch (nl)': Locale('nl'),
'Finnish (fi)': Locale('fi'),
'French (fr)': Locale('fr'),
'Galician (gl)': Locale('gl'),
'German (de)': Locale('de'),
'Greek (el)': Locale('el'),
'Hebrew (he)': Locale('he'),
'Hindi (hi)': Locale('hi'),
'Hungarian (hu)': Locale('hu'),
'Indonesian (id)': Locale('id'),
'Italian (it)': Locale('it'),
'Japanese (ja)': Locale('ja'),
'Korean (ko)': Locale('ko'),
'Latvian (lv)': Locale('lv'),
'Lithuanian (lt)': Locale('lt'),
'Mongolian (mn)': Locale('mn'),
'Norwegian Bokmål (nb_NO)': Locale('nb', 'NO'),
'Polish (pl_PL)': Locale('pl', 'PL'),
'Portuguese (pt_PT)': Locale('pt', 'PT'),
'Romanian (ro_RO)': Locale('ro', 'RO'),
'Russian (ru_RU)': Locale('ru', 'RU'),
'Polish (pl)': Locale('pl'),
'Portuguese (pt)': Locale('pt'),
'Romanian (ro)': Locale('ro'),
'Russian (ru)': Locale('ru'),
'Serbian Cyrillic (sr_Cyrl)': Locale('sr', 'Cyrl'),
'Serbian Latin (sr_Latn)': Locale('sr', 'Latn'),
'Slovak (sk_SK)': Locale('sk', 'SK'),
'Slovenian (sl_SI)': Locale('sl', 'SI'),
'Spanish (es_ES)': Locale('es', 'ES'),
'Spanish (es_MX)': Locale('es', 'MX'),
'Spanish (es_PE)': Locale('es', 'PE'),
'Spanish (es_US)': Locale('es', 'US'),
'Swedish (sv_FI)': Locale('sv', 'FI'),
'Swedish (sv_SE)': Locale('sv', 'SE'),
'Thai (th_TH)': Locale('th', 'TH'),
'Turkish (tr_TR)': Locale('tr', 'TR'),
'Ukrainian (uk_UA)': Locale('uk', 'UA'),
'Vietnamese (vi_VN)': Locale('vi', 'VN'),
'Slovak (sk)': Locale('sk'),
'Slovenian (sl)': Locale('sl'),
'Spanish (es)': Locale('es'),
'Thai (th)': Locale('th'),
'Turkish (tr)': Locale('tr'),
'Ukrainian (uk)': Locale('uk'),
'Vietnamese (vi)': Locale('vi'),
};
const String translationsPath = 'assets/i18n';

View File

@@ -34,7 +34,6 @@ import 'package:timezone/data/latest.dart';
import 'package:immich_mobile/generated/codegen_loader.g.dart';
void main() async {
EasyLocalization.logger.enableBuildModes = [];
ImmichWidgetsBinding();
final db = await Bootstrap.initIsar();
await Bootstrap.initDomain(db);

View File

@@ -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(),
),

View File

@@ -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,

View File

@@ -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(

View File

@@ -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,
),

View File

@@ -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,

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(

View File

@@ -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
? "..."

View File

@@ -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

View File

@@ -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(

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(),
);

View File

@@ -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,
),

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(

View File

@@ -21,7 +21,7 @@ class FavoritesPage extends HookConsumerWidget {
centerTitle: true,
automaticallyImplyLeading: false,
title: const Text(
'favorites_page_title',
'favorites',
).tr(),
);
}

View File

@@ -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(),
),
],
),

View File

@@ -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,
)

View File

@@ -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(),
),

View File

@@ -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,

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,

View File

@@ -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(),
),
],

View File

@@ -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),

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(),

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(),

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),

View File

@@ -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(),
],

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(

View File

@@ -84,12 +84,12 @@ enum AlbumSortMode {
created(0, "library_page_sort_created", _AlbumSortHandlers.created),
mostRecent(
2,
"library_page_sort_most_recent_photo",
"sort_recent",
_AlbumSortHandlers.mostRecent,
),
mostOldest(
5,
"library_page_sort_most_oldest_photo",
"sort_oldest",
_AlbumSortHandlers.mostOldest,
);

View File

@@ -301,7 +301,7 @@ class ManualUploadNotifier extends StateNotifier<ManualUploadState> {
(!ok && !state.cancelToken.isCancelled)) {
await _localNotificationService.showOrUpdateManualUploadStatus(
"backup_manual_title".tr(),
"backup_manual_failed".tr(),
"failed".tr(),
presentBanner: true,
);
hasErrors = true;
@@ -370,7 +370,7 @@ class ManualUploadNotifier extends StateNotifier<ManualUploadState> {
debugPrint("[uploadAssets] could not acquire lock, exiting");
ImmichToast.show(
context: context,
msg: "backup_manual_failed".tr(),
msg: "failed".tr(),
toastType: ToastType.info,
gravity: ToastGravity.BOTTOM,
durationInSecond: 3,

View File

@@ -117,8 +117,8 @@ class _LocationServiceDisabledDialog extends ConfirmDialog {
: super(
title: 'map_location_service_disabled_title'.tr(),
content: 'map_location_service_disabled_content'.tr(),
cancel: 'map_location_dialog_cancel'.tr(),
ok: 'map_location_dialog_yes'.tr(),
cancel: 'cancel'.tr(),
ok: 'yes'.tr(),
onOk: () async {
await Geolocator.openLocationSettings();
},
@@ -130,8 +130,8 @@ class _LocationPermissionDisabledDialog extends ConfirmDialog {
: super(
title: 'map_no_location_permission_title'.tr(),
content: 'map_no_location_permission_content'.tr(),
cancel: 'map_location_dialog_cancel'.tr(),
ok: 'map_location_dialog_yes'.tr(),
cancel: 'cancel'.tr(),
ok: 'yes'.tr(),
onOk: () {},
);
}

View File

@@ -90,7 +90,7 @@ class ActivityTextField extends HookConsumerWidget {
suffixIconColor: liked ? Colors.red[700] : null,
hintText: !isEnabled
? 'shared_album_activities_input_disable'.tr()
: 'shared_album_activities_input_hint'.tr(),
: 'say_something'.tr(),
hintStyle: TextStyle(
fontWeight: FontWeight.normal,
fontSize: 14,

View File

@@ -30,7 +30,7 @@ class DismissibleActivity extends StatelessWidget {
onOk: () {},
title: "shared_album_activity_remove_title",
content: "shared_album_activity_remove_content",
ok: "delete_dialog_ok",
ok: "delete",
),
)
: Future.value(false),

View File

@@ -89,7 +89,7 @@ class AddToAlbumBottomSheet extends HookConsumerWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'common_add_to_album'.tr(),
'add_to_album'.tr(),
style: context.textTheme.displayMedium,
),
TextButton.icon(

View File

@@ -37,7 +37,7 @@ class AddToAlbumSliverList extends HookConsumerWidget {
return Padding(
padding: const EdgeInsets.only(bottom: 8),
child: ExpansionTile(
title: Text('common_shared'.tr()),
title: Text('shared'.tr()),
tilePadding: const EdgeInsets.symmetric(horizontal: 10.0),
leading: const Icon(Icons.group),
children: [

View File

@@ -59,7 +59,7 @@ class AlbumThumbnailCard extends ConsumerWidget {
String? owner;
if (showOwner) {
if (album.ownerId == ref.read(currentUserProvider)?.id) {
owner = 'album_thumbnail_owned'.tr();
owner = 'owned'.tr();
} else if (album.ownerName != null) {
owner = 'album_thumbnail_shared_by'.tr(args: [album.ownerName!]);
}

View File

@@ -67,7 +67,7 @@ class AlbumTitleTextField extends ConsumerWidget {
borderSide: const BorderSide(color: Colors.transparent),
borderRadius: BorderRadius.circular(10),
),
hintText: 'share_add_title'.tr(),
hintText: 'add_a_title'.tr(),
hintStyle: context.themeData.inputDecorationTheme.hintStyle?.copyWith(
fontSize: 28,
fontWeight: FontWeight.bold,

View File

@@ -76,13 +76,13 @@ class AlbumViewerAppbar extends HookConsumerWidget
barrierDismissible: false, // user must tap button!
builder: (BuildContext context) {
return AlertDialog(
title: const Text('album_viewer_appbar_share_delete').tr(),
title: const Text('delete_album').tr(),
content: const Text('album_viewer_appbar_delete_confirm').tr(),
actions: <Widget>[
TextButton(
onPressed: () => context.pop('Cancel'),
child: Text(
'action_common_cancel',
'cancel',
style: TextStyle(
color: context.primaryColor,
fontWeight: FontWeight.bold,
@@ -95,7 +95,7 @@ class AlbumViewerAppbar extends HookConsumerWidget
deleteAlbum();
},
child: Text(
'action_common_confirm',
'confirm',
style: TextStyle(
fontWeight: FontWeight.bold,
color: context.colorScheme.error,
@@ -131,7 +131,7 @@ class AlbumViewerAppbar extends HookConsumerWidget
? ListTile(
leading: const Icon(Icons.delete_forever_rounded),
title: const Text(
'album_viewer_appbar_share_delete',
'delete_album',
style: TextStyle(fontWeight: FontWeight.w500),
).tr(),
onTap: onDeleteAlbumPressed,
@@ -203,7 +203,7 @@ class AlbumViewerAppbar extends HookConsumerWidget
leading: const Icon(Icons.settings_rounded),
onTap: () => context.navigateTo(const AlbumOptionsRoute()),
title: const Text(
"translated_text_options",
"options",
style: TextStyle(fontWeight: FontWeight.w500),
).tr(),
),
@@ -220,7 +220,7 @@ class AlbumViewerAppbar extends HookConsumerWidget
}
},
title: const Text(
"share_add_photos",
"add_photos",
style: TextStyle(fontWeight: FontWeight.w500),
).tr(),
),

View File

@@ -88,7 +88,7 @@ class AlbumViewerEditableTitle extends HookConsumerWidget {
focusColor: Colors.grey[300],
fillColor: context.scaffoldBackgroundColor,
filled: titleFocusNode.hasFocus,
hintText: 'share_add_title'.tr(),
hintText: 'add_a_title'.tr(),
hintStyle: context.themeData.inputDecorationTheme.hintStyle?.copyWith(
fontSize: 28,
),

View File

@@ -130,7 +130,7 @@ class ControlBottomAppBar extends HookConsumerWidget {
iconData: Platform.isAndroid
? Icons.share_rounded
: Icons.ios_share_rounded,
label: "control_bottom_app_bar_share".tr(),
label: "share".tr(),
onPressed: enabled ? () => onShare(true) : null,
),
ControlBoxButton(
@@ -142,10 +142,7 @@ class ControlBottomAppBar extends HookConsumerWidget {
ControlBoxButton(
iconData:
unarchive ? Icons.unarchive_outlined : Icons.archive_outlined,
label: (unarchive
? "control_bottom_app_bar_unarchive"
: "control_bottom_app_bar_archive")
.tr(),
label: (unarchive ? "unarchive" : "archive").tr(),
onPressed: enabled ? onArchive : null,
),
if (hasRemote && onFavorite != null)
@@ -153,10 +150,7 @@ class ControlBottomAppBar extends HookConsumerWidget {
iconData: unfavorite
? Icons.favorite_border_rounded
: Icons.favorite_rounded,
label: (unfavorite
? "control_bottom_app_bar_unfavorite"
: "control_bottom_app_bar_favorite")
.tr(),
label: (unfavorite ? "unfavorite" : "favorite").tr(),
onPressed: enabled ? onFavorite : null,
),
if (hasLocal && hasRemote && onDelete != null)
@@ -164,7 +158,7 @@ class ControlBottomAppBar extends HookConsumerWidget {
constraints: const BoxConstraints(maxWidth: 90),
child: ControlBoxButton(
iconData: Icons.delete_sweep_outlined,
label: "control_bottom_app_bar_delete".tr(),
label: "delete".tr(),
onPressed: enabled
? () => handleRemoteDelete(!trashEnabled, onDelete!)
: null,
@@ -244,7 +238,7 @@ class ControlBottomAppBar extends HookConsumerWidget {
constraints: const BoxConstraints(maxWidth: 90),
child: ControlBoxButton(
iconData: Icons.filter_none_rounded,
label: "control_bottom_app_bar_stack".tr(),
label: "stack".tr(),
onPressed: enabled ? onStack : null,
),
),
@@ -253,14 +247,14 @@ class ControlBottomAppBar extends HookConsumerWidget {
constraints: const BoxConstraints(maxWidth: 90),
child: ControlBoxButton(
iconData: Icons.remove_circle_outline,
label: 'album_viewer_appbar_share_remove'.tr(),
label: 'remove_from_album'.tr(),
onPressed: enabled ? onRemoveFromAlbum : null,
),
),
if (selectionAssetState.hasLocal)
ControlBoxButton(
iconData: Icons.backup_outlined,
label: "control_bottom_app_bar_upload".tr(),
label: "upload".tr(),
onPressed: enabled
? () => showDialog(
context: context,
@@ -359,7 +353,7 @@ class _AddToAlbumTitleRow extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
"common_add_to_album",
"add_to_album",
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,

View File

@@ -10,8 +10,8 @@ class DeleteDialog extends ConfirmDialog {
: super(
title: "delete_dialog_title",
content: alert ?? "delete_dialog_alert",
cancel: "delete_dialog_cancel",
ok: "delete_dialog_ok",
cancel: "cancel",
ok: "delete",
onOk: onDelete,
);
}
@@ -46,7 +46,7 @@ class DeleteLocalOnlyDialog extends StatelessWidget {
TextButton(
onPressed: () => context.pop(),
child: Text(
"delete_dialog_cancel",
"cancel",
style: TextStyle(
color: context.primaryColor,
fontWeight: FontWeight.bold,

View File

@@ -7,8 +7,8 @@ class UploadDialog extends ConfirmDialog {
: super(
title: 'upload_dialog_title',
content: 'upload_dialog_info',
cancel: 'upload_dialog_cancel',
ok: 'upload_dialog_ok',
cancel: 'cancel',
ok: 'upload',
onOk: onUpload,
);
}

View File

@@ -273,16 +273,16 @@ class BottomGalleryBar extends ConsumerWidget {
icon: Icon(
Platform.isAndroid ? Icons.share_rounded : Icons.ios_share_rounded,
),
label: 'control_bottom_app_bar_share'.tr(),
tooltip: 'control_bottom_app_bar_share'.tr(),
label: 'share'.tr(),
tooltip: 'share'.tr(),
): (_) => shareAsset(),
},
if (asset.isImage)
{
BottomNavigationBarItem(
icon: const Icon(Icons.tune_outlined),
label: 'control_bottom_app_bar_edit'.tr(),
tooltip: 'control_bottom_app_bar_edit'.tr(),
label: 'edit'.tr(),
tooltip: 'edit'.tr(),
): (_) => handleEdit(),
},
if (isOwner)
@@ -290,45 +290,45 @@ class BottomGalleryBar extends ConsumerWidget {
asset.isArchived
? BottomNavigationBarItem(
icon: const Icon(Icons.unarchive_rounded),
label: 'control_bottom_app_bar_unarchive'.tr(),
tooltip: 'control_bottom_app_bar_unarchive'.tr(),
label: 'unarchive'.tr(),
tooltip: 'unarchive'.tr(),
)
: BottomNavigationBarItem(
icon: const Icon(Icons.archive_outlined),
label: 'control_bottom_app_bar_archive'.tr(),
tooltip: 'control_bottom_app_bar_archive'.tr(),
label: 'archive'.tr(),
tooltip: 'archive'.tr(),
): (_) => handleArchive(),
},
if (isOwner && asset.stackCount > 0)
{
BottomNavigationBarItem(
icon: const Icon(Icons.burst_mode_outlined),
label: 'control_bottom_app_bar_stack'.tr(),
tooltip: 'control_bottom_app_bar_stack'.tr(),
label: 'stack'.tr(),
tooltip: 'stack'.tr(),
): (_) => showStackActionItems(),
},
if (isOwner && !isInAlbum)
{
BottomNavigationBarItem(
icon: const Icon(Icons.delete_outline),
label: 'control_bottom_app_bar_delete'.tr(),
tooltip: 'control_bottom_app_bar_delete'.tr(),
label: 'delete'.tr(),
tooltip: 'delete'.tr(),
): (_) => handleDelete(),
},
if (!isOwner)
{
BottomNavigationBarItem(
icon: const Icon(Icons.download_outlined),
label: 'control_bottom_app_bar_download'.tr(),
tooltip: 'control_bottom_app_bar_download'.tr(),
label: 'download'.tr(),
tooltip: 'download'.tr(),
): (_) => handleDownload(),
},
if (isInAlbum)
{
BottomNavigationBarItem(
icon: const Icon(Icons.remove_circle_outline),
label: 'album_viewer_appbar_share_remove'.tr(),
tooltip: 'album_viewer_appbar_share_remove'.tr(),
label: 'remove_from_album'.tr(),
tooltip: 'remove_from_album'.tr(),
): (_) => handleRemoveFromAlbum(),
},
];

View File

@@ -34,7 +34,7 @@ class AssetLocation extends HookConsumerWidget {
contentPadding: const EdgeInsets.all(0),
leading: const Icon(Icons.location_on),
title: Text(
"exif_bottom_sheet_location_add",
"add_a_location",
style: context.textTheme.bodyMedium?.copyWith(
fontWeight: FontWeight.w600,
color: context.primaryColor,

View File

@@ -185,7 +185,7 @@ class AlbumInfoCard extends HookConsumerWidget {
padding: const EdgeInsets.only(top: 2.0),
child: Text(
album.assetCount.toString() +
(album.isAll ? " (${'backup_all'.tr()})" : ""),
(album.isAll ? " (${'all'.tr()})" : ""),
style: TextStyle(
fontSize: 12,
color: Colors.grey[600],

View File

@@ -96,7 +96,7 @@ class ImmichAppBarDialog extends HookConsumerWidget {
buildSettingButton() {
return buildActionButton(
Icons.settings_outlined,
"profile_drawer_settings",
"settings",
() => context.pushRoute(const SettingsRoute()),
);
}
@@ -112,7 +112,7 @@ class ImmichAppBarDialog extends HookConsumerWidget {
buildSignOutButton() {
return buildActionButton(
Icons.logout_rounded,
"profile_drawer_sign_out",
"sign_out",
() async {
if (isLoggingOut.value) {
return;
@@ -124,7 +124,7 @@ class ImmichAppBarDialog extends HookConsumerWidget {
return ConfirmDialog(
title: "app_bar_signout_dialog_title",
content: "app_bar_signout_dialog_content",
ok: "app_bar_signout_dialog_ok",
ok: "yes",
onOk: () async {
isLoggingOut.value = true;
await ref
@@ -229,7 +229,7 @@ class ImmichAppBarDialog extends HookConsumerWidget {
);
},
child: Text(
"profile_drawer_documentation",
"documentation",
style: context.textTheme.bodySmall,
).tr(),
),

View File

@@ -115,7 +115,7 @@ class AppBarServerInfo extends HookConsumerWidget {
child: Padding(
padding: const EdgeInsets.only(left: 10.0),
child: Text(
"server_info_box_server_version".tr(),
"server_version".tr(),
style: TextStyle(
fontSize: titleFontSize,
color: context.textTheme.labelSmall?.color,
@@ -218,7 +218,7 @@ class AppBarServerInfo extends HookConsumerWidget {
),
),
Text(
"server_info_box_latest_release".tr(),
"latest_version".tr(),
style: TextStyle(
fontSize: titleFontSize,
color: context.textTheme.labelSmall?.color,

View File

@@ -14,7 +14,7 @@ class ConfirmDialog extends StatelessWidget {
required this.onOk,
required this.title,
required this.content,
this.cancel = "delete_dialog_cancel",
this.cancel = "cancel",
this.ok = "backup_controller_page_background_battery_info_ok",
});

View File

@@ -139,7 +139,7 @@ class _DateTimePicker extends HookWidget {
TextButton(
onPressed: () => context.pop(),
child: Text(
"action_common_cancel",
"cancel",
style: context.textTheme.bodyMedium?.copyWith(
fontWeight: FontWeight.w600,
color: context.colorScheme.error,
@@ -162,7 +162,7 @@ class _DateTimePicker extends HookWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
"edit_date_time_dialog_date_time",
"date_and_time",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
@@ -197,8 +197,8 @@ class _DateTimePicker extends HookWidget {
Icons.arrow_drop_down,
color: context.primaryColor,
),
hintText: "edit_date_time_dialog_timezone".tr(),
label: const Text('edit_date_time_dialog_timezone').tr(),
hintText: "timezone".tr(),
label: const Text('timezone').tr(),
textStyle: context.textTheme.bodyMedium,
onSelected: (value) => tzOffset.value = value,
initialSelection: tzOffset.value,

View File

@@ -94,7 +94,7 @@ class DropdownSearchMenu<T> extends HookWidget {
focusNode: focusNode,
controller: textEditingController,
decoration: inputDecoration.copyWith(
hintText: "edit_date_time_dialog_search_timezone".tr(),
hintText: "search_timezone".tr(),
),
maxLines: 1,
style: context.textTheme.bodyMedium,

View File

@@ -71,7 +71,7 @@ class _LocationPicker extends HookWidget {
TextButton(
onPressed: () => context.pop(),
child: Text(
"action_common_cancel",
"cancel",
style: context.textTheme.bodyMedium?.copyWith(
fontWeight: FontWeight.w600,
color: context.colorScheme.error,
@@ -203,7 +203,7 @@ class _ManualPicker extends HookWidget {
const SizedBox(height: 12),
_ManualPickerInput(
initialValue: latlng.latitude.toStringAsFixed(4),
decorationText: "location_picker_latitude",
decorationText: "latitude",
hintText: "location_picker_latitude_hint",
errorText: "location_picker_latitude_error",
focusNode: latitiudeFocusNode,
@@ -213,7 +213,7 @@ class _ManualPicker extends HookWidget {
const SizedBox(height: 24),
_ManualPickerInput(
initialValue: latlng.longitude.toStringAsFixed(4),
decorationText: "location_picker_longitude",
decorationText: "longitude",
hintText: "location_picker_longitude_hint",
errorText: "location_picker_longitude_error",
focusNode: longitudeFocusNode,

View File

@@ -34,7 +34,7 @@ class ChangePasswordForm extends HookConsumerWidget {
alignment: WrapAlignment.start,
children: [
Text(
'common_change_password'.tr(),
'change_password'.tr(),
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
@@ -110,7 +110,7 @@ class ChangePasswordForm extends HookConsumerWidget {
TextButton.icon(
icon: const Icon(Icons.arrow_back),
onPressed: () => AutoRouter.of(context).back(),
label: const Text('action_common_back').tr(),
label: const Text('back').tr(),
),
],
),
@@ -193,7 +193,7 @@ class ChangePasswordButton extends ConsumerWidget {
),
onPressed: onPressed,
child: Text(
'common_change_password'.tr(),
'change_password'.tr(),
style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold),
),
);

View File

@@ -29,7 +29,7 @@ class EmailInput extends StatelessWidget {
autofocus: true,
controller: controller,
decoration: InputDecoration(
labelText: 'login_form_label_email'.tr(),
labelText: 'email'.tr(),
border: const OutlineInputBorder(),
hintText: 'login_form_email_hint'.tr(),
hintStyle: const TextStyle(

View File

@@ -19,7 +19,7 @@ class LoginButton extends ConsumerWidget {
onPressed: onPressed,
icon: const Icon(Icons.login_rounded),
label: const Text(
"login_form_button_text",
"login",
style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold),
).tr(),
);

View File

@@ -323,7 +323,7 @@ class LoginForm extends HookConsumerWidget {
isLoadingServer.value ? null : getServerAuthSettings,
icon: const Icon(Icons.arrow_forward_rounded),
label: const Text(
'login_form_next_button',
'next',
style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold),
).tr(),
),
@@ -430,7 +430,7 @@ class LoginForm extends HookConsumerWidget {
TextButton.icon(
icon: const Icon(Icons.arrow_back),
onPressed: () => serverEndpoint.value = null,
label: const Text('login_form_back_button_text').tr(),
label: const Text('back').tr(),
),
],
),

View File

@@ -23,7 +23,7 @@ class PasswordInput extends HookConsumerWidget {
obscureText: !isPasswordVisible.value,
controller: controller,
decoration: InputDecoration(
labelText: 'login_form_label_password'.tr(),
labelText: 'password'.tr(),
border: const OutlineInputBorder(),
hintText: 'login_form_password_hint'.tr(),
hintStyle: const TextStyle(

View File

@@ -21,7 +21,7 @@ class MapTimeDropDown extends StatelessWidget {
Padding(
padding: const EdgeInsets.only(bottom: 20),
child: Text(
"map_settings_only_relative_range".tr(),
"date_range".tr(),
style: const TextStyle(fontWeight: FontWeight.bold),
),
),
@@ -35,7 +35,7 @@ class MapTimeDropDown extends StatelessWidget {
dropdownMenuEntries: [
DropdownMenuEntry(
value: 0,
label: "map_settings_date_range_option_all".tr(),
label: "all".tr(),
),
DropdownMenuEntry(
value: 1,

View File

@@ -29,7 +29,7 @@ class PersonNameEditForm extends HookConsumerWidget {
return AlertDialog(
title: const Text(
"search_page_person_add_name_dialog_title",
"add_a_name",
style: TextStyle(fontWeight: FontWeight.bold),
).tr(),
content: SingleChildScrollView(
@@ -37,7 +37,7 @@ class PersonNameEditForm extends HookConsumerWidget {
controller: controller,
autofocus: true,
decoration: InputDecoration(
hintText: 'search_page_person_add_name_dialog_hint'.tr(),
hintText: 'name'.tr(),
border: const OutlineInputBorder(),
errorText: isError.value ? 'Error occured' : null,
),
@@ -49,7 +49,7 @@ class PersonNameEditForm extends HookConsumerWidget {
PersonNameEditFormResult(false, ''),
),
child: Text(
"search_page_person_add_name_dialog_cancel",
"cancel",
style: TextStyle(
color: Colors.red[300],
fontWeight: FontWeight.bold,
@@ -68,7 +68,7 @@ class PersonNameEditForm extends HookConsumerWidget {
}
},
child: Text(
"search_page_person_add_name_dialog_save",
"save",
style: TextStyle(
color: context.primaryColor,
fontWeight: FontWeight.bold,

View File

@@ -47,7 +47,7 @@ class CameraPicker extends HookConsumerWidget {
.toList(),
_ => [],
},
label: const Text('search_filter_camera_make').tr(),
label: const Text('make').tr(),
controller: makeTextController,
leadingIcon: const Icon(Icons.photo_camera_rounded),
onSelected: (value) {
@@ -76,7 +76,7 @@ class CameraPicker extends HookConsumerWidget {
.toList(),
_ => [],
},
label: const Text('search_filter_camera_model').tr(),
label: const Text('model').tr(),
controller: modelTextController,
leadingIcon: const Icon(Icons.camera),
onSelected: (value) {

View File

@@ -42,7 +42,7 @@ class DisplayOptionPicker extends HookWidget {
},
),
CheckboxListTile(
title: const Text('search_filter_display_option_favorite').tr(),
title: const Text('favorite').tr(),
value: options.value[DisplayOption.favorite],
onChanged: (value) {
options.value = {
@@ -53,7 +53,7 @@ class DisplayOptionPicker extends HookWidget {
},
),
CheckboxListTile(
title: const Text('search_filter_display_option_archive').tr(),
title: const Text('archive').tr(),
value: options.value[DisplayOption.archive],
onChanged: (value) {
options.value = {

View File

@@ -49,7 +49,7 @@ class FilterBottomSheetScaffold extends StatelessWidget {
onClear();
context.pop();
},
child: const Text('action_common_clear').tr(),
child: const Text('clear').tr(),
),
const SizedBox(width: 8),
ElevatedButton(

View File

@@ -63,7 +63,7 @@ class LocationPicker extends HookConsumerWidget {
.toList(),
_ => [],
},
label: const Text('search_filter_location_country').tr(),
label: const Text('country').tr(),
controller: countryTextController,
onSelected: (value) {
if (value.toString() == selectedCountry.value) {
@@ -95,7 +95,7 @@ class LocationPicker extends HookConsumerWidget {
.toList(),
_ => [],
},
label: const Text('search_filter_location_state').tr(),
label: const Text('state').tr(),
controller: stateTextController,
onSelected: (value) {
if (value.toString() == selectedState.value) {
@@ -126,7 +126,7 @@ class LocationPicker extends HookConsumerWidget {
.toList(),
_ => [],
},
label: const Text('search_filter_location_city').tr(),
label: const Text('city').tr(),
controller: cityTextController,
onSelected: (value) {
selectedCity.value = value.toString();

View File

@@ -17,8 +17,8 @@ class MediaTypePicker extends HookWidget {
shrinkWrap: true,
children: [
RadioListTile(
key: const Key("search_filter_media_type_all"),
title: const Text("search_filter_media_type_all").tr(),
key: const Key("all"),
title: const Text("all").tr(),
value: AssetType.other,
onChanged: (value) {
selectedMediaType.value = value!;
@@ -27,8 +27,8 @@ class MediaTypePicker extends HookWidget {
groupValue: selectedMediaType.value,
),
RadioListTile(
key: const Key("search_filter_media_type_image"),
title: const Text("search_filter_media_type_image").tr(),
key: const Key("image"),
title: const Text("image").tr(),
value: AssetType.image,
onChanged: (value) {
selectedMediaType.value = value!;
@@ -37,8 +37,8 @@ class MediaTypePicker extends HookWidget {
groupValue: selectedMediaType.value,
),
RadioListTile(
key: const Key("search_filter_media_type_video"),
title: const Text("search_filter_media_type_video").tr(),
key: const Key("video"),
title: const Text("video").tr(),
value: AssetType.video,
onChanged: (value) {
selectedMediaType.value = value!;

View File

@@ -35,7 +35,7 @@ class PeoplePicker extends HookConsumerWidget {
onChanged: (value) => searchQuery.value = value,
onTapOutside: (_) => formFocus.unfocus(),
filled: true,
hintText: 'search_filter_people_hint'.tr(),
hintText: 'filter_people'.tr(),
),
),
Padding(

View File

@@ -40,7 +40,7 @@ class GroupSettings extends HookConsumerWidget {
value: GroupAssetsBy.day,
),
SettingsRadioGroup(
title: 'asset_list_layout_settings_group_by_month'.tr(),
title: 'month'.tr(),
value: GroupAssetsBy.month,
),
SettingsRadioGroup(

View File

@@ -21,11 +21,11 @@ class VideoViewerSettings extends HookConsumerWidget {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SettingsSubTitle(title: "setting_video_viewer_title".tr()),
SettingsSubTitle(title: "videos".tr()),
SettingsSwitchListTile(
valueNotifier: useLoopVideo,
title: "setting_video_viewer_looping_title".tr(),
subtitle: "setting_video_viewer_looping_subtitle".tr(),
subtitle: "loop_videos_description".tr(),
onChanged: (_) => ref.invalidate(appSettingsServiceProvider),
),
SettingsSwitchListTile(

View File

@@ -43,12 +43,12 @@ class NotificationSetting extends HookConsumerWidget {
content: const Text('notification_permission_dialog_content').tr(),
actions: [
TextButton(
child: const Text('notification_permission_dialog_cancel').tr(),
child: const Text('cancel').tr(),
onPressed: () => ctx.pop(),
),
TextButton(
onPressed: () => openAppNotificationSettings(ctx),
child: const Text('notification_permission_dialog_settings').tr(),
child: const Text('settings').tr(),
),
],
),

View File

@@ -81,7 +81,7 @@ class ThemeSetting extends HookConsumerWidget {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SettingsSubTitle(title: "theme_setting_theme_title".tr()),
SettingsSubTitle(title: "theme".tr()),
SettingsSwitchListTile(
valueNotifier: isSystemTheme,
title: 'theme_setting_system_theme_switch'.tr(),
@@ -90,7 +90,7 @@ class ThemeSetting extends HookConsumerWidget {
if (currentTheme.value != ThemeMode.system)
SettingsSwitchListTile(
valueNotifier: isDarkTheme,
title: 'theme_setting_dark_mode_switch'.tr(),
title: 'map_settings_dark_mode'.tr(),
onChanged: onThemeChange,
),
const PrimaryColorSetting(),

View File

@@ -64,7 +64,7 @@ class _SslClientCertSettingsState extends State<SslClientCertSettings> {
onPressed: widget.isLoggedIn || !isCertExist
? null
: () => removeCert(context),
child: Text("client_cert_remove".tr()),
child: Text("remove".tr()),
),
],
),

View File

@@ -33,7 +33,7 @@ class SharedLinkItem extends ConsumerWidget {
if (sharedLink.expiresAt != null) {
if (isExpired()) {
return Text(
"shared_link_expired",
"expired",
style: TextStyle(color: Colors.red[300]),
).tr();
}
@@ -114,7 +114,7 @@ class SharedLinkItem extends ConsumerWidget {
builder: (BuildContext context) {
return ConfirmDialog(
title: "delete_shared_link_dialog_title",
content: "delete_shared_link_dialog_content",
content: "confirm_delete_shared_link",
onOk: () => ref
.read(sharedLinksStateProvider.notifier)
.deleteLink(sharedLink.id),
@@ -178,10 +178,8 @@ class SharedLinkItem extends ConsumerWidget {
Widget buildBottomInfo() {
return Row(
children: [
if (sharedLink.allowUpload)
buildInfoChip("shared_link_info_chip_upload".tr()),
if (sharedLink.allowDownload)
buildInfoChip("shared_link_info_chip_download".tr()),
if (sharedLink.allowUpload) buildInfoChip("upload".tr()),
if (sharedLink.allowDownload) buildInfoChip("download".tr()),
if (sharedLink.showMetadata)
buildInfoChip("shared_link_info_chip_metadata".tr()),
],