Ukrainian translation polished; localized remaining hardcoded UI strings

This commit is contained in:
Serge Tarkovski
2026-04-23 17:27:39 +03:00
parent 6b6a881c7a
commit 5e446207c6
52 changed files with 2543 additions and 417 deletions
+9 -4
View File
@@ -1237,15 +1237,20 @@ class AppSettingsScreen extends StatelessWidget {
if (!context.mounted) return;
showDismissibleSnackBar(
context,
// TODO: l10n
content: Text('Deleted ${translationModelFriendlyName(model)}.'),
content: Text(
context.l10n.appSettings_translationModelDeleted(
translationModelFriendlyName(model),
),
),
);
} catch (error) {
if (!context.mounted) return;
showDismissibleSnackBar(
context,
content: Text('Delete failed: $error'),
); // TODO: l10n
content: Text(
context.l10n.appSettings_translationModelDeleteFailed('$error'),
),
);
}
}
+3 -1
View File
@@ -555,7 +555,9 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
? const EdgeInsets.symmetric(horizontal: 8)
: EdgeInsets.zero,
child: Text(
'via ${_formatPathPrefixes(displayPath)}',
context.l10n.channels_via(
_formatPathPrefixes(displayPath),
),
style: TextStyle(
fontSize: 11,
color: Colors.grey[600],
+1 -1
View File
@@ -1492,7 +1492,7 @@ class _ChannelsScreenState extends State<ChannelsScreen>
if (!context.mounted) return;
showDismissibleSnackBar(
context,
content: Text('Failed to update channel: $e'),
content: Text(context.l10n.channels_channelUpdateFailed('$e')),
);
}
},
+2 -2
View File
@@ -1168,8 +1168,8 @@ class _ChatScreenState extends State<ChatScreen> {
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildInfoRow(context.l10n.chat_type, contact.typeLabel),
_buildInfoRow(context.l10n.chat_path, contact.pathLabel),
_buildInfoRow(context.l10n.chat_type, contact.typeLabelLocalized(context.l10n)),
_buildInfoRow(context.l10n.chat_path, contact.pathLabel(context.l10n)),
_buildInfoRow(
context.l10n.contact_lastSeen,
_formatContactLastMessage(contact.lastMessageAt),
+4 -2
View File
@@ -1122,7 +1122,9 @@ class _ContactsScreenState extends State<ContactsScreen>
return CheckboxListTile(
value: isSelected,
title: Text(contact.name),
subtitle: Text(contact.typeLabel),
subtitle: Text(
contact.typeLabelLocalized(context.l10n),
),
onChanged: (value) {
setDialogState(() {
if (value == true) {
@@ -1464,7 +1466,7 @@ class _ContactTile extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
contact.pathLabel,
contact.pathLabel(context.l10n),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
+7 -7
View File
@@ -1425,23 +1425,23 @@ class _MapScreenState extends State<MapScreen> {
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildInfoRow('Type', contact.typeLabel),
_buildInfoRow('Path', contact.pathLabel),
_buildInfoRow(context.l10n.map_type, contact.typeLabelLocalized(context.l10n)),
_buildInfoRow(context.l10n.map_path, contact.pathLabel(context.l10n)),
if (contact.hasLocation)
_buildInfoRow(
'Location',
context.l10n.map_location,
'${contact.latitude!.toStringAsFixed(6)}, ${contact.longitude!.toStringAsFixed(6)}',
)
else if (guessedPosition != null)
_buildInfoRow(
'Est. Location',
context.l10n.map_estLocation,
'~${guessedPosition.latitude.toStringAsFixed(6)}, ${guessedPosition.longitude.toStringAsFixed(6)}',
),
_buildInfoRow(
context.l10n.map_lastSeen,
_formatLastSeen(contact.lastSeen),
),
_buildInfoRow('Public Key', contact.publicKeyHex),
_buildInfoRow(context.l10n.map_publicKey, contact.publicKeyHex),
],
),
actions: [
@@ -1550,7 +1550,7 @@ class _MapScreenState extends State<MapScreen> {
_buildInfoRow(context.l10n.map_from, marker.fromName),
_buildInfoRow(context.l10n.map_source, marker.sourceLabel),
_buildInfoRow(
'Location',
context.l10n.map_location,
'${marker.position.latitude.toStringAsFixed(6)}, ${marker.position.longitude.toStringAsFixed(6)}',
),
if (marker.flags.isNotEmpty)
@@ -2019,7 +2019,7 @@ class _MapScreenState extends State<MapScreen> {
enabled: settings.mapKeyPrefixEnabled,
decoration: InputDecoration(
labelText: context.l10n.map_publicKeyPrefix,
hintText: 'e.g. ab12',
hintText: context.l10n.map_publicKeyPrefixHint,
border: const OutlineInputBorder(),
isDense: true,
),
+1 -1
View File
@@ -93,7 +93,7 @@ class RepeaterHubScreen extends StatelessWidget {
),
const SizedBox(height: 8),
Text(
repeater.pathLabel,
repeater.pathLabel(context.l10n),
style: TextStyle(fontSize: 14, color: Colors.grey[600]),
),
if (repeater.hasLocation) ...[
+2 -2
View File
@@ -341,9 +341,9 @@ class _SettingsScreenState extends State<SettingsScreen> {
),
ListTile(
leading: const Icon(Icons.delete_outline, color: Colors.red),
title: Text("Delete All Paths"),
title: Text(l10n.settings_deleteAllPaths),
subtitle: Text(
"Clear all path data from contacts.",
l10n.settings_deleteAllPathsSubtitle,
style: TextStyle(color: Colors.red[700]),
),
onTap: () => connector.deleteAllPaths(),