From 1a8fd7d8ffcb6d4ff28b5920f886628941ee5a58 Mon Sep 17 00:00:00 2001 From: Mauro <34335419+Velin92@users.noreply.github.com> Date: Wed, 31 Jan 2024 13:29:52 +0100 Subject: [PATCH] Download SAS Strings Tool + Localised SAS emojis (#2409) --- ElementX.xcodeproj/project.pbxproj | 36 ++++++ .../Localizations/cs.lproj/SAS.strings | 64 +++++++++++ .../Localizations/de.lproj/SAS.strings | 64 +++++++++++ .../Localizations/en.lproj/SAS.strings | 64 +++++++++++ .../Localizations/es.lproj/SAS.strings | 64 +++++++++++ .../Localizations/fr.lproj/SAS.strings | 64 +++++++++++ .../Localizations/hu.lproj/SAS.strings | 64 +++++++++++ .../Localizations/id.lproj/SAS.strings | 64 +++++++++++ .../Localizations/it.lproj/SAS.strings | 64 +++++++++++ .../Localizations/ru.lproj/SAS.strings | 64 +++++++++++ .../Localizations/sk.lproj/SAS.strings | 64 +++++++++++ ElementX/Sources/Generated/Strings+SAS.swift | 27 +++++ .../View/SessionVerificationScreen.swift | 2 +- ...nVerificationControllerProxyProtocol.swift | 4 + Tools/Sources/GenerateSAS.swift | 106 ++++++++++++++++++ Tools/Sources/Tools.swift | 3 +- 16 files changed, 816 insertions(+), 2 deletions(-) create mode 100644 ElementX/Resources/Localizations/cs.lproj/SAS.strings create mode 100644 ElementX/Resources/Localizations/de.lproj/SAS.strings create mode 100644 ElementX/Resources/Localizations/en.lproj/SAS.strings create mode 100644 ElementX/Resources/Localizations/es.lproj/SAS.strings create mode 100644 ElementX/Resources/Localizations/fr.lproj/SAS.strings create mode 100644 ElementX/Resources/Localizations/hu.lproj/SAS.strings create mode 100644 ElementX/Resources/Localizations/id.lproj/SAS.strings create mode 100644 ElementX/Resources/Localizations/it.lproj/SAS.strings create mode 100644 ElementX/Resources/Localizations/ru.lproj/SAS.strings create mode 100644 ElementX/Resources/Localizations/sk.lproj/SAS.strings create mode 100644 ElementX/Sources/Generated/Strings+SAS.swift create mode 100644 Tools/Sources/GenerateSAS.swift diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index 4072c121c..4b4cec640 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -456,6 +456,7 @@ 755727E0B756430DFFEC4732 /* SessionVerificationViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF05DA24F71B455E8EFEBC3B /* SessionVerificationViewModelTests.swift */; }; 762DAF94846C7AC8550F1CC1 /* MediaPlayerProviderProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5E23D8EE6CBACF32F1EC874 /* MediaPlayerProviderProtocol.swift */; }; 763D69741D58D2B650BC1FC9 /* CallScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F37FA1A5D55633E1942B153B /* CallScreenCoordinator.swift */; }; + 7640A4B412CACF15D143CCD4 /* Strings+SAS.swift in Sources */ = {isa = PBXBuildFile; fileRef = B172057567E049007A5C4D92 /* Strings+SAS.swift */; }; 764AFCC225B044CF5F9B41E5 /* PaginationIndicatorRoomTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42EEA67A6796BDC2761619C5 /* PaginationIndicatorRoomTimelineView.swift */; }; 767D366C40F1311CFA333763 /* PillContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86376BEE425704AEE197CA54 /* PillContext.swift */; }; 7691233E3572A9173FD96CB3 /* SecureBackupKeyBackupScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E88534A39781D76487D59DF /* SecureBackupKeyBackupScreenViewModelTests.swift */; }; @@ -777,6 +778,7 @@ C2879369106A419A5071F1F8 /* VoiceMessageRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B0A96B8FE4849227945067 /* VoiceMessageRecorder.swift */; }; C287BE1802AD432F3D848D8E /* InvitesScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DF81D7F2A6BA9DE3F6F8D9D /* InvitesScreenViewModel.swift */; }; C32765D740C81AD4C42E8F50 /* CreateRoomFlowParameters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 935C2FB18EFB8EEE96B26330 /* CreateRoomFlowParameters.swift */; }; + C3317EF833AB4060988DF098 /* SAS.strings in Resources */ = {isa = PBXBuildFile; fileRef = 135FC689EA39AE1D34153B58 /* SAS.strings */; }; C3522917C0C367C403429EEC /* CoordinatorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B251F5B4511D1CA0BA8361FE /* CoordinatorProtocol.swift */; }; C4078364FD9FA00EA9D00A15 /* RoomMembersListScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45CDF9A107BFE6C79B58D6B5 /* RoomMembersListScreenViewModelProtocol.swift */; }; C413D36D44F89DE63D3ADFA4 /* ReportContentScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A433BE28B40D418237BE37B5 /* ReportContentScreen.swift */; }; @@ -812,6 +814,7 @@ CBA9EDF305036039166E76FF /* StartChatScreenUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2AEC1AB349A341FE13DEC1 /* StartChatScreenUITests.swift */; }; CBB4F39A1309F7281AE7AA8E /* test_voice_message.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 0392E3FDE372C9B56FEEED8B /* test_voice_message.m4a */; }; CBD2ABE4C1A47ECD99E1488E /* NotificationSettingsScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 421FA93BCC2840E66E4F306F /* NotificationSettingsScreenViewModelProtocol.swift */; }; + CBFF4F1BFA90B46241B8106C /* Strings+SAS.swift in Sources */ = {isa = PBXBuildFile; fileRef = B172057567E049007A5C4D92 /* Strings+SAS.swift */; }; CC0D088F505F33A20DC5590F /* RoomStateEventStringBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEEAFB646E583655652C3D04 /* RoomStateEventStringBuilderTests.swift */; }; CC961529F9F1854BEC3272C9 /* LayoutMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC8AA23D4F37CC26564F63C5 /* LayoutMocks.swift */; }; CCBEC2100CAF2EEBE9DB4156 /* TemplateScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA40B98B098B6F0371B750B3 /* TemplateScreenModels.swift */; }; @@ -1119,6 +1122,7 @@ 0F64447FF544298A6A3BEF85 /* NotificationSettingsScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSettingsScreenModels.swift; sourceTree = ""; }; 0FA60F848D1C14F873F9621A /* RoomMemberDetailsScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberDetailsScreenCoordinator.swift; sourceTree = ""; }; 0FB782CE6176A5D2C082EC5D /* WelcomeScreenScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeScreenScreenModels.swift; sourceTree = ""; }; + 105429F29096729EDD3152CF /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/SAS.strings; sourceTree = ""; }; 1059E2AE7878CF7820592637 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 105B2A8426404EF66F00CFDB /* RoomTimelineItemFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomTimelineItemFactory.swift; sourceTree = ""; }; 10B7F8EE25775DE2A305CBB5 /* NotificationCenterProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationCenterProtocol.swift; sourceTree = ""; }; @@ -1216,6 +1220,7 @@ 25F8664F1FB95AF3C4202478 /* PollFormScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollFormScreenCoordinator.swift; sourceTree = ""; }; 260004737C573A56FA01E86E /* Encodable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Encodable.swift; sourceTree = ""; }; 26B0A96B8FE4849227945067 /* VoiceMessageRecorder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceMessageRecorder.swift; sourceTree = ""; }; + 26CB9E9026610C2BC2132D06 /* zh-Hant-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant-TW"; path = "zh-Hant-TW.lproj/SAS.strings"; sourceTree = ""; }; 26EAAB54C6CE91D64B69A9F8 /* AppLockServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockServiceProtocol.swift; sourceTree = ""; }; 2757B1BE23DF8AA239937243 /* AudioConverterProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioConverterProtocol.swift; sourceTree = ""; }; 277C20CDD5B64510401B6D0D /* ServerConfigurationScreenViewStateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerConfigurationScreenViewStateTests.swift; sourceTree = ""; }; @@ -1240,6 +1245,7 @@ 2D0946F77B696176E062D037 /* RoomMembersListScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersListScreenModels.swift; sourceTree = ""; }; 2D505843AB66822EB91F0DF0 /* TimelineItemProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineItemProxy.swift; sourceTree = ""; }; 2D7A2C4A3A74F0D2FFE9356A /* MediaPlayerProviderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaPlayerProviderTests.swift; sourceTree = ""; }; + 2E11E7C396ED06A154CF6DF3 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/SAS.strings; sourceTree = ""; }; 2E88534A39781D76487D59DF /* SecureBackupKeyBackupScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupKeyBackupScreenViewModelTests.swift; sourceTree = ""; }; 2EFE1922F39398ABFB36DF3F /* RoomDetailsViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDetailsViewModelTests.swift; sourceTree = ""; }; 2F36C5D9B37E50915ECBD3EE /* RoomMemberProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberProxy.swift; sourceTree = ""; }; @@ -1420,6 +1426,7 @@ 6033779EB37259F27F938937 /* ClientProxyProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientProxyProtocol.swift; sourceTree = ""; }; 60F18AECC9D38C2B6D85F99C /* Publisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Publisher.swift; sourceTree = ""; }; 612EF972F2A1800682D32C5E /* StickerRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickerRoomTimelineView.swift; sourceTree = ""; }; + 61B33F23681660E940BA57F4 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/SAS.strings; sourceTree = ""; }; 62011D547772F3DF5D924823 /* ApplicationMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationMock.swift; sourceTree = ""; }; 622D09D4ECE759189009AEAF /* MapLibreMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapLibreMapView.swift; sourceTree = ""; }; 624244C398804ADC885239AA /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; @@ -1441,6 +1448,7 @@ 66901977F6469D03C333DF32 /* RoomNotificationSettingsScreenUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomNotificationSettingsScreenUITests.swift; sourceTree = ""; }; 669F35C505ACE1110589F875 /* MediaUploadingPreprocessor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaUploadingPreprocessor.swift; sourceTree = ""; }; 66F2402D738694F98729A441 /* RoomTimelineProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomTimelineProvider.swift; sourceTree = ""; }; + 6722709BD6178E10B70C9641 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/SAS.strings; sourceTree = ""; }; 68010886142843705E342645 /* ProgressMaskModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressMaskModifier.swift; sourceTree = ""; }; 6861FE915C7B5466E6962BBA /* StartChatScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartChatScreen.swift; sourceTree = ""; }; 693E16574C6F7F9FA1015A8C /* Search.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Search.swift; sourceTree = ""; }; @@ -1482,6 +1490,7 @@ 72F37B5DA798C9AE436F2C2C /* AttributedStringBuilderProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributedStringBuilderProtocol.swift; sourceTree = ""; }; 7310D8DFE01AF45F0689C3AA /* Publisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Publisher.swift; sourceTree = ""; }; 7367B3B9A8CAF902220F31D1 /* BugReportFlowCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BugReportFlowCoordinator.swift; sourceTree = ""; }; + 7447C0AD7EF302CD027D6230 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/SAS.strings; sourceTree = ""; }; 745323FCF9AF21A117252C53 /* RoundedLabelItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoundedLabelItem.swift; sourceTree = ""; }; 74611A4182DCF5F4D42696EC /* XCTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTestCase.swift; sourceTree = ""; }; 7463464054DDF194C54F0B04 /* LogViewerScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogViewerScreenViewModelProtocol.swift; sourceTree = ""; }; @@ -1627,6 +1636,7 @@ 9FB4F169D653296023ED65E6 /* NSESettingsProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSESettingsProtocol.swift; sourceTree = ""; }; A00C7A331B72C0F05C00392F /* RoomScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomScreenViewModelProtocol.swift; sourceTree = ""; }; A019A12C866D64CF072024B9 /* AppLockSetupPINScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupPINScreenViewModel.swift; sourceTree = ""; }; + A02D1A490944BF01A37586E1 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/SAS.strings; sourceTree = ""; }; A05707BF550D770168A406DB /* LoginViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewModelTests.swift; sourceTree = ""; }; A057F2FDC14866C3026A89A4 /* NotificationManagerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManagerProtocol.swift; sourceTree = ""; }; A0A01AECFF54281CF35909A6 /* MessageComposer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageComposer.swift; sourceTree = ""; }; @@ -1693,6 +1703,7 @@ B0BA67B3E4EF9D29D14A78CE /* AppLockSettingsScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSettingsScreenViewModelTests.swift; sourceTree = ""; }; B16048D30F0438731C41F775 /* StateRoomTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StateRoomTimelineItem.swift; sourceTree = ""; }; B16CAF20C9AC874A210E2DCF /* SessionVerificationScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationScreenViewModelProtocol.swift; sourceTree = ""; }; + B172057567E049007A5C4D92 /* Strings+SAS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Strings+SAS.swift"; sourceTree = ""; }; B1E227F34BE43B08E098796E /* TestablePreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestablePreview.swift; sourceTree = ""; }; B251F5B4511D1CA0BA8361FE /* CoordinatorProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoordinatorProtocol.swift; sourceTree = ""; }; B2B5EDCD05D50BA9B815C66C /* ImageRoomTimelineItemContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageRoomTimelineItemContent.swift; sourceTree = ""; }; @@ -1815,6 +1826,7 @@ CD95B3714F806AC9CF9A557B /* ComposerToolbarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposerToolbarViewModel.swift; sourceTree = ""; }; CDB3227C7A74B734924942E9 /* RoomSummaryProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomSummaryProvider.swift; sourceTree = ""; }; CEE0E6043EFCF6FD2A341861 /* TimelineReplyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineReplyView.swift; sourceTree = ""; }; + CEE20623EB4A9B88FB29F2BA /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SAS.strings; sourceTree = ""; }; CEE41494C837AA403A06A5D9 /* UnitTests.xctestplan */ = {isa = PBXFileReference; path = UnitTests.xctestplan; sourceTree = ""; }; CF48AF076424DBC1615C74AD /* AuthenticationServiceProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationServiceProxy.swift; sourceTree = ""; }; D0140615D2232612C813FD6C /* EncryptedHistoryRoomTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncryptedHistoryRoomTimelineItem.swift; sourceTree = ""; }; @@ -1824,6 +1836,7 @@ D0A45283CF1DB96E583BECA6 /* ImageRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageRoomTimelineView.swift; sourceTree = ""; }; D0C2D52E36AD614B3C003EF6 /* RoomTimelineItemViewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomTimelineItemViewState.swift; sourceTree = ""; }; D121B4FCFC38DBCC17BCC6D6 /* ComposerToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposerToolbar.swift; sourceTree = ""; }; + D196116D2DD3F2757D45FCB7 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/SAS.strings; sourceTree = ""; }; D1BC84BA0AF11C2128D58ABD /* Common.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Common.swift; sourceTree = ""; }; D1D8479BB704B7EF696F8ABE /* RoomPollsHistoryScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomPollsHistoryScreenCoordinator.swift; sourceTree = ""; }; D263254AFE5B7993FFBBF324 /* NSE.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NSE.entitlements; sourceTree = ""; }; @@ -1860,6 +1873,7 @@ D93C94C30E3135BC9290DE13 /* VoiceMessageRecorderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceMessageRecorderTests.swift; sourceTree = ""; }; DA14564EE143F73F7E4D1F79 /* RoomNotificationSettingsScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomNotificationSettingsScreenModels.swift; sourceTree = ""; }; DA2AEC1AB349A341FE13DEC1 /* StartChatScreenUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartChatScreenUITests.swift; sourceTree = ""; }; + DA3D82522494E78746B2214E /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/SAS.strings; sourceTree = ""; }; DAB8D7926A5684E18196B538 /* VoiceMessageCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceMessageCache.swift; sourceTree = ""; }; DB06F22CFA34885B40976061 /* RoomDetailsEditScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDetailsEditScreen.swift; sourceTree = ""; }; DC0AEA686E425F86F6BA0404 /* UNNotification+Creator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UNNotification+Creator.swift"; sourceTree = ""; }; @@ -2571,6 +2585,7 @@ children = ( 71D52BAA5BADB06E5E8C295D /* Assets.swift */, 47EBB5D698CE9A25BB553A2D /* Strings.swift */, + B172057567E049007A5C4D92 /* Strings+SAS.swift */, 1A18F6CE4D694D21E4EA9B25 /* Strings+Untranslated.swift */, ); path = Generated; @@ -3941,6 +3956,7 @@ 91DE43B8815918E590912DDA /* InfoPlist.strings */, 7109E709A7738E6BCC4553E6 /* Localizable.strings */, 187853A7E643995EE49FAD43 /* Localizable.stringsdict */, + 135FC689EA39AE1D34153B58 /* SAS.strings */, D2F7194F440375338F8E2487 /* Untranslated.strings */, F75DF9500D69A3AAF8339E69 /* Untranslated.stringsdict */, ); @@ -5030,6 +5046,7 @@ 5F5488FBC9CFEB6F433D74A4 /* Localizable.strings in Resources */, 0EA6537A07E2DC882AEA5962 /* Localizable.stringsdict in Resources */, 6860721DB3091BE08164C132 /* MapAssets.xcassets in Resources */, + C3317EF833AB4060988DF098 /* SAS.strings in Resources */, CE1694C7BB93C3311524EF28 /* Untranslated.strings in Resources */, 2797C9D9BA642370F1C85D78 /* Untranslated.stringsdict in Resources */, E67418DACEDBC29E988E6ACD /* message.caf in Resources */, @@ -5229,6 +5246,7 @@ 17BC15DA08A52587466698C5 /* RoomMessageEventStringBuilder.swift in Sources */, 7354D094A4C59B555F407FA1 /* RustTracing.swift in Sources */, 422E8D182CA688D4565CD1E1 /* String.swift in Sources */, + CBFF4F1BFA90B46241B8106C /* Strings+SAS.swift in Sources */, ECA636DAF071C611FDC2BB57 /* Strings+Untranslated.swift in Sources */, 6EC7A40A537CFB3D526A111C /* Strings.swift in Sources */, 719E7AAD1F8E68F68F30FECD /* Task.swift in Sources */, @@ -5930,6 +5948,7 @@ C58E305C380D3ADDF7912180 /* StickerRoomTimelineItem.swift in Sources */, F32B271F60531BE92C6E62A1 /* StickerRoomTimelineView.swift in Sources */, 2F94054F50E312AF30BE07F3 /* String.swift in Sources */, + 7640A4B412CACF15D143CCD4 /* Strings+SAS.swift in Sources */, A7D48E44D485B143AADDB77D /* Strings+Untranslated.swift in Sources */, 066A1E9B94723EE9F3038044 /* Strings.swift in Sources */, FF34BF2AF731340AF9414A18 /* SwipeRightAction.swift in Sources */, @@ -6155,6 +6174,23 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + 135FC689EA39AE1D34153B58 /* SAS.strings */ = { + isa = PBXVariantGroup; + children = ( + 2E11E7C396ED06A154CF6DF3 /* cs */, + DA3D82522494E78746B2214E /* de */, + 7447C0AD7EF302CD027D6230 /* en */, + 6722709BD6178E10B70C9641 /* es */, + CEE20623EB4A9B88FB29F2BA /* fr */, + D196116D2DD3F2757D45FCB7 /* hu */, + 61B33F23681660E940BA57F4 /* it */, + 105429F29096729EDD3152CF /* ru */, + A02D1A490944BF01A37586E1 /* sk */, + 26CB9E9026610C2BC2132D06 /* zh-Hant-TW */, + ); + name = SAS.strings; + sourceTree = ""; + }; 187853A7E643995EE49FAD43 /* Localizable.stringsdict */ = { isa = PBXVariantGroup; children = ( diff --git a/ElementX/Resources/Localizations/cs.lproj/SAS.strings b/ElementX/Resources/Localizations/cs.lproj/SAS.strings new file mode 100644 index 000000000..0bb947c9b --- /dev/null +++ b/ElementX/Resources/Localizations/cs.lproj/SAS.strings @@ -0,0 +1,64 @@ +"aeroplane" = "Letadlo"; +"anchor" = "Kotva"; +"apple" = "Jablko"; +"ball" = "Míč"; +"banana" = "Banán"; +"bell" = "Zvonek"; +"bicycle" = "Kolo"; +"book" = "Kniha"; +"butterfly" = "Motýl"; +"cactus" = "Kaktus"; +"cake" = "Dort"; +"cat" = "Kočka"; +"clock" = "Hodiny"; +"cloud" = "Mrak"; +"corn" = "Kukuřice"; +"dog" = "Pes"; +"elephant" = "Slon"; +"fire" = "Oheň"; +"fish" = "Ryba"; +"flag" = "Vlajka"; +"flower" = "Květina"; +"folder" = "Složka"; +"gift" = "Dárek"; +"glasses" = "Brýle"; +"globe" = "Zeměkoule"; +"guitar" = "Kytara"; +"hammer" = "Kladivo"; +"hat" = "Klobouk"; +"headphones" = "Sluchátka"; +"heart" = "Srdce"; +"horse" = "Kůň"; +"hourglass" = "Přesýpací hodiny"; +"key" = "Klíč ke dveřím"; +"light_bulb" = "Žárovka"; +"lion" = "Lev"; +"lock" = "Zámek"; +"moon" = "Měsíc"; +"mushroom" = "Houba"; +"octopus" = "Chobotnice"; +"panda" = "Panda"; +"paperclip" = "Sponka"; +"pencil" = "Tužka"; +"penguin" = "Tučňák"; +"pig" = "Prase"; +"pin" = "Špendlík"; +"pizza" = "Pizza"; +"rabbit" = "Králík"; +"robot" = "Robot"; +"rocket" = "Raketa"; +"rooster" = "Kohout"; +"santa" = "Mikuláš"; +"scissors" = "Nůžky"; +"smiley" = "Smajlík"; +"spanner" = "Klíč"; +"strawberry" = "Jahoda"; +"telephone" = "Telefon"; +"thumbs_up" = "Palec nahoru"; +"train" = "Vlak"; +"tree" = "Strom"; +"trophy" = "Pohár"; +"trumpet" = "Trumpeta"; +"turtle" = "Želva"; +"umbrella" = "Deštník"; +"unicorn" = "Jednorožec"; \ No newline at end of file diff --git a/ElementX/Resources/Localizations/de.lproj/SAS.strings b/ElementX/Resources/Localizations/de.lproj/SAS.strings new file mode 100644 index 000000000..482a3ee62 --- /dev/null +++ b/ElementX/Resources/Localizations/de.lproj/SAS.strings @@ -0,0 +1,64 @@ +"aeroplane" = "Flugzeug"; +"anchor" = "Anker"; +"apple" = "Apfel"; +"ball" = "Ball"; +"banana" = "Banane"; +"bell" = "Glocke"; +"bicycle" = "Fahrrad"; +"book" = "Buch"; +"butterfly" = "Schmetterling"; +"cactus" = "Kaktus"; +"cake" = "Kuchen"; +"cat" = "Katze"; +"clock" = "Uhr"; +"cloud" = "Wolke"; +"corn" = "Mais"; +"dog" = "Hund"; +"elephant" = "Elefant"; +"fire" = "Feuer"; +"fish" = "Fisch"; +"flag" = "Flagge"; +"flower" = "Blume"; +"folder" = "Ordner"; +"gift" = "Geschenk"; +"glasses" = "Brille"; +"globe" = "Globus"; +"guitar" = "Gitarre"; +"hammer" = "Hammer"; +"hat" = "Hut"; +"headphones" = "Kopfhörer"; +"heart" = "Herz"; +"horse" = "Pferd"; +"hourglass" = "Sanduhr"; +"key" = "Schlüssel"; +"light_bulb" = "Glühbirne"; +"lion" = "Löwe"; +"lock" = "Schloss"; +"moon" = "Mond"; +"mushroom" = "Pilz"; +"octopus" = "Oktopus"; +"panda" = "Panda"; +"paperclip" = "Büroklammer"; +"pencil" = "Bleistift"; +"penguin" = "Pinguin"; +"pig" = "Schwein"; +"pin" = "Stecknadel"; +"pizza" = "Pizza"; +"rabbit" = "Hase"; +"robot" = "Roboter"; +"rocket" = "Rakete"; +"rooster" = "Hahn"; +"santa" = "Weihnachtsmann"; +"scissors" = "Schere"; +"smiley" = "Lächeln"; +"spanner" = "Schraubenschlüssel"; +"strawberry" = "Erdbeere"; +"telephone" = "Telefon"; +"thumbs_up" = "Daumen Hoch"; +"train" = "Zug"; +"tree" = "Baum"; +"trophy" = "Pokal"; +"trumpet" = "Trompete"; +"turtle" = "Schildkröte"; +"umbrella" = "Regenschirm"; +"unicorn" = "Einhorn"; \ No newline at end of file diff --git a/ElementX/Resources/Localizations/en.lproj/SAS.strings b/ElementX/Resources/Localizations/en.lproj/SAS.strings new file mode 100644 index 000000000..d29ccc232 --- /dev/null +++ b/ElementX/Resources/Localizations/en.lproj/SAS.strings @@ -0,0 +1,64 @@ +"aeroplane" = "Aeroplane"; +"anchor" = "Anchor"; +"apple" = "Apple"; +"ball" = "Ball"; +"banana" = "Banana"; +"bell" = "Bell"; +"bicycle" = "Bicycle"; +"book" = "Book"; +"butterfly" = "Butterfly"; +"cactus" = "Cactus"; +"cake" = "Cake"; +"cat" = "Cat"; +"clock" = "Clock"; +"cloud" = "Cloud"; +"corn" = "Corn"; +"dog" = "Dog"; +"elephant" = "Elephant"; +"fire" = "Fire"; +"fish" = "Fish"; +"flag" = "Flag"; +"flower" = "Flower"; +"folder" = "Folder"; +"gift" = "Gift"; +"glasses" = "Glasses"; +"globe" = "Globe"; +"guitar" = "Guitar"; +"hammer" = "Hammer"; +"hat" = "Hat"; +"headphones" = "Headphones"; +"heart" = "Heart"; +"horse" = "Horse"; +"hourglass" = "Hourglass"; +"key" = "Key"; +"light_bulb" = "Light Bulb"; +"lion" = "Lion"; +"lock" = "Lock"; +"moon" = "Moon"; +"mushroom" = "Mushroom"; +"octopus" = "Octopus"; +"panda" = "Panda"; +"paperclip" = "Paperclip"; +"pencil" = "Pencil"; +"penguin" = "Penguin"; +"pig" = "Pig"; +"pin" = "Pin"; +"pizza" = "Pizza"; +"rabbit" = "Rabbit"; +"robot" = "Robot"; +"rocket" = "Rocket"; +"rooster" = "Rooster"; +"santa" = "Santa"; +"scissors" = "Scissors"; +"smiley" = "Smiley"; +"spanner" = "Spanner"; +"strawberry" = "Strawberry"; +"telephone" = "Telephone"; +"thumbs_up" = "Thumbs Up"; +"train" = "Train"; +"tree" = "Tree"; +"trophy" = "Trophy"; +"trumpet" = "Trumpet"; +"turtle" = "Turtle"; +"umbrella" = "Umbrella"; +"unicorn" = "Unicorn"; \ No newline at end of file diff --git a/ElementX/Resources/Localizations/es.lproj/SAS.strings b/ElementX/Resources/Localizations/es.lproj/SAS.strings new file mode 100644 index 000000000..0c7ae9311 --- /dev/null +++ b/ElementX/Resources/Localizations/es.lproj/SAS.strings @@ -0,0 +1,64 @@ +"aeroplane" = "Avión"; +"anchor" = "Ancla"; +"apple" = "Manzana"; +"ball" = "Bola"; +"banana" = "Plátano"; +"bell" = "Campana"; +"bicycle" = "Bicicleta"; +"book" = "Libro"; +"butterfly" = "Mariposa"; +"cactus" = "Cactus"; +"cake" = "Tarta"; +"cat" = "Gato"; +"clock" = "Reloj"; +"cloud" = "Nube"; +"corn" = "Maíz"; +"dog" = "Perro"; +"elephant" = "Elefante"; +"fire" = "Fuego"; +"fish" = "Pez"; +"flag" = "Bandera"; +"flower" = "Flor"; +"folder" = "Carpeta"; +"gift" = "Regalo"; +"glasses" = "Gafas"; +"globe" = "Globo"; +"guitar" = "Guitarra"; +"hammer" = "Martillo"; +"hat" = "Sombrero"; +"headphones" = "Cascos"; +"heart" = "Corazón"; +"horse" = "Caballo"; +"hourglass" = "Reloj de arena"; +"key" = "Llave"; +"light_bulb" = "Bombilla"; +"lion" = "León"; +"lock" = "Candado"; +"moon" = "Luna"; +"mushroom" = "Seta"; +"octopus" = "Pulpo"; +"panda" = "Panda"; +"paperclip" = "Clip"; +"pencil" = "Lápiz"; +"penguin" = "Pingüino"; +"pig" = "Cerdo"; +"pin" = "Alfiler"; +"pizza" = "Pizza"; +"rabbit" = "Conejo"; +"robot" = "Robot"; +"rocket" = "Cohete"; +"rooster" = "Gallo"; +"santa" = "Papá Noel"; +"scissors" = "Tijeras"; +"smiley" = "Emoticono"; +"spanner" = "Llave inglesa"; +"strawberry" = "Fresa"; +"telephone" = "Teléfono"; +"thumbs_up" = "Pulgar arriba"; +"train" = "Tren"; +"tree" = "Árbol"; +"trophy" = "Trofeo"; +"trumpet" = "Trompeta"; +"turtle" = "Tortuga"; +"umbrella" = "Paraguas"; +"unicorn" = "Unicornio"; \ No newline at end of file diff --git a/ElementX/Resources/Localizations/fr.lproj/SAS.strings b/ElementX/Resources/Localizations/fr.lproj/SAS.strings new file mode 100644 index 000000000..47c406118 --- /dev/null +++ b/ElementX/Resources/Localizations/fr.lproj/SAS.strings @@ -0,0 +1,64 @@ +"aeroplane" = "Avion"; +"anchor" = "Ancre"; +"apple" = "Pomme"; +"ball" = "Ballon"; +"banana" = "Banane"; +"bell" = "Cloche"; +"bicycle" = "Vélo"; +"book" = "Livre"; +"butterfly" = "Papillon"; +"cactus" = "Cactus"; +"cake" = "Gâteau"; +"cat" = "Chat"; +"clock" = "Réveil"; +"cloud" = "Nuage"; +"corn" = "Maïs"; +"dog" = "Chien"; +"elephant" = "Éléphant"; +"fire" = "Feu"; +"fish" = "Poisson"; +"flag" = "Drapeau"; +"flower" = "Fleur"; +"folder" = "Dossier"; +"gift" = "Cadeau"; +"glasses" = "Lunettes"; +"globe" = "Globe"; +"guitar" = "Guitare"; +"hammer" = "Marteau"; +"hat" = "Chapeau"; +"headphones" = "Casque audio"; +"heart" = "Cœur"; +"horse" = "Cheval"; +"hourglass" = "Sablier"; +"key" = "Clé"; +"light_bulb" = "Ampoule"; +"lion" = "Lion"; +"lock" = "Cadenas"; +"moon" = "Lune"; +"mushroom" = "Champignon"; +"octopus" = "Poulpe"; +"panda" = "Panda"; +"paperclip" = "Trombone"; +"pencil" = "Crayon"; +"penguin" = "Manchot"; +"pig" = "Cochon"; +"pin" = "Punaise"; +"pizza" = "Pizza"; +"rabbit" = "Lapin"; +"robot" = "Robot"; +"rocket" = "Fusée"; +"rooster" = "Coq"; +"santa" = "Père Noël"; +"scissors" = "Ciseaux"; +"smiley" = "Sourire"; +"spanner" = "Clé à molette"; +"strawberry" = "Fraise"; +"telephone" = "Téléphone"; +"thumbs_up" = "Pouce en l’air"; +"train" = "Train"; +"tree" = "Arbre"; +"trophy" = "Trophée"; +"trumpet" = "Trompette"; +"turtle" = "Tortue"; +"umbrella" = "Parapluie"; +"unicorn" = "Licorne"; \ No newline at end of file diff --git a/ElementX/Resources/Localizations/hu.lproj/SAS.strings b/ElementX/Resources/Localizations/hu.lproj/SAS.strings new file mode 100644 index 000000000..b31544682 --- /dev/null +++ b/ElementX/Resources/Localizations/hu.lproj/SAS.strings @@ -0,0 +1,64 @@ +"aeroplane" = "Repülő"; +"anchor" = "Horgony"; +"apple" = "Alma"; +"ball" = "Labda"; +"banana" = "Banán"; +"bell" = "Harang"; +"bicycle" = "Kerékpár"; +"book" = "Könyv"; +"butterfly" = "Pillangó"; +"cactus" = "Kaktusz"; +"cake" = "Süti"; +"cat" = "Macska"; +"clock" = "Óra"; +"cloud" = "Felhő"; +"corn" = "Kukorica"; +"dog" = "Kutya"; +"elephant" = "Elefánt"; +"fire" = "Tűz"; +"fish" = "Hal"; +"flag" = "Zászló"; +"flower" = "Virág"; +"folder" = "Mappa"; +"gift" = "Ajándék"; +"glasses" = "Szemüveg"; +"globe" = "Földgömb"; +"guitar" = "Gitár"; +"hammer" = "Kalapács"; +"hat" = "Kalap"; +"headphones" = "Fejhallgató"; +"heart" = "Szív"; +"horse" = "Ló"; +"hourglass" = "Homokóra"; +"key" = "Kulcs"; +"light_bulb" = "Égő"; +"lion" = "Oroszlán"; +"lock" = "Lakat"; +"moon" = "Hold"; +"mushroom" = "Gomba"; +"octopus" = "Polip"; +"panda" = "Panda"; +"paperclip" = "Gémkapocs"; +"pencil" = "Ceruza"; +"penguin" = "Pingvin"; +"pig" = "Malac"; +"pin" = "Rajszeg"; +"pizza" = "Pizza"; +"rabbit" = "Nyúl"; +"robot" = "Robot"; +"rocket" = "Rakáta"; +"rooster" = "Kakas"; +"santa" = "Télapó"; +"scissors" = "Olló"; +"smiley" = "Mosoly"; +"spanner" = "Csavarkulcs"; +"strawberry" = "Eper"; +"telephone" = "Telefon"; +"thumbs_up" = "Hüvelykujj fel"; +"train" = "Vonat"; +"tree" = "Fa"; +"trophy" = "Trófea"; +"trumpet" = "Trombita"; +"turtle" = "Teknős"; +"umbrella" = "Esernyő"; +"unicorn" = "Egyszarvú"; \ No newline at end of file diff --git a/ElementX/Resources/Localizations/id.lproj/SAS.strings b/ElementX/Resources/Localizations/id.lproj/SAS.strings new file mode 100644 index 000000000..537ac679d --- /dev/null +++ b/ElementX/Resources/Localizations/id.lproj/SAS.strings @@ -0,0 +1,64 @@ +"aeroplane" = "Pesawat"; +"anchor" = "Jangkar"; +"apple" = "Apel"; +"ball" = "Bola"; +"banana" = "Pisang"; +"bell" = "Lonceng"; +"bicycle" = "Sepeda"; +"book" = "Buku"; +"butterfly" = "Kupu-Kupu"; +"cactus" = "Kaktus"; +"cake" = "Kue"; +"cat" = "Kucing"; +"clock" = "Jam"; +"cloud" = "Awan"; +"corn" = "Jagung"; +"dog" = "Anjing"; +"elephant" = "Gajah"; +"fire" = "Api"; +"fish" = "Ikan"; +"flag" = "Bendera"; +"flower" = "Bunga"; +"folder" = "Map"; +"gift" = "Kado"; +"glasses" = "Kacamata"; +"globe" = "Bola Dunia"; +"guitar" = "Gitar"; +"hammer" = "Palu"; +"hat" = "Topi"; +"headphones" = "Headphone"; +"heart" = "Hati"; +"horse" = "Kuda"; +"hourglass" = "Jam Pasir"; +"key" = "Kunci"; +"light_bulb" = "Bohlam Lampu"; +"lion" = "Singa"; +"lock" = "Gembok"; +"moon" = "Bulan"; +"mushroom" = "Jamur"; +"octopus" = "Gurita"; +"panda" = "Panda"; +"paperclip" = "Klip Kertas"; +"pencil" = "Pensil"; +"penguin" = "Penguin"; +"pig" = "Babi"; +"pin" = "Pin"; +"pizza" = "Pizza"; +"rabbit" = "Kelinci"; +"robot" = "Robot"; +"rocket" = "Roket"; +"rooster" = "Ayam"; +"santa" = "Santa"; +"scissors" = "Gunting"; +"smiley" = "Senyuman"; +"spanner" = "Kunci Bengkel"; +"strawberry" = "Stroberi"; +"telephone" = "Telepon"; +"thumbs_up" = "Jempol"; +"train" = "Kereta Api"; +"tree" = "Pohon"; +"trophy" = "Piala"; +"trumpet" = "Terompet"; +"turtle" = "Kura-Kura"; +"umbrella" = "Payung"; +"unicorn" = "Unicorn"; \ No newline at end of file diff --git a/ElementX/Resources/Localizations/it.lproj/SAS.strings b/ElementX/Resources/Localizations/it.lproj/SAS.strings new file mode 100644 index 000000000..7352305b9 --- /dev/null +++ b/ElementX/Resources/Localizations/it.lproj/SAS.strings @@ -0,0 +1,64 @@ +"aeroplane" = "Aeroplano"; +"anchor" = "Ancora"; +"apple" = "Mela"; +"ball" = "Palla"; +"banana" = "Banana"; +"bell" = "Campana"; +"bicycle" = "Bicicletta"; +"book" = "Libro"; +"butterfly" = "Farfalla"; +"cactus" = "Cactus"; +"cake" = "Torta"; +"cat" = "Gatto"; +"clock" = "Orologio"; +"cloud" = "Nuvola"; +"corn" = "Mais"; +"dog" = "Cane"; +"elephant" = "Elefante"; +"fire" = "Fuoco"; +"fish" = "Pesce"; +"flag" = "Bandiera"; +"flower" = "Fiore"; +"folder" = "Cartella"; +"gift" = "Regalo"; +"glasses" = "Occhiali"; +"globe" = "Globo"; +"guitar" = "Chitarra"; +"hammer" = "Martello"; +"hat" = "Cappello"; +"headphones" = "Cuffie"; +"heart" = "Cuore"; +"horse" = "Cavallo"; +"hourglass" = "Clessidra"; +"key" = "Chiave"; +"light_bulb" = "Lampadina"; +"lion" = "Leone"; +"lock" = "Lucchetto"; +"moon" = "Luna"; +"mushroom" = "Fungo"; +"octopus" = "Polpo"; +"panda" = "Panda"; +"paperclip" = "Graffetta"; +"pencil" = "Matita"; +"penguin" = "Pinguino"; +"pig" = "Maiale"; +"pin" = "Puntina"; +"pizza" = "Pizza"; +"rabbit" = "Coniglio"; +"robot" = "Robot"; +"rocket" = "Razzo"; +"rooster" = "Gallo"; +"santa" = "Babbo Natale"; +"scissors" = "Forbici"; +"smiley" = "Faccina sorridente"; +"spanner" = "Chiave inglese"; +"strawberry" = "Fragola"; +"telephone" = "Telefono"; +"thumbs_up" = "Pollice alzato"; +"train" = "Treno"; +"tree" = "Albero"; +"trophy" = "Trofeo"; +"trumpet" = "Trombetta"; +"turtle" = "Tartaruga"; +"umbrella" = "Ombrello"; +"unicorn" = "Unicorno"; \ No newline at end of file diff --git a/ElementX/Resources/Localizations/ru.lproj/SAS.strings b/ElementX/Resources/Localizations/ru.lproj/SAS.strings new file mode 100644 index 000000000..d6a48b90c --- /dev/null +++ b/ElementX/Resources/Localizations/ru.lproj/SAS.strings @@ -0,0 +1,64 @@ +"aeroplane" = "Самолет"; +"anchor" = "Якорь"; +"apple" = "Яблоко"; +"ball" = "Мяч"; +"banana" = "Банан"; +"bell" = "Колокол"; +"bicycle" = "Велосипед"; +"book" = "Книга"; +"butterfly" = "Бабочка"; +"cactus" = "Кактус"; +"cake" = "Торт"; +"cat" = "Кошка"; +"clock" = "Часы"; +"cloud" = "Облако"; +"corn" = "Кукуруза"; +"dog" = "Собака"; +"elephant" = "Слон"; +"fire" = "Огонь"; +"fish" = "Рыба"; +"flag" = "Флаг"; +"flower" = "Цветок"; +"folder" = "Папка"; +"gift" = "Подарок"; +"glasses" = "Очки"; +"globe" = "Глобус"; +"guitar" = "Гитара"; +"hammer" = "Молоток"; +"hat" = "Шляпа"; +"headphones" = "Наушники"; +"heart" = "Сердце"; +"horse" = "Лошадь"; +"hourglass" = "Песочные часы"; +"key" = "Ключ"; +"light_bulb" = "Лампочка"; +"lion" = "Лев"; +"lock" = "Замок"; +"moon" = "Луна"; +"mushroom" = "Гриб"; +"octopus" = "Осьминог"; +"panda" = "Панда"; +"paperclip" = "Скрепка"; +"pencil" = "Карандаш"; +"penguin" = "Пингвин"; +"pig" = "Свинья"; +"pin" = "Булавка"; +"pizza" = "Пицца"; +"rabbit" = "Кролик"; +"robot" = "Робот"; +"rocket" = "Ракета"; +"rooster" = "Петух"; +"santa" = "Санта"; +"scissors" = "Ножницы"; +"smiley" = "Улыбка"; +"spanner" = "Ключ"; +"strawberry" = "Клубника"; +"telephone" = "Телефон"; +"thumbs_up" = "Большой палец вверх"; +"train" = "Поезд"; +"tree" = "Дерево"; +"trophy" = "Кубок"; +"trumpet" = "Труба"; +"turtle" = "Черепаха"; +"umbrella" = "Зонт"; +"unicorn" = "Единорог"; \ No newline at end of file diff --git a/ElementX/Resources/Localizations/sk.lproj/SAS.strings b/ElementX/Resources/Localizations/sk.lproj/SAS.strings new file mode 100644 index 000000000..c708feb42 --- /dev/null +++ b/ElementX/Resources/Localizations/sk.lproj/SAS.strings @@ -0,0 +1,64 @@ +"aeroplane" = "Lietadlo"; +"anchor" = "Kotva"; +"apple" = "Jablko"; +"ball" = "Lopta"; +"banana" = "Banán"; +"bell" = "Zvonec"; +"bicycle" = "Bicykel"; +"book" = "Kniha"; +"butterfly" = "Motýľ"; +"cactus" = "Kaktus"; +"cake" = "Torta"; +"cat" = "Mačka"; +"clock" = "Budík"; +"cloud" = "Oblak"; +"corn" = "Kukurica"; +"dog" = "Pes"; +"elephant" = "Slon"; +"fire" = "Oheň"; +"fish" = "Ryba"; +"flag" = "Zástava"; +"flower" = "Kvet"; +"folder" = "Fascikel"; +"gift" = "Darček"; +"glasses" = "Okuliare"; +"globe" = "Zemeguľa"; +"guitar" = "Gitara"; +"hammer" = "Kladivo"; +"hat" = "Klobúk"; +"headphones" = "Slúchadlá"; +"heart" = "Srdce"; +"horse" = "Kôň"; +"hourglass" = "Presýpacie hodiny"; +"key" = "Kľúč"; +"light_bulb" = "Žiarovka"; +"lion" = "Lev"; +"lock" = "Zámka"; +"moon" = "Mesiac"; +"mushroom" = "Huba"; +"octopus" = "Chobotnica"; +"panda" = "Panda"; +"paperclip" = "Kancelárska sponka"; +"pencil" = "Ceruzka"; +"penguin" = "Tučniak"; +"pig" = "Prasa"; +"pin" = "Špendlík"; +"pizza" = "Pizza"; +"rabbit" = "Zajac"; +"robot" = "Robot"; +"rocket" = "Raketa"; +"rooster" = "Kohút"; +"santa" = "Mikuláš"; +"scissors" = "Nožnice"; +"smiley" = "Smajlík"; +"spanner" = "Vidlicový kľúč"; +"strawberry" = "Jahoda"; +"telephone" = "Telefón"; +"thumbs_up" = "Palec nahor"; +"train" = "Vlak"; +"tree" = "Strom"; +"trophy" = "Trofej"; +"trumpet" = "Trúbka"; +"turtle" = "Korytnačka"; +"umbrella" = "Dáždnik"; +"unicorn" = "Jednorožec"; \ No newline at end of file diff --git a/ElementX/Sources/Generated/Strings+SAS.swift b/ElementX/Sources/Generated/Strings+SAS.swift new file mode 100644 index 000000000..a127e6262 --- /dev/null +++ b/ElementX/Sources/Generated/Strings+SAS.swift @@ -0,0 +1,27 @@ +import Foundation + +enum SASL10n { + static func localizedDescription(for key: String) -> String { + tr("SAS", key) + } + + private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String { + // Use preferredLocalizations to get a language that is in the bundle and the user's preferred list of languages. + let languages = Bundle.overrideLocalizations ?? Bundle.app.preferredLocalizations + + for language in languages { + if let translation = trIn(language, table, key, args) { + return translation + } + } + return Bundle.app.developmentLocalization.flatMap { trIn($0, table, key, args) } ?? key + } + + private static func trIn(_ language: String, _ table: String, _ key: String, _ args: CVarArg...) -> String? { + guard let bundle = Bundle.lprojBundle(for: language) else { return nil } + let format = NSLocalizedString(key, tableName: table, bundle: bundle, comment: "") + let translation = String(format: format, locale: Locale(identifier: language), arguments: args) + guard translation != key else { return nil } + return translation + } +} diff --git a/ElementX/Sources/Screens/SessionVerificationScreen/View/SessionVerificationScreen.swift b/ElementX/Sources/Screens/SessionVerificationScreen/View/SessionVerificationScreen.swift index 910203d39..034a39cbb 100644 --- a/ElementX/Sources/Screens/SessionVerificationScreen/View/SessionVerificationScreen.swift +++ b/ElementX/Sources/Screens/SessionVerificationScreen/View/SessionVerificationScreen.swift @@ -204,7 +204,7 @@ struct SessionVerificationScreen: View { VStack(spacing: 16.0) { Text(emoji.symbol) .font(.compound.headingXLBold) - Text(emoji.description) + Text(emoji.localizedDescription) .font(.compound.bodyMD) .foregroundColor(.compound.textSecondary) } diff --git a/ElementX/Sources/Services/SessionVerification/SessionVerificationControllerProxyProtocol.swift b/ElementX/Sources/Services/SessionVerification/SessionVerificationControllerProxyProtocol.swift index 4d301a872..6d2e5adbb 100644 --- a/ElementX/Sources/Services/SessionVerification/SessionVerificationControllerProxyProtocol.swift +++ b/ElementX/Sources/Services/SessionVerification/SessionVerificationControllerProxyProtocol.swift @@ -38,6 +38,10 @@ enum SessionVerificationControllerProxyCallback { struct SessionVerificationEmoji: Hashable { let symbol: String let description: String + + var localizedDescription: String { + SASL10n.localizedDescription(for: description) + } } // sourcery: AutoMockable diff --git a/Tools/Sources/GenerateSAS.swift b/Tools/Sources/GenerateSAS.swift new file mode 100644 index 000000000..7d6aab276 --- /dev/null +++ b/Tools/Sources/GenerateSAS.swift @@ -0,0 +1,106 @@ +import ArgumentParser +import Foundation + +struct GenerateSAS: ParsableCommand { + static var configuration = CommandConfiguration(abstract: "A tool to download and generate SAS localization strings") + private static let defaultLanguage = "en" + + @Flag(name: .shortAndLong, help: "Increase output verbosity.") + var verbose = false + + func run() throws { + let baseURL = URL(string: "https://raw.githubusercontent.com/matrix-org/matrix-spec/main/data-definitions/sas-emoji.json")! + + printIfVerbose("Argument:") + printIfVerbose(self) + + print("Downloading \(baseURL.absoluteString)…") + + guard let data = try? Data(contentsOf: baseURL), + let json = try? JSONDecoder().decode([SASEmoji].self, from: data) else { + print("Failed to download or parse JSON.") + return + } + + printIfVerbose("Json data:") + printIfVerbose(json) + + var defaultTranslations = [String: String]() + var cumulativeTranslations = [String: [String: String]]() + + cumulativeTranslations[Self.defaultLanguage] = [String: String]() + for emoji in json { + let description = emoji.description + + printIfVerbose("Description: \(description)") + + defaultTranslations[description] = description + + let translations = emoji.translatedDescriptions + // en is not included since is the default language so we need to add it ourselves + cumulativeTranslations[Self.defaultLanguage]![description] = description + for (lang, translation) in translations { + printIfVerbose("Lang: \(lang)") + + if cumulativeTranslations[lang] == nil { + cumulativeTranslations[lang] = [String: String]() + } + + cumulativeTranslations[lang]![description] = translation + } + } + + printIfVerbose(defaultTranslations) + printIfVerbose(cumulativeTranslations) + + for (lang, translations) in cumulativeTranslations { + let iosLang = lang + .replacingOccurrences(of: "_", with: "-") + .appending(".lproj") + + writeToFile(file: "SAS.strings", dict: translations, subdirectory: iosLang) + } + + print("Write completed") + } + + private func writeToFile(file: String, dict: [String: String], subdirectory: String) { + let projectDirectory = Utilities.projectDirectoryURL + let fileDirectory = projectDirectory.appendingPathComponent("ElementX/Resources/Localizations").appendingPathComponent(subdirectory) + + let filePath = fileDirectory.appendingPathComponent(file) + + print("Writing file \(filePath.path)") + + printIfVerbose("With") + printIfVerbose(dict) + + do { + // This will fail if the .lproj dir does not exist already, which is fine since we don't want to add translations for unsupported languages. + try dict + .sorted(by: { $0.key < $1.key }) + .map { "\"\($0.key.lowercased().replacingOccurrences(of: " ", with: "_"))\" = \"\($0.value)\";" } + .joined(separator: "\n") + .write(to: filePath, atomically: true, encoding: .utf8) + } catch { + print("Failed to write file \(filePath.path): \(error)") + } + } + + private struct SASEmoji: Codable { + let number: Int + let emoji, description, unicode: String + let translatedDescriptions: [String: String?] + + enum CodingKeys: String, CodingKey { + case number, emoji, description, unicode + case translatedDescriptions = "translated_descriptions" + } + } + + private func printIfVerbose(_ items: Any...) { + if verbose { + print(items) + } + } +} diff --git a/Tools/Sources/Tools.swift b/Tools/Sources/Tools.swift index bfe32f27a..2c7586d47 100644 --- a/Tools/Sources/Tools.swift +++ b/Tools/Sources/Tools.swift @@ -9,5 +9,6 @@ struct Tools: ParsableCommand { OutdatedPackages.self, DownloadStrings.self, Locheck.self, - GenerateSDKMocks.self]) + GenerateSDKMocks.self, + GenerateSAS.self]) }