Refactor localization in UI components and error messages

- Updated various UI components to utilize AppLocalizations for better internationalization support.
- Replaced hardcoded strings with localized strings in home_screen.dart, ble_connection_manager.dart, contact_tile.dart, room_login_sheet.dart, compass widgets, and sar_update_sheet.dart.
- Improved user feedback messages by integrating localization for actions like pinging contacts, displaying connection statuses, and error notifications.
- Enhanced the clarity of UI elements by ensuring all text is translatable, improving the overall user experience for non-English speakers.
This commit is contained in:
Janez T
2025-10-16 15:39:48 +02:00
parent 1056380f3a
commit 01a1bbec44
17 changed files with 2469 additions and 217 deletions

View File

@@ -677,5 +677,496 @@
"typeYourMessage": "Type your message...",
"@typeYourMessage": {
"description": "Placeholder text for message input field"
},
"quickLocationMarker": "Quick location marker",
"@quickLocationMarker": {
"description": "Subtitle for SAR marker sheet header"
},
"markerType": "Marker Type",
"@markerType": {
"description": "Label for marker type selection section"
},
"sendTo": "Send To",
"@sendTo": {
"description": "Label for destination selection section"
},
"noDestinationsAvailable": "No destinations available.",
"@noDestinationsAvailable": {
"description": "Warning when no rooms or channels exist"
},
"selectDestination": "Select destination...",
"@selectDestination": {
"description": "Placeholder for destination dropdown"
},
"ephemeralBroadcastInfo": "Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.",
"@ephemeralBroadcastInfo": {
"description": "Information about ephemeral channel broadcasts"
},
"persistentRoomInfo": "Persistent: Stored immutably in room. Synced automatically and preserved offline.",
"@persistentRoomInfo": {
"description": "Information about persistent room storage"
},
"location": "Location",
"@location": {
"description": "Label for location section"
},
"fromMap": "From Map",
"@fromMap": {
"description": "Badge showing location is from map tap"
},
"gettingLocation": "Getting location...",
"@gettingLocation": {
"description": "Loading message while fetching GPS location"
},
"locationError": "Location Error",
"@locationError": {
"description": "Title for location error messages"
},
"retry": "Retry",
"@retry": {
"description": "Retry button label"
},
"refreshLocation": "Refresh location",
"@refreshLocation": {
"description": "Tooltip for refresh location button"
},
"accuracyMeters": "Accuracy: ±{accuracy}m",
"@accuracyMeters": {
"description": "Display of GPS accuracy in meters",
"placeholders": {
"accuracy": {
"type": "int"
}
}
},
"notesOptional": "Notes (optional)",
"@notesOptional": {
"description": "Label for optional notes field"
},
"addAdditionalInformation": "Add additional information...",
"@addAdditionalInformation": {
"description": "Placeholder for notes field"
},
"lowAccuracyWarning": "Location accuracy is ±{accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?",
"@lowAccuracyWarning": {
"description": "Warning dialog content for low GPS accuracy",
"placeholders": {
"accuracy": {
"type": "int"
}
}
},
"loginToRoom": "Login to Room",
"@loginToRoom": {
"description": "Title for room login dialog"
},
"enterPasswordInfo": "Enter the password to access this room. The password will be saved for future use.",
"@enterPasswordInfo": {
"description": "Information about room password"
},
"password": "Password",
"@password": {
"description": "Password field label"
},
"enterRoomPassword": "Enter room password",
"@enterRoomPassword": {
"description": "Password field hint"
},
"loggingInDots": "Logging in...",
"@loggingInDots": {
"description": "Button text while logging in"
},
"login": "Login",
"@login": {
"description": "Login button label"
},
"failedToAddRoom": "Failed to add room to device: {error}\n\nThe room may not have advertised yet.\nTry waiting for the room to broadcast.",
"@failedToAddRoom": {
"description": "Error message when adding room fails",
"placeholders": {
"error": {
"type": "String"
}
}
},
"direct": "Direct",
"@direct": {
"description": "Direct routing indicator"
},
"flood": "Flood",
"@flood": {
"description": "Flood routing indicator"
},
"admin": "Admin",
"@admin": {
"description": "Admin badge label"
},
"loggedIn": "Logged In",
"@loggedIn": {
"description": "Logged in status badge"
},
"noGpsData": "No GPS data",
"@noGpsData": {
"description": "Message when GPS data is not available"
},
"distance": "Distance",
"@distance": {
"description": "Distance label"
},
"pingingDirect": "Pinging {name} (direct via path)...",
"@pingingDirect": {
"description": "Status message for direct ping",
"placeholders": {
"name": {
"type": "String"
}
}
},
"pingingFlood": "Pinging {name} (flooding - no path)...",
"@pingingFlood": {
"description": "Status message for flood ping",
"placeholders": {
"name": {
"type": "String"
}
}
},
"directPingTimeout": "Direct ping timeout - retrying {name} with flooding...",
"@directPingTimeout": {
"description": "Warning when direct ping times out",
"placeholders": {
"name": {
"type": "String"
}
}
},
"pingSuccessful": "Ping successful to {name}{fallback}",
"@pingSuccessful": {
"description": "Success message for ping",
"placeholders": {
"name": {
"type": "String"
},
"fallback": {
"type": "String"
}
}
},
"viaFloodingFallback": " (via flooding fallback)",
"@viaFloodingFallback": {
"description": "Suffix for ping success with fallback"
},
"pingFailed": "Ping failed to {name} - no response received",
"@pingFailed": {
"description": "Error message when ping fails",
"placeholders": {
"name": {
"type": "String"
}
}
},
"deleteContactConfirmation": "Are you sure you want to delete \"{name}\"?\n\nThis will remove the contact from both the app and the companion radio device.",
"@deleteContactConfirmation": {
"description": "Confirmation message for deleting contact",
"placeholders": {
"name": {
"type": "String"
}
}
},
"removingContact": "Removing {name}...",
"@removingContact": {
"description": "Status message while removing contact",
"placeholders": {
"name": {
"type": "String"
}
}
},
"contactRemoved": "Contact \"{name}\" removed",
"@contactRemoved": {
"description": "Success message after removing contact",
"placeholders": {
"name": {
"type": "String"
}
}
},
"failedToRemoveContact": "Failed to remove contact: {error}",
"@failedToRemoveContact": {
"description": "Error message when contact removal fails",
"placeholders": {
"error": {
"type": "String"
}
}
},
"type": "Type",
"@type": {
"description": "Contact type label"
},
"publicKey": "Public Key",
"@publicKey": {
"description": "Public key label"
},
"lastSeen": "Last Seen",
"@lastSeen": {
"description": "Last seen label"
},
"roomStatus": "Room Status",
"@roomStatus": {
"description": "Room status section header"
},
"loginStatus": "Login Status",
"@loginStatus": {
"description": "Login status label"
},
"notLoggedIn": "Not Logged In",
"@notLoggedIn": {
"description": "Not logged in status"
},
"adminAccess": "Admin Access",
"@adminAccess": {
"description": "Admin access label"
},
"yes": "Yes",
"@yes": {
"description": "Yes answer"
},
"no": "No",
"@no": {
"description": "No answer"
},
"permissions": "Permissions",
"@permissions": {
"description": "Permissions label"
},
"passwordSaved": "Password Saved",
"@passwordSaved": {
"description": "Password saved label"
},
"locationColon": "Location:",
"@locationColon": {
"description": "Location section header"
},
"telemetry": "Telemetry",
"@telemetry": {
"description": "Telemetry section header"
},
"requestingTelemetry": "Requesting telemetry from {name}...",
"@requestingTelemetry": {
"description": "Status message while requesting telemetry",
"placeholders": {
"name": {
"type": "String"
}
}
},
"voltage": "Voltage",
"@voltage": {
"description": "Voltage label"
},
"battery": "Battery",
"@battery": {
"description": "Battery label"
},
"temperature": "Temperature",
"@temperature": {
"description": "Temperature label"
},
"humidity": "Humidity",
"@humidity": {
"description": "Humidity label"
},
"pressure": "Pressure",
"@pressure": {
"description": "Pressure label"
},
"gpsTelemetry": "GPS (Telemetry)",
"@gpsTelemetry": {
"description": "GPS from telemetry label"
},
"updated": "Updated",
"@updated": {
"description": "Updated timestamp label"
},
"pathResetInfo": "Path reset for {name}. Next message will find a new route.",
"@pathResetInfo": {
"description": "Info message after path reset",
"placeholders": {
"name": {
"type": "String"
}
}
},
"reLoginToRoom": "Re-Login to Room",
"@reLoginToRoom": {
"description": "Button to re-login to room"
},
"heading": "Heading",
"@heading": {
"description": "Compass heading label"
},
"elevation": "Elevation",
"@elevation": {
"description": "Elevation/altitude label"
},
"accuracy": "Accuracy",
"@accuracy": {
"description": "GPS accuracy label"
},
"filterMarkers": "Filter Markers",
"@filterMarkers": {
"description": "Title for filter markers dialog"
},
"filterMarkersTooltip": "Filter markers",
"@filterMarkersTooltip": {
"description": "Tooltip for filter button"
},
"contactsFilter": "Contacts",
"@contactsFilter": {
"description": "Filter option for contacts"
},
"sarMarkers": "SAR Markers",
"@sarMarkers": {
"description": "SAR markers section header"
},
"foundPerson": "Found Person",
"@foundPerson": {
"description": "Found person SAR marker type"
},
"fire": "Fire",
"@fire": {
"description": "Fire SAR marker type"
},
"stagingArea": "Staging Area",
"@stagingArea": {
"description": "Staging area SAR marker type"
},
"showAll": "Show All",
"@showAll": {
"description": "Button to show all filters"
},
"nearbyContacts": "Nearby Contacts",
"@nearbyContacts": {
"description": "Title for nearby contacts list in compass"
},
"locationUnavailable": "Location unavailable",
"@locationUnavailable": {
"description": "Message when GPS location is unavailable"
},
"ahead": "ahead",
"@ahead": {
"description": "Relative bearing direction - ahead"
},
"degreesRight": "{degrees}° right",
"@degreesRight": {
"description": "Relative bearing direction - right",
"placeholders": {
"degrees": {
"type": "int"
}
}
},
"degreesLeft": "{degrees}° left",
"@degreesLeft": {
"description": "Relative bearing direction - left",
"placeholders": {
"degrees": {
"type": "int"
}
}
},
"latLonFormat": "Lat: {latitude} Lon: {longitude}",
"@latLonFormat": {
"description": "Latitude and longitude display format",
"placeholders": {
"latitude": {
"type": "String"
},
"longitude": {
"type": "String"
}
}
}
}

