diff --git a/Rewind/Localizable.xcstrings b/Rewind/Localizable.xcstrings index 95cb91a..edc17ac 100644 --- a/Rewind/Localizable.xcstrings +++ b/Rewind/Localizable.xcstrings @@ -1,2322 +1,2414 @@ { - "sourceLanguage" : "en", - "strings" : { - "• " : { - "comment" : "contributor list indent", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "• " + "sourceLanguage": "en", + "strings": { + "• ": { + "comment": "contributor list indent", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "• " } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "• " + "ru": { + "stringUnit": { + "state": "translated", + "value": "• " } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "• " + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "• " } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "• " + "uk": { + "stringUnit": { + "state": "translated", + "value": "• " } } } }, - "☮️ & ❤️" : { - "comment" : "peace sign from credits", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "☮️ & ❤️" + "☮️ & ❤️": { + "comment": "peace sign from credits", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "☮️ & ❤️" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "☮️ & ❤️" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "☮️ & ❤️" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "☮️ & ❤️" + "uk": { + "stringUnit": { + "state": "translated", + "value": "☮️ & ❤️" } } } }, - "👀" : { - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "👀" + "👀": { + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "👀" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "👀" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "👀" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "👀" + "uk": { + "stringUnit": { + "state": "translated", + "value": "👀" } } } }, - "💔" : { - "comment" : "emoji for empty favorites list", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "💔" + "💔": { + "comment": "emoji for empty favorites list", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "💔" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "💔" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "💔" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "💔" + "uk": { + "stringUnit": { + "state": "translated", + "value": "💔" } } } }, - "2026" : { - "comment" : "year from credits", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "2026" + "2026": { + "comment": "year from credits", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "2026" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "2026" + "ru": { + "stringUnit": { + "state": "translated", + "value": "2026" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "2026" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "2026" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "2026" + "uk": { + "stringUnit": { + "state": "translated", + "value": "2026" } } } }, - "A time-travel app" : { - "comment" : "Onboarding app description subtitle", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Приложение для путешествий во времени" + "A time-travel app": { + "comment": "Onboarding app description subtitle", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Приложение для путешествий во времени" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aplikacija za putovanje kroz vreme" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Aplikacija za putovanje kroz vreme" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Застосунок для подорожей у часі" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Застосунок для подорожей у часі" } } } }, - "address" : { - "comment" : "label for image address", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "адрес" + "address": { + "comment": "label for image address", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "адрес" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "adresa" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "adresa" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "адреса" + "uk": { + "stringUnit": { + "state": "translated", + "value": "адреса" } } } }, - "Apple Maps" : { - "comment" : "map app name", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apple Карты" + "Apple Maps": { + "comment": "map app name", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Apple Карты" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apple Mape" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Apple Mape" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apple Карти" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Apple Карти" } } } }, - "author" : { - "comment" : "label for image author", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "автор" + "author": { + "comment": "label for image author", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "автор" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "autor" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "autor" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "автор" + "uk": { + "stringUnit": { + "state": "translated", + "value": "автор" } } } }, - "Cluster" : { - "comment" : "title of a image list from local cluster", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Кластер" + "Cluster": { + "comment": "title of a image list from local cluster", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Кластер" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Grupa slika" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Grupa slika" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Група зображень" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Група зображень" } } } }, - "cluster_of_images_description" : { - "comment" : "Onboarding description of a cluster annotation", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "A large group of images. To view them all, you need to zoom in" + "cluster_of_images_description": { + "comment": "Onboarding description of a cluster annotation", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "A large group of images. To view them all, you need to zoom in" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Большая группа изображений. Нужно приблизить, чтобы увидеть все" + "ru": { + "stringUnit": { + "state": "translated", + "value": "Большая группа изображений. Нужно приблизить, чтобы увидеть все" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Velika grupa slika. Da biste ih sve videli, potrebno je da zumirate" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Velika grupa slika. Da biste ih sve videli, potrebno je da zumirate" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Велика група зображень. Щоб переглянути їх усі, потрібно наблизити" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Велика група зображень. Щоб переглянути їх усі, потрібно наблизити" } } } }, - "cluster_of_images_title" : { - "comment" : "Onboarding title of a cluster annotation", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cluster of images" + "cluster_of_images_title": { + "comment": "Onboarding title of a cluster annotation", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Cluster of images" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Кластер картинок" + "ru": { + "stringUnit": { + "state": "translated", + "value": "Кластер картинок" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Klaster slika" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Klaster slika" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Кластер зображень" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Кластер зображень" } } } }, - "Compare" : { - "comment" : "Action of taking a photo of how the place looked like before and how it does now", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Сравнить" + "Compare": { + "comment": "Action of taking a photo of how the place looked like before and how it does now", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Сравнить" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uporedi" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Uporedi" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Порівняти" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Порівняти" } } } }, - "Compare with Google Street View" : { - "comment" : "Action of taking a photo of how the place looked like before and how it looks in google street view", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Сравнить с панорамами Google" + "Compare with Google Street View": { + "comment": "Action of taking a photo of how the place looked like before and how it looks in google street view", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Сравнить с панорамами Google" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uporedi sa Google Street View" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Uporedi sa Google Street View" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Порівняти з панорамами Google" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Порівняти з панорамами Google" } } } }, - "comparison_description" : { - "comment" : "Onboarding description of a comparison feature", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Take a photo to compare the same place over time" + "comparison_description": { + "comment": "Onboarding description of a comparison feature", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Take a photo to compare the same place over time" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Сделайте фотографию, чтобы сравнить то же место спустя годы" + "ru": { + "stringUnit": { + "state": "translated", + "value": "Сделайте фотографию, чтобы сравнить то же место спустя годы" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Napravite fotografiju da biste uporedili isto mesto kroz godine" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Napravite fotografiju da biste uporedili isto mesto kroz godine" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Зробіть фотографію, щоб порівняти те саме місце через роки" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Зробіть фотографію, щоб порівняти те саме місце через роки" } } } }, - "comparison_title" : { - "comment" : "Onboarding title of a comparison feature", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Compare past and present" + "comparison_title": { + "comment": "Onboarding title of a comparison feature", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Compare past and present" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Сравните прошлое с настоящим" + "ru": { + "stringUnit": { + "state": "translated", + "value": "Сравните прошлое с настоящим" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uporedite prošlost i sadašnjost" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Uporedite prošlost i sadašnjost" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Порівняйте минуле з сьогоденням" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Порівняйте минуле з сьогоденням" } } } }, - "Contact developer" : { - "comment" : "button from settings to contact email support", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Связаться с разработчиком" + "Contact developer": { + "comment": "button from settings to contact email support", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Связаться с разработчиком" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontaktirajte programera" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Kontaktirajte programera" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Зв'язатися з розробником" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Зв'язатися з розробником" } } } }, - "Copy to clipboard" : { - "comment" : "action to copy error’s message to clipboard", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Скопировать в буфер обмена" + "Copy to clipboard": { + "comment": "action to copy error’s message to clipboard", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Скопировать в буфер обмена" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kopiraj u privremenu memoriju" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Kopiraj u privremenu memoriju" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Скопіювати до буфера обміну" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Скопіювати до буфера обміну" } } } }, - "Dismiss" : { - "comment" : "Alert dismiss action", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Закрыть" + "Date Ascending": { + "comment": "Image sorting type description. Item in menu picker.", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Сначала старые" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zatvori" + "sr-Latn": { + "stringUnit": { + "value": "Datum rastuće", + "state": "translated" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Закрити" + "uk": { + "stringUnit": { + "value": "Спочатку старіші", + "state": "translated" } } } }, - "Favorite" : { - "comment" : "label for action to add to favorites", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Избранное" + "Date Descending": { + "comment": "Image sorting type description. Item in menu picker.", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Сначала новые" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Omiljeno" + "sr-Latn": { + "stringUnit": { + "value": "Od novijeg ka starijem", + "state": "translated" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Улюблене" + "uk": { + "stringUnit": { + "value": "Спочатку новіші", + "state": "translated" } } } }, - "Favorites" : { - "comment" : "favorites list title", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Избранное" + "Dismiss": { + "comment": "Alert dismiss action", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Закрыть" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Omiljeno" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Zatvori" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Улюблене" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Закрити" } } } }, - "Find route" : { - "comment" : "label for action to build a route to image location", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Маршрут" + "Favorite": { + "comment": "label for action to add to favorites", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Избранное" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pronađi rutu" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Omiljeno" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Знайти маршрут" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Улюблене" } } } }, - "Get started" : { - "comment" : "Onboarding first navigation button", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Начнём!" + "Favorites": { + "comment": "favorites list title", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Избранное" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Započnimo!" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Omiljeno" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Почнімо!" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Улюблене" } } } }, - "Go to Settings" : { - "comment" : "prompt to open location settings to grant access for the app", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Открыть настройки" + "Find route": { + "comment": "label for action to build a route to image location", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Маршрут" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otvori podešavanja" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Pronađi rutu" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Відкрити налаштування" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Знайти маршрут" } } } }, - "Google Maps" : { - "comment" : "map app name", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Google Карты" + "Get started": { + "comment": "Onboarding first navigation button", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Начнём!" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Google Mape" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Započnimo!" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Google Карти" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Почнімо!" } } } }, - "Google Street View is not available for this location." : { - "comment" : "error alert message", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Панорамы Google недоступны для этого места." + "Go to Settings": { + "comment": "prompt to open location settings to grant access for the app", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Открыть настройки" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Google Street View nije dostupan za ovu lokaciju." + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Otvori podešavanja" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Панорами Google недоступні для цього місця." + "uk": { + "stringUnit": { + "state": "translated", + "value": "Відкрити налаштування" } } } }, - "Google Street View Unavailable" : { - "comment" : "error alert title", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Google Street View недоступен" + "Google Maps": { + "comment": "map app name", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Google Карты" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Google Street View nedostupan" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Google Mape" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Google Street View недоступний" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Google Карти" } } } }, - "group_of_images_description" : { - "comment" : "Onboarding description of group of images annotation", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Several images that are close to each other. Opens a full list when tapped" + "Google Street View is not available for this location.": { + "comment": "error alert message", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Панорамы Google недоступны для этого места." } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Несколько изображений, которые находятся рядом. По касанию откроется список" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Google Street View nije dostupan za ovu lokaciju." } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nekoliko slika koje se nalaze blizu jedna druge. Otvara punu listu kada se dodirne" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Панорами Google недоступні для цього місця." + } + } + } + }, + "Google Street View Unavailable": { + "comment": "error alert title", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Google Street View недоступен" + } + }, + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Google Street View nedostupan" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Google Street View недоступний" + } + } + } + }, + "group_of_images_description": { + "comment": "Onboarding description of group of images annotation", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Several images that are close to each other. Opens a full list when tapped" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Несколько изображений, которые находятся рядом. По касанию откроется список" + } + }, + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Nekoliko slika koje se nalaze blizu jedna druge. Otvara punu listu kada se dodirne" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Декілька зображень, які знаходяться поруч. Відкриває повний список при дотику" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Декілька зображень, які знаходяться поруч. Відкриває повний список при дотику" } } } }, - "group_of_images_title" : { - "comment" : "Onboarding title of group of images annotation", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Group of images" + "group_of_images_title": { + "comment": "Onboarding title of group of images annotation", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Group of images" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Группа картинок" + "ru": { + "stringUnit": { + "state": "translated", + "value": "Группа картинок" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Grupa slika" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Grupa slika" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Група зображень" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Група зображень" } } } }, - "Hi!" : { - "comment" : "Greeting from onboarding", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Привет!" + "Hi!": { + "comment": "Greeting from onboarding", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Привет!" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zdravo!" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Zdravo!" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Привіт!" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Привіт!" } } } }, - "history_near_you_description" : { - "comment" : "Onboarding description of location feature", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "You can view old images of places on the map" + "history_near_you_description": { + "comment": "Onboarding description of location feature", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You can view old images of places on the map" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Вы можете увидеть старые фотографии мест на карте" + "ru": { + "stringUnit": { + "state": "translated", + "value": "Вы можете увидеть старые фотографии мест на карте" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Možete da vidite stare fotografije mesta na mapi" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Možete da vidite stare fotografije mesta na mapi" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ви можете переглядати старі фотографії місць на карті" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Ви можете переглядати старі фотографії місць на карті" } } } }, - "history_near_you_title" : { - "comment" : "Onboarding title of location feature", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "History near you" + "history_near_you_title": { + "comment": "Onboarding title of location feature", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "History near you" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "История вокруг вас" + "ru": { + "stringUnit": { + "state": "translated", + "value": "История вокруг вас" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Istorija u vašoj blizini" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Istorija u vašoj blizini" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Історія поруч із вами" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Історія поруч із вами" } } } }, - "Hybrid" : { - "comment" : "hybrid map style", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Гибрид" + "Hybrid": { + "comment": "hybrid map style", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Гибрид" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hibrid" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Hibrid" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Гібрид" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Гібрид" } } } }, - "images_saving_description" : { - "comment" : "Onboarding description of image saving feature", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "You can create a collection of your most spectacular moments and places" + "images_saving_description": { + "comment": "Onboarding description of image saving feature", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You can create a collection of your most spectacular moments and places" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Создайте коллекцию самых захватывающих мест и моментов" + "ru": { + "stringUnit": { + "state": "translated", + "value": "Создайте коллекцию самых захватывающих мест и моментов" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Možete napraviti kolekciju svojih nezaboravnih trenutaka i mesta" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Možete napraviti kolekciju svojih nezaboravnih trenutaka i mesta" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Створіть колекцію найяскравіших моментів і місць" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Створіть колекцію найяскравіших моментів і місць" } } } }, - "images_saving_title" : { - "comment" : "Onboarding title of image saving feature", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Save images you like" + "images_saving_title": { + "comment": "Onboarding title of image saving feature", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Save images you like" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Сохраняйте любимые фотографии" + "ru": { + "stringUnit": { + "state": "translated", + "value": "Сохраняйте любимые фотографии" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sačuvajte omiljene slike" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Sačuvajte omiljene slike" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Зберігайте улюблені зображення" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Зберігайте улюблені зображення" } } } }, - "Let's see!" : { - "comment" : "Button to finish location onboarding", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Вперёд!" + "Let's see!": { + "comment": "Button to finish location onboarding", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Вперёд!" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hajde!" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Hajde!" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Погнали!" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Погнали!" } } } }, - "Links" : { - "comment" : "header of a links session in settings", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ссылки" + "Links": { + "comment": "header of a links session in settings", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Ссылки" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Linkovi" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Linkovi" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Посилання" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Посилання" } } } }, - "Made by " : { - "comment" : "title in credits section. made by ", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Сделано " + "Made by ": { + "comment": "title in credits section. made by ", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Сделано " } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Od " + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Od " } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Зроблено " + "uk": { + "stringUnit": { + "state": "translated", + "value": "Зроблено " } } } }, - "Map type" : { - "comment" : "map type selector title", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Тип карты" + "Map type": { + "comment": "map type selector title", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Тип карты" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tip karte" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Tip karte" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Тип карти" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Тип карти" } } } }, - "Nothing here yet" : { - "comment" : "empty images list prompt", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Тут пока ничего нет" + "Nothing here yet": { + "comment": "empty images list prompt", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Тут пока ничего нет" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ovde još nema ničega" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Ovde još nema ničega" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Тут поки нічого немає" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Тут поки нічого немає" } } } }, - "OK" : { - "comment" : "ok action of alert", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "ОК" + "OK": { + "comment": "ok action of alert", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "ОК" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "OK" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "ОК" + "uk": { + "stringUnit": { + "state": "translated", + "value": "ОК" } } } }, - "Old photos on a map" : { - "comment" : "TItle of map annotation onboarding", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Старые фотографии на карте" + "Old photos on a map": { + "comment": "TItle of map annotation onboarding", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Старые фотографии на карте" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stare fotografije na mapi" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Stare fotografije na mapi" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Старі фотографії на карті" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Старі фотографії на карті" } } } }, - "On the map" : { - "comment" : "title of a list of images presented currently on the map", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "На карте" + "On the map": { + "comment": "title of a list of images presented currently on the map", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "На карте" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Na karti" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Na karti" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "На карті" + "uk": { + "stringUnit": { + "state": "translated", + "value": "На карті" } } } }, - "onboarding_date" : { - "comment" : "Description of images’ date for onboarding", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Every image has location and date. Date has a corresponding color" + "onboarding_date": { + "comment": "Description of images’ date for onboarding", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Every image has location and date. Date has a corresponding color" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "У каждого изображения есть локация и дата. Дате соответствует цвет" + "ru": { + "stringUnit": { + "state": "translated", + "value": "У каждого изображения есть локация и дата. Дате соответствует цвет" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Svaka slika ima lokaciju i datum. Datumu odgovara boja" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Svaka slika ima lokaciju i datum. Datumu odgovara boja" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Кожне зображення має локацію та дату. Даті відповідає колір" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Кожне зображення має локацію та дату. Даті відповідає колір" } } } }, - "onboarding_location" : { - "comment" : "Description of location access in the onboarding", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind needs your location to show images near you. Without it you can still use the app" + "onboarding_location": { + "comment": "Description of location access in the onboarding", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Rewind needs your location to show images near you. Without it you can still use the app" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind нужна ваша локация чтобы показывать фотографии рядом. Без этого доступа приложение тоже можно использовать" + "ru": { + "stringUnit": { + "state": "translated", + "value": "Rewind нужна ваша локация чтобы показывать фотографии рядом. Без этого доступа приложение тоже можно использовать" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind treba vašu lokaciju da bi prikazivao slike u vašoj blizini. Bez toga i dalje možete koristiti aplikaciju" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Rewind treba vašu lokaciju da bi prikazivao slike u vašoj blizini. Bez toga i dalje možete koristiti aplikaciju" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind потребує вашу локацію, щоб показувати фотографії поблизу. Без цього доступу застосунок теж можна використовувати" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Rewind потребує вашу локацію, щоб показувати фотографії поблизу. Без цього доступу застосунок теж можна використовувати" } } } }, - "onboarding_pastvu" : { - "comment" : "Data source description for the onboarding", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind uses the PastVu API to obtain all historical images and their associated data." + "onboarding_pastvu": { + "comment": "Data source description for the onboarding", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Rewind uses the PastVu API to obtain all historical images and their associated data." } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind использует PastVu API для получения всех изображений и данных о них" + "ru": { + "stringUnit": { + "state": "translated", + "value": "Rewind использует PastVu API для получения всех изображений и данных о них" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind koristi PastVu API za dobijanje svih istorijskih slika i njihovih pratećih podataka." + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Rewind koristi PastVu API za dobijanje svih istorijskih slika i njihovih pratećih podataka." } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind використовує PastVu API для отримання всіх історичних зображень та пов'язаних з ними даних." + "uk": { + "stringUnit": { + "state": "translated", + "value": "Rewind використовує PastVu API для отримання всіх історичних зображень та пов'язаних з ними даних." } } } }, - "Open big cluster previews on tap" : { - "comment" : "Settings toggle to open preview images on tap to annotation", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Открывать превью больших кластеров по тапу" + "Open big cluster previews on tap": { + "comment": "Settings toggle to open preview images on tap to annotation", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Открывать превью больших кластеров по тапу" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otvori velike preglede klastera dodirom" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Otvori velike preglede klastera dodirom" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Відкривати превʼю великих кластерів дотиком" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Відкривати превʼю великих кластерів дотиком" } } } }, - "PastVu" : { - "comment" : "header of a settings section related to PastVu API links", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "PastVu" + "PastVu": { + "comment": "header of a settings section related to PastVu API links", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "PastVu" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "PastVu" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "PastVu" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "PastVu" + "uk": { + "stringUnit": { + "state": "translated", + "value": "PastVu" } } } }, - "PastVu rules" : { - "comment" : "name of a link to pastVu rules", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Правила PastVu" + "PastVu rules": { + "comment": "name of a link to pastVu rules", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Правила PastVu" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pravila PastVu" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Pravila PastVu" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Правила PastVu" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Правила PastVu" } } } }, - "Please try again later" : { - "comment" : "Prompt to try finding location later", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пожалуйста, попробуйте позже" + "Please try again later": { + "comment": "Prompt to try finding location later", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Пожалуйста, попробуйте позже" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Molimo vas, pokušajte ponovo kasnije" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Molimo vas, pokušajte ponovo kasnije" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Будь ласка, спробуйте пізніше" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Будь ласка, спробуйте пізніше" } } } }, - "Print value" : { - "comment" : "debug action to print value", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Распечатать значение" + "Print value": { + "comment": "debug action to print value", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Распечатать значение" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ispiši vrednost" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Ispiši vrednost" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Вивести значення" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Вивести значення" } } } }, - "Pull to view images as list" : { - "comment" : "hint on a pullable card under map controls bar", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Потяните для списка" + "Pull to view images as list": { + "comment": "hint on a pullable card under map controls bar", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Потяните для списка" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Povucite za prikaz liste" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Povucite za prikaz liste" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Потягніть для перегляду списком" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Потягніть для перегляду списком" } } } }, - "Rewind" : { - "comment" : "app name from credits", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind" + "Rewind": { + "comment": "app name from credits", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Rewind" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Rewind" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Rewind" } } } }, - "Rewind <<" : { - "comment" : "app label for comparison photos", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind <<" + "Rewind <<": { + "comment": "app label for comparison photos", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Rewind <<" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind <<" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Rewind <<" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind <<" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Rewind <<" } } } }, - "Rewind uses PastVu API to get the images" : { - "comment" : "credit to pastvu api", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind использует данные PastVu API" + "Rewind uses PastVu API to get the images": { + "comment": "credit to pastvu api", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Rewind использует данные PastVu API" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind koristi PastVu API za preuzimanje slika" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Rewind koristi PastVu API za preuzimanje slika" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rewind використовує PastVu API для отримання зображень" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Rewind використовує PastVu API для отримання зображень" } } } }, - "Satellite" : { - "comment" : "satellite map style", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Спутник" + "Satellite": { + "comment": "satellite map style", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Спутник" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Satelit" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Satelit" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Супутник" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Супутник" } } } }, - "Save image" : { - "comment" : "label for action to save image", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Сохранить" + "Save image": { + "comment": "label for action to save image", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Сохранить" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sačuvaj sliku" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Sačuvaj sliku" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Зберегти зображення" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Зберегти зображення" } } } }, - "Scheme" : { - "comment" : "scheme map style", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Схема" + "Scheme": { + "comment": "scheme map style", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Схема" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Shema" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Shema" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Схема" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Схема" } } } }, - "Search" : { - "comment" : "search screen navigation title", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Поиск" + "Search": { + "comment": "search screen navigation title", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Поиск" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pretraga" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Pretraga" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пошук" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Пошук" } } } }, - "Search for location" : { - "comment" : "search text field placeholder", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Поиск локации" + "Search for location": { + "comment": "search text field placeholder", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Поиск локации" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pretraži lokaciju" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Pretraži lokaciju" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пошук локації" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Пошук локації" } } } }, - "Select map app to find route" : { - "comment" : "prompt for menu with list of map apps to find the route to image location", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Выберите приложение для построения маршрута" + "Select map app to find route": { + "comment": "prompt for menu with list of map apps to find the route to image location", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Выберите приложение для построения маршрута" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Izaberite aplikaciju za pronalaženje rute" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Izaberite aplikaciju za pronalaženje rute" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Виберіть застосунок для прокладання маршруту" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Виберіть застосунок для прокладання маршруту" } } } }, - "Settings" : { - "comment" : "settings screen title", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Настройки" + "Settings": { + "comment": "settings screen title", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Настройки" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Podešavanja" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Podešavanja" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Налаштування" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Налаштування" } } } }, - "Share" : { - "comment" : "label for action to share", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Поделиться" + "Share": { + "comment": "label for action to share", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Поделиться" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Podeli" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Podeli" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Поділитися" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Поділитися" } } } }, - "Show colors in cluster annotations" : { - "comment" : "settings toggle name", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Показывать цвета в кластерах на карте" + "Show colors in cluster annotations": { + "comment": "settings toggle name", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Показывать цвета в кластерах на карте" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prikazuj boje u oznakama klastera" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Prikazuj boje u oznakama klastera" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Показувати кольори в кластерах на карті" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Показувати кольори в кластерах на карті" } } } }, - "Show on map" : { - "comment" : "action name on image details screen. shows image location on a map", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Показать на карте" + "Show on map": { + "comment": "action name on image details screen. shows image location on a map", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Показать на карте" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prikaži na karti" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Prikaži na karti" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Показати на карті" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Показати на карті" } } } }, - "single_image_description" : { - "comment" : "Onboarding description of a single image map annotation", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Shows direction. You can view image details when you tap it" + "Shuffle": { + "comment": "Image sorting option. Shown as menu picker item", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Перемешать" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Показывает направление. По касанию открывает детали изображения" + "sr-Latn": { + "stringUnit": { + "value": "Promešaj", + "state": "translated" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pokazuje smer. Dodirnite da biste videli detalje slike" + "uk": { + "stringUnit": { + "value": "Перемішати", + "state": "translated" + } + } + } + }, + "single_image_description": { + "comment": "Onboarding description of a single image map annotation", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Shows direction. You can view image details when you tap it" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Показывает направление. По касанию открывает детали изображения" + } + }, + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Pokazuje smer. Dodirnite da biste videli detalje slike" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Показує напрямок. Щоб переглянути деталі зображення, торкніться його" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Показує напрямок. Щоб переглянути деталі зображення, торкніться його" } } } }, - "single_image_title" : { - "comment" : "Onboarding title of a single image map annotation", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Single image" + "single_image_title": { + "comment": "Onboarding title of a single image map annotation", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Single image" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Одна картинка" + "ru": { + "stringUnit": { + "state": "translated", + "value": "Одна картинка" + } + }, + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Pojedinačna slika" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Одне зображення" + } + } + } + }, + "Something went wrong during the search": { + "comment": "Search error alert title", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Что-то пошло не так во время поиска" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pojedinačna slika" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Nešto je pošlo po zlu tokom pretrage" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Одне зображення" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Щось пішло не так під час пошуку" } } } }, - "Something went wrong during the search" : { - "comment" : "Search error alert title", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Что-то пошло не так во время поиска" + "Sorting": { + "comment": "Menu picker title", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Сортировка" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nešto je pošlo po zlu tokom pretrage" + "sr-Latn": { + "stringUnit": { + "value": "Sortiranje", + "state": "translated" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Щось пішло не так під час пошуку" + "uk": { + "stringUnit": { + "value": "Сортування", + "state": "translated" } } } }, - "source" : { - "comment" : "label for image source", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "источник" + "source": { + "comment": "label for image source", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "источник" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "izvor" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "izvor" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "джерело" + "uk": { + "stringUnit": { + "state": "translated", + "value": "джерело" } } } }, - "Start typing" : { - "comment" : "Title of a placeholder that is shown when search query is empty", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Введите запрос" + "Start typing": { + "comment": "Title of a placeholder that is shown when search query is empty", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Введите запрос" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unesite upit" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Unesite upit" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Почніть пошук" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Почніть пошук" } } } }, - "Street View Error" : { - "comment" : "error alert title", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ошибка Street View" + "Street View Error": { + "comment": "error alert title", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Ошибка Street View" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Greška Street View" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Greška Street View" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Помилка Street View" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Помилка Street View" } } } }, - "The app has no access to your location" : { - "comment" : "error message in alert", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "У приложения нет доступа к геолокации" + "The app has no access to your location": { + "comment": "error message in alert", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "У приложения нет доступа к геолокации" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aplikacija nema pristup vašoj lokaciji" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Aplikacija nema pristup vašoj lokaciji" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Застосунок не має доступу до вашої геолокації" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Застосунок не має доступу до вашої геолокації" } } } }, - "This app would not be possible without PastVu" : { - "comment" : "pastvu api credit in settings", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Это приложение было бы невозможно без PastVu" + "This app would not be possible without PastVu": { + "comment": "pastvu api credit in settings", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Это приложение было бы невозможно без PastVu" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ova aplikacija ne bi bila moguća bez PastVu" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Ova aplikacija ne bi bila moguća bez PastVu" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Цей додаток був би неможливий без PastVu" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Цей додаток був би неможливий без PastVu" } } } }, - "This is " : { - "comment" : "Part of onboarding greeting. Like “Hi! This is Rewind”", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Это " + "This is ": { + "comment": "Part of onboarding greeting. Like “Hi! This is Rewind”", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Это " } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ovo je " + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Ovo je " } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Це " + "uk": { + "stringUnit": { + "state": "translated", + "value": "Це " } } } }, - "Try to change the search query and try again" : { - "comment" : "Search error alert prompt", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Попробуйте изменить текст запроса и поискать снова" + "Try to change the search query and try again": { + "comment": "Search error alert prompt", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Попробуйте изменить текст запроса и поискать снова" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Izmenite tekst pretrage i pokušajte ponovo" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Izmenite tekst pretrage i pokušajte ponovo" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Спробуйте змінити пошуковий запит і повторіть пошук" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Спробуйте змінити пошуковий запит і повторіть пошук" } } } }, - "Unable to Determine Location" : { - "comment" : "error message in alert", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не удалось определить местоположение" + "Unable to Determine Location": { + "comment": "error message in alert", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Не удалось определить местоположение" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nije moguće odrediti lokaciju" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Nije moguće odrediti lokaciju" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не вдалося визначити місцезнаходження" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Не вдалося визначити місцезнаходження" } } } }, - "Unable to find what you're looking for" : { - "comment" : "Search error alert title", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не удалось найти то, что вы ищете" + "Unable to find what you're looking for": { + "comment": "Search error alert title", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Не удалось найти то, что вы ищете" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nije moguće pronaći ono što tražite" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Nije moguće pronaći ono što tražite" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не вдалося знайти те, що ви шукаєте" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Не вдалося знайти те, що ви шукаєте" } } } }, - "Unable to load image in high resolution" : { - "comment" : "error message in alert", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не удалось загрузить изображение в полном разрешении" + "Unable to load image in high resolution": { + "comment": "error message in alert", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Не удалось загрузить изображение в полном разрешении" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nije moguće učitati sliku u visokoj rezoluciji" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Nije moguće učitati sliku u visokoj rezoluciji" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не вдалося завантажити зображення у високій роздільній здатності" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Не вдалося завантажити зображення у високій роздільній здатності" } } } }, - "Unable to load image info" : { - "comment" : "error message in alert", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не удалось загрузить информацию об изображении" + "Unable to load image info": { + "comment": "error message in alert", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Не удалось загрузить информацию об изображении" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nije moguće učitati informacije o slici" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Nije moguće učitati informacije o slici" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не вдалося завантажити інформацію про зображення" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Не вдалося завантажити інформацію про зображення" } } } }, - "Unable to load map annotations" : { - "comment" : "error message in alert", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не удалось загрузить метки на карте" + "Unable to load map annotations": { + "comment": "error message in alert", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Не удалось загрузить метки на карте" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nije moguće učitati oznake na mapi" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Nije moguće učitati oznake na mapi" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не вдалося завантажити позначки на карті" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Не вдалося завантажити позначки на карті" } } } }, - "Unable to load suggests for this query" : { - "comment" : "Search suggest error alert title", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не удалось загрузить подсказки для вашего запроса" + "Unable to load suggests for this query": { + "comment": "Search suggest error alert title", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Не удалось загрузить подсказки для вашего запроса" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nije moguće učitati predloge za ovaj upit" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Nije moguće učitati predloge za ovaj upit" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не вдалося завантажити підказки для цього запиту" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Не вдалося завантажити підказки для цього запиту" } } } }, - "Unable to save image" : { - "comment" : "error message in alert", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не удалось сохранить изображение" + "Unable to save image": { + "comment": "error message in alert", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Не удалось сохранить изображение" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nije moguće sačuvati sliku" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Nije moguće sačuvati sliku" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не вдалося зберегти зображення" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Не вдалося зберегти зображення" } } } }, - "Unable to share image" : { - "comment" : "error message in alert", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не удалось поделиться изображением" + "Unable to share image": { + "comment": "error message in alert", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Не удалось поделиться изображением" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nije moguće podeliti sliku" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Nije moguće podeliti sliku" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не вдалося поділитися зображенням" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Не вдалося поділитися зображенням" } } } }, - "Unable to switch lens" : { - "comment" : "error message in alert when camera lens can’t be switched", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не удалось сменить линзу" + "Unable to switch lens": { + "comment": "error message in alert when camera lens can’t be switched", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Не удалось сменить линзу" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nije moguće promeniti objektiv" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Nije moguće promeniti objektiv" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не вдалося переключити об'єктив" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Не вдалося переключити об'єктив" } } } }, - "Unable to use the camera" : { - "comment" : "error message for comparison screen whenever the camera session is not ready", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не удалось подключиться к камере" + "Unable to use the camera": { + "comment": "error message for comparison screen whenever the camera session is not ready", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Не удалось подключиться к камере" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nije moguće koristiti kameru" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Nije moguće koristiti kameru" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Не вдалося використати камеру" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Не вдалося використати камеру" } } } }, - "uploaded by" : { - "comment" : "Is shown right above the nickname of a user that uploaded the image", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "uploaded by" + "uploaded by": { + "comment": "Is shown right above the nickname of a user that uploaded the image", + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "uploaded by" } }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "загружено" + "ru": { + "stringUnit": { + "state": "translated", + "value": "загружено" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "otpremljeno" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "otpremljeno" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "завантажено" + "uk": { + "stringUnit": { + "state": "translated", + "value": "завантажено" } } } }, - "View as List" : { - "comment" : "Description of a card that opens a new screen with a list of images", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Открыть списком" + "View as List": { + "comment": "Description of a card that opens a new screen with a list of images", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Открыть списком" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prikaži kao listu" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Prikaži kao listu" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Переглянути списком" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Переглянути списком" } } } }, - "View in App Store" : { - "comment" : "Action title in settings. Opens an App Store page of the app", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Открыть в App Store" + "View in App Store": { + "comment": "Action title in settings. Opens an App Store page of the app", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Открыть в App Store" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pogledaj u App Store" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Pogledaj u App Store" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Переглянути в App Store" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Переглянути в App Store" } } } }, - "View on Web" : { - "comment" : "label for action to open the image page on the web", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "На сайте" + "View on Web": { + "comment": "label for action to open the image page on the web", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "На сайте" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otvori na vebu" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Otvori na vebu" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "На сайті" + "uk": { + "stringUnit": { + "state": "translated", + "value": "На сайті" } } } }, - "View PastVu website" : { - "comment" : "link to a website. located in settings", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Открыть сайт PastVu" + "View PastVu website": { + "comment": "link to a website. located in settings", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Открыть сайт PastVu" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otvori PastVu veb-sajt" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Otvori PastVu veb-sajt" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Відкрити сайт PastVu" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Відкрити сайт PastVu" } } } }, - "View source code" : { - "comment" : "link to a github repo. located in settings", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Открыть исходный код" + "View source code": { + "comment": "link to a github repo. located in settings", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Открыть исходный код" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pogledaj izvorni kod" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Pogledaj izvorni kod" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Переглянути вихідний код" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Переглянути вихідний код" } } } }, - "What do they look like?" : { - "comment" : "Map annotation onboarding subtitle", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Как они выглядят?" + "What do they look like?": { + "comment": "Map annotation onboarding subtitle", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Как они выглядят?" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kako izgledaju?" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Kako izgledaju?" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Як вони виглядають?" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Як вони виглядають?" } } } }, - "with a little help from:" : { - "comment" : "credits in settings. with a little help from a, b and c.", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "с небольшой помощью от:" + "with a little help from:": { + "comment": "credits in settings. with a little help from a, b and c.", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "с небольшой помощью от:" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "uz malu pomoć od:" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "uz malu pomoć od:" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "з невеликою допомогою від:" + "uk": { + "stringUnit": { + "state": "translated", + "value": "з невеликою допомогою від:" } } } }, - "Yandex Maps" : { - "comment" : "map app name", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Яндекс Карты" + "Yandex Maps": { + "comment": "map app name", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Яндекс Карты" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Yandex Maps" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Yandex Maps" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Яндекс Карти" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Яндекс Карти" } } } }, - "You can change it in Settings.\nGo to Apps -> Rewind -> Location -> While Using the App" : { - "comment" : "prompt to open settings and grant location access", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Вы можете изменить это в Настройках. Приложения -> Rewind -> Геолокация -> Во время использования" + "You can change it in Settings.\nGo to Apps -> Rewind -> Location -> While Using the App": { + "comment": "prompt to open settings and grant location access", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Вы можете изменить это в Настройках. Приложения -> Rewind -> Геолокация -> Во время использования" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Možete to promeniti u Podešavanjima.\nIdite na Aplikacije -> Rewind -> Lokacija -> Dok se koristi" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Možete to promeniti u Podešavanjima.\nIdite na Aplikacije -> Rewind -> Lokacija -> Dok se koristi" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ви можете змінити це в Налаштуваннях.\nПерейдіть до Програми -> Rewind -> Геолокація -> Під час використання" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Ви можете змінити це в Налаштуваннях.\nПерейдіть до Програми -> Rewind -> Геолокація -> Під час використання" } } } }, - "You can check camera permissions in Settings" : { - "comment" : "alert error message", - "localizations" : { - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Можете проверить доступ приложения к камере в Настройках" + "You can check camera permissions in Settings": { + "comment": "alert error message", + "localizations": { + "ru": { + "stringUnit": { + "state": "translated", + "value": "Можете проверить доступ приложения к камере в Настройках" } }, - "sr-Latn" : { - "stringUnit" : { - "state" : "translated", - "value" : "Možete proveriti dozvole za kameru u Podešavanjima" + "sr-Latn": { + "stringUnit": { + "state": "translated", + "value": "Možete proveriti dozvole za kameru u Podešavanjima" } }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ви можете перевірити доступ до камери в Налаштуваннях" + "uk": { + "stringUnit": { + "state": "translated", + "value": "Ви можете перевірити доступ до камери в Налаштуваннях" } } } } }, - "version" : "1.0" -} \ No newline at end of file + "version": "1.0" +} diff --git a/Rewind/Model/AppGraph.swift b/Rewind/Model/AppGraph.swift index 16e82f4..046f6e5 100644 --- a/Rewind/Model/AppGraph.swift +++ b/Rewind/Model/AppGraph.swift @@ -56,7 +56,8 @@ final class AppGraph { urlOpener: urlOpener, settings: settings.asVariable(), appState: Variable { appModelRef?.state }, - annotationStore: AnnotationStore() + annotationStore: AnnotationStore(), + sorting: settings.asVariable().map(\.sorting) ) mapModelRef = mapModel mapStore = mapModel.viewStore.bimap( @@ -105,7 +106,8 @@ final class AppGraph { performMapAction: { mapModelRef?(.external($0)) }, favoritesModel: favoritesModel, onboardingViewModel: onboardingViewModel, - currentRegionImages: Variable { mapModelRef?.state.currentRegionImages ?? [] } + currentRegionImages: Variable { mapModelRef?.state.currentRegionImages ?? [] }, + sorting: settings.asProperty().bimap(get: \.sorting, modify: { $0.sorting = $1 }) ) appModelRef = appModel appStore = appModel.viewStore @@ -119,5 +121,8 @@ final class AppGraph { locationModel.$state.currentAndNewValues.addObserver { mapModelRef?(.external(.newLocationState($0))) }.dispose(in: disposePool) + settings.asObservableVariable().map(\.sorting).onChange { _ in + mapModelRef?(.internal(.updatePreviews)) + }.dispose(in: disposePool) } } diff --git a/Rewind/Model/AppModel.swift b/Rewind/Model/AppModel.swift index 35ea275..17f4bf2 100644 --- a/Rewind/Model/AppModel.swift +++ b/Rewind/Model/AppModel.swift @@ -81,7 +81,8 @@ func makeAppModel( performMapAction: @escaping (MapAction.External) -> Void, favoritesModel: FavoritesModel, onboardingViewModel: OnboardingViewModel?, - currentRegionImages: Variable<[Model.Image]> + currentRegionImages: Variable<[Model.Image]>, + sorting: Property ) -> AppModel { AppModel( initial: .makeInitial( @@ -108,7 +109,8 @@ func makeAppModel( matchedTransitionSourceName: source, images: favoritesModel.state, listUpdates: favoritesModel.$state.newValues, - imageDetailsFactory: imageDetailsFactory + imageDetailsFactory: imageDetailsFactory, + sorting: nil ).viewStore ) case let .presentCurrentRegionImages(source): @@ -118,7 +120,8 @@ func makeAppModel( matchedTransitionSourceName: source, images: currentRegionImages.value, listUpdates: .empty, - imageDetailsFactory: imageDetailsFactory + imageDetailsFactory: imageDetailsFactory, + sorting: sorting ).viewStore ) case let .present(images, source, title): @@ -128,7 +131,8 @@ func makeAppModel( matchedTransitionSourceName: source, images: images, listUpdates: .empty, - imageDetailsFactory: imageDetailsFactory + imageDetailsFactory: imageDetailsFactory, + sorting: sorting ).viewStore ) case .dismiss: diff --git a/Rewind/Model/Data Types/ImageDate.swift b/Rewind/Model/Data Types/ImageDate.swift index bb72aed..dd087c6 100644 --- a/Rewind/Model/Data Types/ImageDate.swift +++ b/Rewind/Model/Data Types/ImageDate.swift @@ -16,3 +16,9 @@ struct ImageDate: Equatable, Codable, Hashable { return "\(year) - \(year2)" } } + +extension ImageDate: Comparable { + static func <(lhs: ImageDate, rhs: ImageDate) -> Bool { + (lhs.year, lhs.year2) < (rhs.year, rhs.year2) + } +} diff --git a/Rewind/Model/ImageListModel.swift b/Rewind/Model/ImageListModel.swift index 7c40294..4f7c50d 100644 --- a/Rewind/Model/ImageListModel.swift +++ b/Rewind/Model/ImageListModel.swift @@ -17,12 +17,14 @@ struct ImageListState { var matchedTransitionSourceName: String var images: [Model.Image] var imageDetails: Identified? + var sorting: ImageSorting? } enum ImageListAction { case presentImage(Model.Image) case dismissImage case updateImages([Model.Image]) + case setSorting(ImageSorting) } func makeImageListModel( @@ -30,14 +32,16 @@ func makeImageListModel( matchedTransitionSourceName: String, images: [Model.Image], listUpdates: Signal<[Model.Image]>, - imageDetailsFactory: @escaping ImageDetailsFactory + imageDetailsFactory: @escaping ImageDetailsFactory, + sorting: Property? ) -> ImageListModel { ImageListModel( initial: ImageListState( title: title, matchedTransitionSourceName: matchedTransitionSourceName, images: images, - imageDetails: nil + imageDetails: nil, + sorting: sorting?.value ), reduce: { state, action, _ in switch action { @@ -49,6 +53,11 @@ func makeImageListModel( state.imageDetails = nil case let .updateImages(images): state.images = images + case let .setSorting(newSorting): + guard state.sorting != newSorting else { return } + state.sorting = newSorting + sorting?.value = newSorting + state.images = state.images.sorted(by: newSorting) } } ).adding( diff --git a/Rewind/Model/ImageSorting.swift b/Rewind/Model/ImageSorting.swift new file mode 100644 index 0000000..1163dcb --- /dev/null +++ b/Rewind/Model/ImageSorting.swift @@ -0,0 +1,24 @@ +// +// ImageSorting.swift +// Rewind +// +// Created by Aleksei Sherstnev on 10. 1. 2026.. +// + +import Foundation + +enum ImageSorting: CaseIterable, Codable { + case dateAscending + case dateDescending + case shuffle +} + +extension [Model.Image] { + func sorted(by sorting: ImageSorting) -> [Model.Image] { + switch sorting { + case .dateAscending: sorted { $0.date < $1.date } + case .dateDescending: sorted { $0.date > $1.date } + case .shuffle: shuffled() + } + } +} diff --git a/Rewind/Model/MapModel.swift b/Rewind/Model/MapModel.swift index eaaa472..0e821a7 100644 --- a/Rewind/Model/MapModel.swift +++ b/Rewind/Model/MapModel.swift @@ -71,7 +71,8 @@ func makeMapModel( urlOpener: @escaping UrlOpener, settings: Variable, appState: Variable, - annotationStore: AnnotationStore + annotationStore: AnnotationStore, + sorting: Variable ) -> MapModel { MapModel( initial: .makeInitial(locationState: locationModel.state), @@ -257,7 +258,7 @@ func makeMapModel( return [] } } - state.currentRegionImages = Array(Set(modelValues)) + state.currentRegionImages = Array(Set(modelValues)).sorted(by: sorting.value) state.previews = makePreviews(images: state.currentRegionImages, limit: 10) case .unfoldMapControlsBack: performAppAction(.mapControls(.setMinimization(.normal))) diff --git a/Rewind/Model/SettingsViewModel.swift b/Rewind/Model/SettingsViewModel.swift index 108fa9a..e745686 100644 --- a/Rewind/Model/SettingsViewModel.swift +++ b/Rewind/Model/SettingsViewModel.swift @@ -15,6 +15,33 @@ typealias SettingsViewModel = Reducer struct SettingsState: Codable, Equatable { var showYearColorInClusters: Bool var openClusterPreviews: Bool + + var sorting: ImageSorting + + init( + showYearColorInClusters: Bool, + openClusterPreviews: Bool, + sorting: ImageSorting + ) { + self.showYearColorInClusters = showYearColorInClusters + self.openClusterPreviews = openClusterPreviews + self.sorting = sorting + } + + enum CodingKeys: String, CodingKey { + case showYearColorInClusters + case openClusterPreviews + case sorting + } + + init(from decoder: any Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.showYearColorInClusters = try container.decode(Bool.self, forKey: .showYearColorInClusters) + self.openClusterPreviews = try container.decode(Bool.self, forKey: .openClusterPreviews) + + self.sorting = try container + .decodeIfPresent(ImageSorting.self, forKey: .sorting) ?? .dateAscending + } } enum SettingsViewAction { @@ -90,6 +117,7 @@ func makeSettingsViewModel( extension SettingsState { static let `default` = SettingsState( showYearColorInClusters: true, - openClusterPreviews: false + openClusterPreviews: false, + sorting: .dateAscending ) } diff --git a/Rewind/View/ImageList.swift b/Rewind/View/ImageList.swift index c286af4..8371a0d 100644 --- a/Rewind/View/ImageList.swift +++ b/Rewind/View/ImageList.swift @@ -18,11 +18,7 @@ struct ImageList: View { NavigationStack { content .navigationTitle(viewStore.title) - .toolbar { - ToolbarItem(placement: .topBarLeading) { - ToolbarBackButton() - } - } + .toolbar { toolbar } .fullScreenCover( item: viewStore.binding(\.imageDetails, send: { _ in .dismissImage }), content: { identified in @@ -67,6 +63,33 @@ struct ImageList: View { .matchedTransitionSource(id: image.cid, in: namespace) } } + + @ToolbarContentBuilder + private var toolbar: some ToolbarContent { + ToolbarItem(placement: .topBarLeading) { + ToolbarBackButton() + } + if let sorting = viewStore.sorting { + ToolbarItem(placement: .topBarTrailing) { + Menu(content: { + Picker( + "Sorting", + selection: Binding( + get: { sorting }, + set: { viewStore(.setSorting($0)) } + ), + content: { + ForEach(ImageSorting.allCases) { + Label($0.title, systemImage: $0.iconName) + } + } + ) + }, label: { + Image(systemName: "arrow.up.arrow.down") + }) + } + } + } } struct ToolbarBackButton: View { @@ -85,6 +108,26 @@ struct ToolbarBackButton: View { } } +extension ImageSorting: Identifiable { + var id: ImageSorting { self } + + fileprivate var title: LocalizedStringKey { + switch self { + case .dateAscending: "Date Ascending" + case .dateDescending: "Date Descending" + case .shuffle: "Shuffle" + } + } + + fileprivate var iconName: String { + switch self { + case .dateAscending: "arrow.up" + case .dateDescending: "arrow.down" + case .shuffle: "shuffle" + } + } +} + #if DEBUG private let imageDetailsFactoryMock: ImageDetailsFactory = { _, source in makeImageDetailsModel( @@ -106,10 +149,19 @@ private let imageDetailsFactoryMock: ImageDetailsFactory = { _, source in title: "Images", matchedTransitionSourceName: "", images: (0..<10).map { idx in - modified(.mock) { $0.cid = idx } + modified(.mock) { + let year = Int.random(in: 1826...1995) + let year2 = year + Int.random(in: 0...5) + $0.date = ImageDate( + year: year, + year2: year2 + ) + $0.cid = idx + } }, listUpdates: .empty, - imageDetailsFactory: imageDetailsFactoryMock + imageDetailsFactory: imageDetailsFactoryMock, + sorting: .constant(.dateAscending) ).viewStore ImageList(viewStore: store) @@ -122,7 +174,8 @@ private let imageDetailsFactoryMock: ImageDetailsFactory = { _, source in matchedTransitionSourceName: "", images: [], listUpdates: .empty, - imageDetailsFactory: imageDetailsFactoryMock + imageDetailsFactory: imageDetailsFactoryMock, + sorting: .constant(.dateAscending) ).viewStore ImageList(viewStore: store)