View File

@@ -231,5 +231,165 @@
"directMessageInfo": "Ova poruka će biti poslana izravno {contactName}. Također će se prikazati u glavnom feedu poruka.",
"typeYourMessage": "Upišite svoju poruku..."
"typeYourMessage": "Upišite svoju poruku...",
"quickLocationMarker": "Brzi označitelj lokacije",
"markerType": "Vrsta markera",
"sendTo": "Pošalji na",
"noDestinationsAvailable": "Nema dostupnih odredišta.",
"selectDestination": "Odaberite odredište...",
"ephemeralBroadcastInfo": "Privremeno: Samo emitiranje. Nije pohranjeno - čvorovi moraju biti online.",
"persistentRoomInfo": "Trajno: Nepromjenjivo pohranjeno u sobi. Automatski sinkronizirano i očuvano offline.",
"location": "Lokacija",
"fromMap": "S karte",
"gettingLocation": "Dohvaćanje lokacije...",
"locationError": "Greška lokacije",
"retry": "Pokušaj ponovno",
"refreshLocation": "Osvježi lokaciju",
"accuracyMeters": "Točnost: ±{accuracy}m",
"notesOptional": "Napomene (opcionalno)",
"addAdditionalInformation": "Dodajte dodatne informacije...",
"lowAccuracyWarning": "Točnost lokacije je ±{accuracy}m. Ovo možda nije dovoljno precizno za SAR operacije.\n\nNastaviti svejedno?",
"loginToRoom": "Prijava u sobu",
"enterPasswordInfo": "Unesite lozinku za pristup ovoj sobi. Lozinka će biti spremljena za buduću upotrebu.",
"password": "Lozinka",
"enterRoomPassword": "Unesite lozinku sobe",
"loggingInDots": "Prijavljivanje...",
"login": "Prijava",
"failedToAddRoom": "Neuspjelo dodavanje sobe na uređaj: {error}\n\nSoba možda još nije oglašena.\nPokušajte pričekati da soba emitira.",
"direct": "Izravno",
"flood": "Poplava",
"admin": "Administrator",
"loggedIn": "Prijavljen",
"noGpsData": "Nema GPS podataka",
"distance": "Udaljenost",
"pingingDirect": "Pingiranje {name} (izravno putem puta)...",
"pingingFlood": "Pingiranje {name} (poplava - nema puta)...",
"directPingTimeout": "Istek izravnog pinga - ponovni pokušaj {name} s poplavom...",
"pingSuccessful": "Ping uspješan prema {name}{fallback}",
"viaFloodingFallback": " (putem rezervnog plavljenja)",
"pingFailed": "Ping neuspješan prema {name} - nije primljen odgovor",
"deleteContactConfirmation": "Jeste li sigurni da želite izbrisati \"{name}\"?\n\nOvo će ukloniti kontakt iz aplikacije i pratećeg radio uređaja.",
"removingContact": "Uklanjanje {name}...",
"contactRemoved": "Kontakt \"{name}\" uklonjen",
"failedToRemoveContact": "Neuspjelo uklanjanje kontakta: {error}",
"type": "Vrsta",
"publicKey": "Javni ključ",
"lastSeen": "Zadnje viđen",
"roomStatus": "Status sobe",
"loginStatus": "Status prijave",
"notLoggedIn": "Nije prijavljen",
"adminAccess": "Administratorski pristup",
"yes": "Da",
"no": "Ne",
"permissions": "Dopuštenja",
"passwordSaved": "Lozinka spremljena",
"locationColon": "Lokacija:",
"telemetry": "Telemetrija",
"requestingTelemetry": "Zahtijevanje telemetrije od {name}...",
"voltage": "Napon",
"battery": "Baterija",
"temperature": "Temperatura",
"humidity": "Vlažnost",
"pressure": "Tlak",
"gpsTelemetry": "GPS (Telemetrija)",
"updated": "Ažurirano",
"pathResetInfo": "Put resetiran za {name}. Sljedeća poruka će pronaći novu rutu.",
"reLoginToRoom": "Ponovna prijava u sobu",
"heading": "Smjer",
"elevation": "Nadmorska visina",
"accuracy": "Točnost",
"filterMarkers": "Filtriraj markere",
"filterMarkersTooltip": "Filtriraj markere",
"contactsFilter": "Kontakti",
"sarMarkers": "SAR markeri",
"foundPerson": "Pronađena osoba",
"fire": "Požar",
"stagingArea": "Zbirno mjesto",
"showAll": "Prikaži sve",
"nearbyContacts": "Obližnji kontakti",
"locationUnavailable": "Lokacija nije dostupna",
"ahead": "naprijed",
"degreesRight": "{degrees}° desno",
"degreesLeft": "{degrees}° lijevo",
"latLonFormat": "Ššir: {latitude} Dužina: {longitude}"
}

View File

@@ -800,6 +800,486 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Type your message...'**
String get typeYourMessage;
/// Subtitle for SAR marker sheet header
///
/// In en, this message translates to:
/// **'Quick location marker'**
String get quickLocationMarker;
/// Label for marker type selection section
///
/// In en, this message translates to:
/// **'Marker Type'**
String get markerType;
/// Label for destination selection section
///
/// In en, this message translates to:
/// **'Send To'**
String get sendTo;
/// Warning when no rooms or channels exist
///
/// In en, this message translates to:
/// **'No destinations available.'**
String get noDestinationsAvailable;
/// Placeholder for destination dropdown
///
/// In en, this message translates to:
/// **'Select destination...'**
String get selectDestination;
/// Information about ephemeral channel broadcasts
///
/// In en, this message translates to:
/// **'Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.'**
String get ephemeralBroadcastInfo;
/// Information about persistent room storage
///
/// In en, this message translates to:
/// **'Persistent: Stored immutably in room. Synced automatically and preserved offline.'**
String get persistentRoomInfo;
/// Label for location section
///
/// In en, this message translates to:
/// **'Location'**
String get location;
/// Badge showing location is from map tap
///
/// In en, this message translates to:
/// **'From Map'**
String get fromMap;
/// Loading message while fetching GPS location
///
/// In en, this message translates to:
/// **'Getting location...'**
String get gettingLocation;
/// Title for location error messages
///
/// In en, this message translates to:
/// **'Location Error'**
String get locationError;
/// Retry button label
///
/// In en, this message translates to:
/// **'Retry'**
String get retry;
/// Tooltip for refresh location button
///
/// In en, this message translates to:
/// **'Refresh location'**
String get refreshLocation;
/// Display of GPS accuracy in meters
///
/// In en, this message translates to:
/// **'Accuracy: ±{accuracy}m'**
String accuracyMeters(int accuracy);
/// Label for optional notes field
///
/// In en, this message translates to:
/// **'Notes (optional)'**
String get notesOptional;
/// Placeholder for notes field
///
/// In en, this message translates to:
/// **'Add additional information...'**
String get addAdditionalInformation;
/// Warning dialog content for low GPS accuracy
///
/// In en, this message translates to:
/// **'Location accuracy is ±{accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?'**
String lowAccuracyWarning(int accuracy);
/// Title for room login dialog
///
/// In en, this message translates to:
/// **'Login to Room'**
String get loginToRoom;
/// Information about room password
///
/// In en, this message translates to:
/// **'Enter the password to access this room. The password will be saved for future use.'**
String get enterPasswordInfo;
/// Password field label
///
/// In en, this message translates to:
/// **'Password'**
String get password;
/// Password field hint
///
/// In en, this message translates to:
/// **'Enter room password'**
String get enterRoomPassword;
/// Button text while logging in
///
/// In en, this message translates to:
/// **'Logging in...'**
String get loggingInDots;
/// Login button label
///
/// In en, this message translates to:
/// **'Login'**
String get login;
/// Error message when adding room fails
///
/// In en, this message translates to:
/// **'Failed to add room to device: {error}\n\nThe room may not have advertised yet.\nTry waiting for the room to broadcast.'**
String failedToAddRoom(String error);
/// Direct routing indicator
///
/// In en, this message translates to:
/// **'Direct'**
String get direct;
/// Flood routing indicator
///
/// In en, this message translates to:
/// **'Flood'**
String get flood;
/// Admin badge label
///
/// In en, this message translates to:
/// **'Admin'**
String get admin;
/// Logged in status badge
///
/// In en, this message translates to:
/// **'Logged In'**
String get loggedIn;
/// Message when GPS data is not available
///
/// In en, this message translates to:
/// **'No GPS data'**
String get noGpsData;
/// Distance label
///
/// In en, this message translates to:
/// **'Distance'**
String get distance;
/// Status message for direct ping
///
/// In en, this message translates to:
/// **'Pinging {name} (direct via path)...'**
String pingingDirect(String name);
/// Status message for flood ping
///
/// In en, this message translates to:
/// **'Pinging {name} (flooding - no path)...'**
String pingingFlood(String name);
/// Warning when direct ping times out
///
/// In en, this message translates to:
/// **'Direct ping timeout - retrying {name} with flooding...'**
String directPingTimeout(String name);
/// Success message for ping
///
/// In en, this message translates to:
/// **'Ping successful to {name}{fallback}'**
String pingSuccessful(String name, String fallback);
/// Suffix for ping success with fallback
///
/// In en, this message translates to:
/// **' (via flooding fallback)'**
String get viaFloodingFallback;
/// Error message when ping fails
///
/// In en, this message translates to:
/// **'Ping failed to {name} - no response received'**
String pingFailed(String name);
/// Confirmation message for deleting contact
///
/// In en, this message translates to:
/// **'Are you sure you want to delete \"{name}\"?\n\nThis will remove the contact from both the app and the companion radio device.'**
String deleteContactConfirmation(String name);
/// Status message while removing contact
///
/// In en, this message translates to:
/// **'Removing {name}...'**
String removingContact(String name);
/// Success message after removing contact
///
/// In en, this message translates to:
/// **'Contact \"{name}\" removed'**
String contactRemoved(String name);
/// Error message when contact removal fails
///
/// In en, this message translates to:
/// **'Failed to remove contact: {error}'**
String failedToRemoveContact(String error);
/// Contact type label
///
/// In en, this message translates to:
/// **'Type'**
String get type;
/// Public key label
///
/// In en, this message translates to:
/// **'Public Key'**
String get publicKey;
/// Last seen label
///
/// In en, this message translates to:
/// **'Last Seen'**
String get lastSeen;
/// Room status section header
///
/// In en, this message translates to:
/// **'Room Status'**
String get roomStatus;
/// Login status label
///
/// In en, this message translates to:
/// **'Login Status'**
String get loginStatus;
/// Not logged in status
///
/// In en, this message translates to:
/// **'Not Logged In'**
String get notLoggedIn;
/// Admin access label
///
/// In en, this message translates to:
/// **'Admin Access'**
String get adminAccess;
/// Yes answer
///
/// In en, this message translates to:
/// **'Yes'**
String get yes;
/// No answer
///
/// In en, this message translates to:
/// **'No'**
String get no;
/// Permissions label
///
/// In en, this message translates to:
/// **'Permissions'**
String get permissions;
/// Password saved label
///
/// In en, this message translates to:
/// **'Password Saved'**
String get passwordSaved;
/// Location section header
///
/// In en, this message translates to:
/// **'Location:'**
String get locationColon;
/// Telemetry section header
///
/// In en, this message translates to:
/// **'Telemetry'**
String get telemetry;
/// Status message while requesting telemetry
///
/// In en, this message translates to:
/// **'Requesting telemetry from {name}...'**
String requestingTelemetry(String name);
/// Voltage label
///
/// In en, this message translates to:
/// **'Voltage'**
String get voltage;
/// Battery label
///
/// In en, this message translates to:
/// **'Battery'**
String get battery;
/// Temperature label
///
/// In en, this message translates to:
/// **'Temperature'**
String get temperature;
/// Humidity label
///
/// In en, this message translates to:
/// **'Humidity'**
String get humidity;
/// Pressure label
///
/// In en, this message translates to:
/// **'Pressure'**
String get pressure;
/// GPS from telemetry label
///
/// In en, this message translates to:
/// **'GPS (Telemetry)'**
String get gpsTelemetry;
/// Updated timestamp label
///
/// In en, this message translates to:
/// **'Updated'**
String get updated;
/// Info message after path reset
///
/// In en, this message translates to:
/// **'Path reset for {name}. Next message will find a new route.'**
String pathResetInfo(String name);
/// Button to re-login to room
///
/// In en, this message translates to:
/// **'Re-Login to Room'**
String get reLoginToRoom;
/// Compass heading label
///
/// In en, this message translates to:
/// **'Heading'**
String get heading;
/// Elevation/altitude label
///
/// In en, this message translates to:
/// **'Elevation'**
String get elevation;
/// GPS accuracy label
///
/// In en, this message translates to:
/// **'Accuracy'**
String get accuracy;
/// Title for filter markers dialog
///
/// In en, this message translates to:
/// **'Filter Markers'**
String get filterMarkers;
/// Tooltip for filter button
///
/// In en, this message translates to:
/// **'Filter markers'**
String get filterMarkersTooltip;
/// Filter option for contacts
///
/// In en, this message translates to:
/// **'Contacts'**
String get contactsFilter;
/// SAR markers section header
///
/// In en, this message translates to:
/// **'SAR Markers'**
String get sarMarkers;
/// Found person SAR marker type
///
/// In en, this message translates to:
/// **'Found Person'**
String get foundPerson;
/// Fire SAR marker type
///
/// In en, this message translates to:
/// **'Fire'**
String get fire;
/// Staging area SAR marker type
///
/// In en, this message translates to:
/// **'Staging Area'**
String get stagingArea;
/// Button to show all filters
///
/// In en, this message translates to:
/// **'Show All'**
String get showAll;
/// Title for nearby contacts list in compass
///
/// In en, this message translates to:
/// **'Nearby Contacts'**
String get nearbyContacts;
/// Message when GPS location is unavailable
///
/// In en, this message translates to:
/// **'Location unavailable'**
String get locationUnavailable;
/// Relative bearing direction - ahead
///
/// In en, this message translates to:
/// **'ahead'**
String get ahead;
/// Relative bearing direction - right
///
/// In en, this message translates to:
/// **'{degrees}° right'**
String degreesRight(int degrees);
/// Relative bearing direction - left
///
/// In en, this message translates to:
/// **'{degrees}° left'**
String degreesLeft(int degrees);
/// Latitude and longitude display format
///
/// In en, this message translates to:
/// **'Lat: {latitude} Lon: {longitude}'**
String latLonFormat(String latitude, String longitude);
}
class _AppLocalizationsDelegate

View File

@@ -404,4 +404,281 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get typeYourMessage => 'Type your message...';
@override
String get quickLocationMarker => 'Quick location marker';
@override
String get markerType => 'Marker Type';
@override
String get sendTo => 'Send To';
@override
String get noDestinationsAvailable => 'No destinations available.';
@override
String get selectDestination => 'Select destination...';
@override
String get ephemeralBroadcastInfo =>
'Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.';
@override
String get persistentRoomInfo =>
'Persistent: Stored immutably in room. Synced automatically and preserved offline.';
@override
String get location => 'Location';
@override
String get fromMap => 'From Map';
@override
String get gettingLocation => 'Getting location...';
@override
String get locationError => 'Location Error';
@override
String get retry => 'Retry';
@override
String get refreshLocation => 'Refresh location';
@override
String accuracyMeters(int accuracy) {
return 'Accuracy: ±${accuracy}m';
}
@override
String get notesOptional => 'Notes (optional)';
@override
String get addAdditionalInformation => 'Add additional information...';
@override
String lowAccuracyWarning(int accuracy) {
return 'Location accuracy is ±${accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?';
}
@override
String get loginToRoom => 'Login to Room';
@override
String get enterPasswordInfo =>
'Enter the password to access this room. The password will be saved for future use.';
@override
String get password => 'Password';
@override
String get enterRoomPassword => 'Enter room password';
@override
String get loggingInDots => 'Logging in...';
@override
String get login => 'Login';
@override
String failedToAddRoom(String error) {
return 'Failed to add room to device: $error\n\nThe room may not have advertised yet.\nTry waiting for the room to broadcast.';
}
@override
String get direct => 'Direct';
@override
String get flood => 'Flood';
@override
String get admin => 'Admin';
@override
String get loggedIn => 'Logged In';
@override
String get noGpsData => 'No GPS data';
@override
String get distance => 'Distance';
@override
String pingingDirect(String name) {
return 'Pinging $name (direct via path)...';
}
@override
String pingingFlood(String name) {
return 'Pinging $name (flooding - no path)...';
}
@override
String directPingTimeout(String name) {
return 'Direct ping timeout - retrying $name with flooding...';
}
@override
String pingSuccessful(String name, String fallback) {
return 'Ping successful to $name$fallback';
}
@override
String get viaFloodingFallback => ' (via flooding fallback)';
@override
String pingFailed(String name) {
return 'Ping failed to $name - no response received';
}
@override
String deleteContactConfirmation(String name) {
return 'Are you sure you want to delete \"$name\"?\n\nThis will remove the contact from both the app and the companion radio device.';
}
@override
String removingContact(String name) {
return 'Removing $name...';
}
@override
String contactRemoved(String name) {
return 'Contact \"$name\" removed';
}
@override
String failedToRemoveContact(String error) {
return 'Failed to remove contact: $error';
}
@override
String get type => 'Type';
@override
String get publicKey => 'Public Key';
@override
String get lastSeen => 'Last Seen';
@override
String get roomStatus => 'Room Status';
@override
String get loginStatus => 'Login Status';
@override
String get notLoggedIn => 'Not Logged In';
@override
String get adminAccess => 'Admin Access';
@override
String get yes => 'Yes';
@override
String get no => 'No';
@override
String get permissions => 'Permissions';
@override
String get passwordSaved => 'Password Saved';
@override
String get locationColon => 'Location:';
@override
String get telemetry => 'Telemetry';
@override
String requestingTelemetry(String name) {
return 'Requesting telemetry from $name...';
}
@override
String get voltage => 'Voltage';
@override
String get battery => 'Battery';
@override
String get temperature => 'Temperature';
@override
String get humidity => 'Humidity';
@override
String get pressure => 'Pressure';
@override
String get gpsTelemetry => 'GPS (Telemetry)';
@override
String get updated => 'Updated';
@override
String pathResetInfo(String name) {
return 'Path reset for $name. Next message will find a new route.';
}
@override
String get reLoginToRoom => 'Re-Login to Room';
@override
String get heading => 'Heading';
@override
String get elevation => 'Elevation';
@override
String get accuracy => 'Accuracy';
@override
String get filterMarkers => 'Filter Markers';
@override
String get filterMarkersTooltip => 'Filter markers';
@override
String get contactsFilter => 'Contacts';
@override
String get sarMarkers => 'SAR Markers';
@override
String get foundPerson => 'Found Person';
@override
String get fire => 'Fire';
@override
String get stagingArea => 'Staging Area';
@override
String get showAll => 'Show All';
@override
String get nearbyContacts => 'Nearby Contacts';
@override
String get locationUnavailable => 'Location unavailable';
@override
String get ahead => 'ahead';
@override
String degreesRight(int degrees) {
return '$degrees° right';
}
@override
String degreesLeft(int degrees) {
return '$degrees° left';
}
@override
String latLonFormat(String latitude, String longitude) {
return 'Lat: $latitude Lon: $longitude';
}
}

View File

@@ -404,4 +404,281 @@ class AppLocalizationsHr extends AppLocalizations {
@override
String get typeYourMessage => 'Upišite svoju poruku...';
@override
String get quickLocationMarker => 'Brzi označitelj lokacije';
@override
String get markerType => 'Vrsta markera';
@override
String get sendTo => 'Pošalji na';
@override
String get noDestinationsAvailable => 'Nema dostupnih odredišta.';
@override
String get selectDestination => 'Odaberite odredište...';
@override
String get ephemeralBroadcastInfo =>
'Privremeno: Samo emitiranje. Nije pohranjeno - čvorovi moraju biti online.';
@override
String get persistentRoomInfo =>
'Trajno: Nepromjenjivo pohranjeno u sobi. Automatski sinkronizirano i očuvano offline.';
@override
String get location => 'Lokacija';
@override
String get fromMap => 'S karte';
@override
String get gettingLocation => 'Dohvaćanje lokacije...';
@override
String get locationError => 'Greška lokacije';
@override
String get retry => 'Pokušaj ponovno';
@override
String get refreshLocation => 'Osvježi lokaciju';
@override
String accuracyMeters(int accuracy) {
return 'Točnost: ±${accuracy}m';
}
@override
String get notesOptional => 'Napomene (opcionalno)';
@override
String get addAdditionalInformation => 'Dodajte dodatne informacije...';
@override
String lowAccuracyWarning(int accuracy) {
return 'Točnost lokacije je ±${accuracy}m. Ovo možda nije dovoljno precizno za SAR operacije.\n\nNastaviti svejedno?';
}
@override
String get loginToRoom => 'Prijava u sobu';
@override
String get enterPasswordInfo =>
'Unesite lozinku za pristup ovoj sobi. Lozinka će biti spremljena za buduću upotrebu.';
@override
String get password => 'Lozinka';
@override
String get enterRoomPassword => 'Unesite lozinku sobe';
@override
String get loggingInDots => 'Prijavljivanje...';
@override
String get login => 'Prijava';
@override
String failedToAddRoom(String error) {
return 'Neuspjelo dodavanje sobe na uređaj: $error\n\nSoba možda još nije oglašena.\nPokušajte pričekati da soba emitira.';
}
@override
String get direct => 'Izravno';
@override
String get flood => 'Poplava';
@override
String get admin => 'Administrator';
@override
String get loggedIn => 'Prijavljen';
@override
String get noGpsData => 'Nema GPS podataka';
@override
String get distance => 'Udaljenost';
@override
String pingingDirect(String name) {
return 'Pingiranje $name (izravno putem puta)...';
}
@override
String pingingFlood(String name) {
return 'Pingiranje $name (poplava - nema puta)...';
}
@override
String directPingTimeout(String name) {
return 'Istek izravnog pinga - ponovni pokušaj $name s poplavom...';
}
@override
String pingSuccessful(String name, String fallback) {
return 'Ping uspješan prema $name$fallback';
}
@override
String get viaFloodingFallback => ' (putem rezervnog plavljenja)';
@override
String pingFailed(String name) {
return 'Ping neuspješan prema $name - nije primljen odgovor';
}
@override
String deleteContactConfirmation(String name) {
return 'Jeste li sigurni da želite izbrisati \"$name\"?\n\nOvo će ukloniti kontakt iz aplikacije i pratećeg radio uređaja.';
}
@override
String removingContact(String name) {
return 'Uklanjanje $name...';
}
@override
String contactRemoved(String name) {
return 'Kontakt \"$name\" uklonjen';
}
@override
String failedToRemoveContact(String error) {
return 'Neuspjelo uklanjanje kontakta: $error';
}
@override
String get type => 'Vrsta';
@override
String get publicKey => 'Javni ključ';
@override
String get lastSeen => 'Zadnje viđen';
@override
String get roomStatus => 'Status sobe';
@override
String get loginStatus => 'Status prijave';
@override
String get notLoggedIn => 'Nije prijavljen';
@override
String get adminAccess => 'Administratorski pristup';
@override
String get yes => 'Da';
@override
String get no => 'Ne';
@override
String get permissions => 'Dopuštenja';
@override
String get passwordSaved => 'Lozinka spremljena';
@override
String get locationColon => 'Lokacija:';
@override
String get telemetry => 'Telemetrija';
@override
String requestingTelemetry(String name) {
return 'Zahtijevanje telemetrije od $name...';
}
@override
String get voltage => 'Napon';
@override
String get battery => 'Baterija';
@override
String get temperature => 'Temperatura';
@override
String get humidity => 'Vlažnost';
@override
String get pressure => 'Tlak';
@override
String get gpsTelemetry => 'GPS (Telemetrija)';
@override
String get updated => 'Ažurirano';
@override
String pathResetInfo(String name) {
return 'Put resetiran za $name. Sljedeća poruka će pronaći novu rutu.';
}
@override
String get reLoginToRoom => 'Ponovna prijava u sobu';
@override
String get heading => 'Smjer';
@override
String get elevation => 'Nadmorska visina';
@override
String get accuracy => 'Točnost';
@override
String get filterMarkers => 'Filtriraj markere';
@override
String get filterMarkersTooltip => 'Filtriraj markere';
@override
String get contactsFilter => 'Kontakti';
@override
String get sarMarkers => 'SAR markeri';
@override
String get foundPerson => 'Pronađena osoba';
@override
String get fire => 'Požar';
@override
String get stagingArea => 'Zbirno mjesto';
@override
String get showAll => 'Prikaži sve';
@override
String get nearbyContacts => 'Obližnji kontakti';
@override
String get locationUnavailable => 'Lokacija nije dostupna';
@override
String get ahead => 'naprijed';
@override
String degreesRight(int degrees) {
return '$degrees° desno';
}
@override
String degreesLeft(int degrees) {
return '$degrees° lijevo';
}
@override
String latLonFormat(String latitude, String longitude) {
return 'Ššir: $latitude Dužina: $longitude';
}
}

View File

@@ -404,4 +404,281 @@ class AppLocalizationsSl extends AppLocalizations {
@override
String get typeYourMessage => 'Vnesite svoje sporočilo...';
@override
String get quickLocationMarker => 'Hitri označevalec lokacije';
@override
String get markerType => 'Vrsta označevalca';
@override
String get sendTo => 'Pošlji na';
@override
String get noDestinationsAvailable => 'Ni dostopnih ciljev.';
@override
String get selectDestination => 'Izberite cilj...';
@override
String get ephemeralBroadcastInfo =>
'Začasno: Samo oddajanje. Ni shranjeno - vozlišča morajo biti povezana.';
@override
String get persistentRoomInfo =>
'Trajno: Nespremenljivo shranjeno v sobi. Samodejno sinhronizirano in ohranjeno brez povezave.';
@override
String get location => 'Lokacija';
@override
String get fromMap => 'Z zemljevida';
@override
String get gettingLocation => 'Pridobivanje lokacije...';
@override
String get locationError => 'Napaka lokacije';
@override
String get retry => 'Poskusi znova';
@override
String get refreshLocation => 'Osveži lokacijo';
@override
String accuracyMeters(int accuracy) {
return 'Natančnost: ±${accuracy}m';
}
@override
String get notesOptional => 'Opombe (neobvezno)';
@override
String get addAdditionalInformation => 'Dodajte dodatne informacije...';
@override
String lowAccuracyWarning(int accuracy) {
return 'Natančnost lokacije je ±${accuracy}m. To morda ni dovolj natančno za SAR operacije.\n\nVseeno nadaljuj?';
}
@override
String get loginToRoom => 'Prijava v sobo';
@override
String get enterPasswordInfo =>
'Vnesite geslo za dostop do te sobe. Geslo bo shranjeno za prihodnjo uporabo.';
@override
String get password => 'Geslo';
@override
String get enterRoomPassword => 'Vnesite geslo sobe';
@override
String get loggingInDots => 'Prijavljanje...';
@override
String get login => 'Prijava';
@override
String failedToAddRoom(String error) {
return 'Dodajanje sobe v napravo ni uspelo: $error\n\nSoba morda še ni oglašena.\nPoskusite počakati, da soba odda.';
}
@override
String get direct => 'Neposredno';
@override
String get flood => 'Poplava';
@override
String get admin => 'Administrator';
@override
String get loggedIn => 'Prijavljen';
@override
String get noGpsData => 'Ni GPS podatkov';
@override
String get distance => 'Razdalja';
@override
String pingingDirect(String name) {
return 'Pinganje $name (neposredno preko poti)...';
}
@override
String pingingFlood(String name) {
return 'Pinganje $name (poplava - brez poti)...';
}
@override
String directPingTimeout(String name) {
return 'Časovna omejitev neposrednega pinga - ponovni poskus $name s poplavo...';
}
@override
String pingSuccessful(String name, String fallback) {
return 'Ping uspešen do $name$fallback';
}
@override
String get viaFloodingFallback => ' (preko rezervnega poplavljanja)';
@override
String pingFailed(String name) {
return 'Ping neuspešen do $name - odgovor ni prejet';
}
@override
String deleteContactConfirmation(String name) {
return 'Ste prepričani, da želite izbrisati \"$name\"?\n\nTo bo odstranilo stik iz aplikacije in spremljevalne radijske naprave.';
}
@override
String removingContact(String name) {
return 'Odstranjevanje $name...';
}
@override
String contactRemoved(String name) {
return 'Stik \"$name\" odstranjen';
}
@override
String failedToRemoveContact(String error) {
return 'Odstranjevanje stika ni uspelo: $error';
}
@override
String get type => 'Vrsta';
@override
String get publicKey => 'Javni ključ';
@override
String get lastSeen => 'Nazadnje viden';
@override
String get roomStatus => 'Status sobe';
@override
String get loginStatus => 'Status prijave';
@override
String get notLoggedIn => 'Ni prijavljen';
@override
String get adminAccess => 'Administratorski dostop';
@override
String get yes => 'Da';
@override
String get no => 'Ne';
@override
String get permissions => 'Dovoljenja';
@override
String get passwordSaved => 'Geslo shranjeno';
@override
String get locationColon => 'Lokacija:';
@override
String get telemetry => 'Telemetrija';
@override
String requestingTelemetry(String name) {
return 'Zahtevanje telemetrije od $name...';
}
@override
String get voltage => 'Napetost';
@override
String get battery => 'Baterija';
@override
String get temperature => 'Temperatura';
@override
String get humidity => 'Vlažnost';
@override
String get pressure => 'Tlak';
@override
String get gpsTelemetry => 'GPS (Telemetrija)';
@override
String get updated => 'Posodobljeno';
@override
String pathResetInfo(String name) {
return 'Pot ponastavljena za $name. Naslednje sporočilo bo našlo novo pot.';
}
@override
String get reLoginToRoom => 'Ponovna prijava v sobo';
@override
String get heading => 'Smer';
@override
String get elevation => 'Nadmorska višina';
@override
String get accuracy => 'Natančnost';
@override
String get filterMarkers => 'Filtriraj označevalce';
@override
String get filterMarkersTooltip => 'Filtriraj označevalce';
@override
String get contactsFilter => 'Stiki';
@override
String get sarMarkers => 'SAR označevalci';
@override
String get foundPerson => 'Najdena oseba';
@override
String get fire => 'Ogenj';
@override
String get stagingArea => 'Zbirališče';
@override
String get showAll => 'Prikaži vse';
@override
String get nearbyContacts => 'Bližnji stiki';
@override
String get locationUnavailable => 'Lokacija ni na voljo';
@override
String get ahead => 'naravnost';
@override
String degreesRight(int degrees) {
return '$degrees° desno';
}
@override
String degreesLeft(int degrees) {
return '$degrees° levo';
}
@override
String latLonFormat(String latitude, String longitude) {
return 'Šir: $latitude Dolž: $longitude';
}
}

View File

@@ -231,5 +231,165 @@
"directMessageInfo": "To sporočilo bo poslano neposredno {contactName}. Prikazalo se bo tudi v glavnem viru sporočil.",
"typeYourMessage": "Vnesite svoje sporočilo..."
"typeYourMessage": "Vnesite svoje sporočilo...",
"quickLocationMarker": "Hitri označevalec lokacije",
"markerType": "Vrsta označevalca",
"sendTo": "Pošlji na",
"noDestinationsAvailable": "Ni dostopnih ciljev.",
"selectDestination": "Izberite cilj...",
"ephemeralBroadcastInfo": "Začasno: Samo oddajanje. Ni shranjeno - vozlišča morajo biti povezana.",
"persistentRoomInfo": "Trajno: Nespremenljivo shranjeno v sobi. Samodejno sinhronizirano in ohranjeno brez povezave.",
"location": "Lokacija",
"fromMap": "Z zemljevida",
"gettingLocation": "Pridobivanje lokacije...",
"locationError": "Napaka lokacije",
"retry": "Poskusi znova",
"refreshLocation": "Osveži lokacijo",
"accuracyMeters": "Natančnost: ±{accuracy}m",
"notesOptional": "Opombe (neobvezno)",
"addAdditionalInformation": "Dodajte dodatne informacije...",
"lowAccuracyWarning": "Natančnost lokacije je ±{accuracy}m. To morda ni dovolj natančno za SAR operacije.\n\nVseeno nadaljuj?",
"loginToRoom": "Prijava v sobo",
"enterPasswordInfo": "Vnesite geslo za dostop do te sobe. Geslo bo shranjeno za prihodnjo uporabo.",
"password": "Geslo",
"enterRoomPassword": "Vnesite geslo sobe",
"loggingInDots": "Prijavljanje...",
"login": "Prijava",
"failedToAddRoom": "Dodajanje sobe v napravo ni uspelo: {error}\n\nSoba morda še ni oglašena.\nPoskusite počakati, da soba odda.",
"direct": "Neposredno",
"flood": "Poplava",
"admin": "Administrator",
"loggedIn": "Prijavljen",
"noGpsData": "Ni GPS podatkov",
"distance": "Razdalja",
"pingingDirect": "Pinganje {name} (neposredno preko poti)...",
"pingingFlood": "Pinganje {name} (poplava - brez poti)...",
"directPingTimeout": "Časovna omejitev neposrednega pinga - ponovni poskus {name} s poplavo...",
"pingSuccessful": "Ping uspešen do {name}{fallback}",
"viaFloodingFallback": " (preko rezervnega poplavljanja)",
"pingFailed": "Ping neuspešen do {name} - odgovor ni prejet",
"deleteContactConfirmation": "Ste prepričani, da želite izbrisati \"{name}\"?\n\nTo bo odstranilo stik iz aplikacije in spremljevalne radijske naprave.",
"removingContact": "Odstranjevanje {name}...",
"contactRemoved": "Stik \"{name}\" odstranjen",
"failedToRemoveContact": "Odstranjevanje stika ni uspelo: {error}",
"type": "Vrsta",
"publicKey": "Javni ključ",
"lastSeen": "Nazadnje viden",
"roomStatus": "Status sobe",
"loginStatus": "Status prijave",
"notLoggedIn": "Ni prijavljen",
"adminAccess": "Administratorski dostop",
"yes": "Da",
"no": "Ne",
"permissions": "Dovoljenja",
"passwordSaved": "Geslo shranjeno",
"locationColon": "Lokacija:",
"telemetry": "Telemetrija",
"requestingTelemetry": "Zahtevanje telemetrije od {name}...",
"voltage": "Napetost",
"battery": "Baterija",
"temperature": "Temperatura",
"humidity": "Vlažnost",
"pressure": "Tlak",
"gpsTelemetry": "GPS (Telemetrija)",
"updated": "Posodobljeno",
"pathResetInfo": "Pot ponastavljena za {name}. Naslednje sporočilo bo našlo novo pot.",
"reLoginToRoom": "Ponovna prijava v sobo",
"heading": "Smer",
"elevation": "Nadmorska višina",
"accuracy": "Natančnost",
"filterMarkers": "Filtriraj označevalce",
"filterMarkersTooltip": "Filtriraj označevalce",
"contactsFilter": "Stiki",
"sarMarkers": "SAR označevalci",
"foundPerson": "Najdena oseba",
"fire": "Ogenj",
"stagingArea": "Zbirališče",
"showAll": "Prikaži vse",
"nearbyContacts": "Bližnji stiki",
"locationUnavailable": "Lokacija ni na voljo",
"ahead": "naravnost",
"degreesRight": "{degrees}° desno",
"degreesLeft": "{degrees}° levo",
"latLonFormat": "Šir: {latitude} Dolž: {longitude}"
}