Add es-419 and finish adding support for the translations

Added Latin American Spanish (probably not the best translation)

Made everything reference the swiftgen stuff rather than having strings
This commit is contained in:
bogotesr
2022-12-24 21:06:28 -07:00
committed by Fabian Thies
parent 47e47fb3cf
commit 3be0a4a89c
15 changed files with 499 additions and 81 deletions

View File

@@ -34,7 +34,6 @@
1F6284D5295209DA0060AAD8 /* AppAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F6284D4295209DA0060AAD8 /* AppAction.swift */; };
1F6284D7295218980060AAD8 /* DocumentPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F6284D6295218980060AAD8 /* DocumentPicker.swift */; };
1F6284D929523D340060AAD8 /* SideloadingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F6284D829523D340060AAD8 /* SideloadingManager.swift */; };
1F6284DB295254C80060AAD8 /* AppScreenshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F6284DA295254C80060AAD8 /* AppScreenshot.swift */; };
1F66F5BA2938CA5700A910CA /* VisualEffectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F66F5B92938CA5700A910CA /* VisualEffectView.swift */; };
1F66F5BC2938F03700A910CA /* Modifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F66F5BB2938F03700A910CA /* Modifiers.swift */; };
1F66F5BE2938F06100A910CA /* StoreApp+Filterable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F66F5BD2938F06100A910CA /* StoreApp+Filterable.swift */; };
@@ -574,7 +573,6 @@
1F6284D4295209DA0060AAD8 /* AppAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppAction.swift; sourceTree = "<group>"; };
1F6284D6295218980060AAD8 /* DocumentPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentPicker.swift; sourceTree = "<group>"; };
1F6284D829523D340060AAD8 /* SideloadingManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SideloadingManager.swift; sourceTree = "<group>"; };
1F6284DA295254C80060AAD8 /* AppScreenshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppScreenshot.swift; sourceTree = "<group>"; };
1F66F5B92938CA5700A910CA /* VisualEffectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisualEffectView.swift; sourceTree = "<group>"; };
1F66F5BB2938F03700A910CA /* Modifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Modifiers.swift; sourceTree = "<group>"; };
1F66F5BD2938F06100A910CA /* StoreApp+Filterable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StoreApp+Filterable.swift"; sourceTree = "<group>"; };
@@ -944,6 +942,7 @@
D5F2F6A82720B7C20081CCF5 /* PatchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PatchViewController.swift; sourceTree = "<group>"; };
D5F99A1728D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore10ToAltStore11.xcmappingmodel; sourceTree = "<group>"; };
D5F99A1928D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreApp10ToStoreApp11Policy.swift; sourceTree = "<group>"; };
DFEE02F82957998D00518C34 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/Localizable.strings"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -1203,7 +1202,6 @@
1FB96FBD292A20E5007E68D1 /* ObservableScrollView.swift */,
1FB96FBF292A63F2007E68D1 /* AppPillButton.swift */,
1F0DD8422936B0F9007608A4 /* RoundedTextField.swift */,
1F6284DA295254C80060AAD8 /* AppScreenshot.swift */,
);
path = "View Components";
sourceTree = "<group>";
@@ -2332,6 +2330,7 @@
knownRegions = (
en,
Base,
"es-419",
);
mainGroup = BFD247612284B9A500981D42;
packageReferences = (
@@ -2773,7 +2772,6 @@
1F943C712927F90400ABE095 /* MyAppsView.swift in Sources */,
1FA1C8CA294906890083119D /* MyAppsViewModel.swift in Sources */,
BF3BEFC124086A1E00DE7D55 /* RefreshAppOperation.swift in Sources */,
1F6284DB295254C80060AAD8 /* AppScreenshot.swift in Sources */,
BFE60740231AFD2A002B0E8E /* InsetGroupTableViewCell.swift in Sources */,
BF0DCA662433BDF500E3A595 /* AnalyticsManager.swift in Sources */,
BFCCB51A245E3401001853EA /* VerifyAppOperation.swift in Sources */,
@@ -2936,6 +2934,7 @@
isa = PBXVariantGroup;
children = (
1F07F551295455A300F7BE95 /* en */,
DFEE02F82957998D00518C34 /* es-419 */,
);
name = Localizable.strings;
sourceTree = "<group>";
@@ -3411,6 +3410,7 @@
baseConfigurationReference = B3C39607284F4C8400DA9E2F /* Build.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -3479,6 +3479,7 @@
baseConfigurationReference = B3C39607284F4C8400DA9E2F /* Build.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";

View File

@@ -10,6 +10,68 @@ import Foundation
// swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length
// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
internal enum L10n {
internal enum AddSourceView {
/// Continue
internal static let `continue` = L10n.tr("Localizable", "AddSourceView.continue", fallback: "Continue")
/// AddSourceView
internal static let sourceURL = L10n.tr("Localizable", "AddSourceView.sourceURL", fallback: "Source URL")
/// Please enter the source url here. Then, tap continue to validate and add the source in the next step.
internal static let sourceWarning = L10n.tr("Localizable", "AddSourceView.sourceWarning", fallback: "Please enter the source url here. Then, tap continue to validate and add the source in the next step.")
/// Be careful with unvalidated third-party sources! Make sure to only add sources that you trust.
internal static let sourceWarningContinued = L10n.tr("Localizable", "AddSourceView.sourceWarningContinued", fallback: "Be careful with unvalidated third-party sources! Make sure to only add sources that you trust.")
/// Add Source
internal static let title = L10n.tr("Localizable", "AddSourceView.title", fallback: "Add Source")
}
internal enum AppAction {
/// Activate
internal static let activate = L10n.tr("Localizable", "AppAction.activate", fallback: "Activate")
/// Backup
internal static let backup = L10n.tr("Localizable", "AppAction.backup", fallback: "Backup")
/// Customize icon
internal static let chooseCustomIcon = L10n.tr("Localizable", "AppAction.chooseCustomIcon", fallback: "Customize icon")
/// Deactivate
internal static let deactivate = L10n.tr("Localizable", "AppAction.deactivate", fallback: "Deactivate")
/// Activate JIT
internal static let enableJIT = L10n.tr("Localizable", "AppAction.enableJIT", fallback: "Activate JIT")
/// Export backup
internal static let exportBackup = L10n.tr("Localizable", "AppAction.exportBackup", fallback: "Export backup")
/// AppAction
internal static let install = L10n.tr("Localizable", "AppAction.install", fallback: "Install")
/// Open
internal static let `open` = L10n.tr("Localizable", "AppAction.open", fallback: "Open")
/// Refresh
internal static let refresh = L10n.tr("Localizable", "AppAction.refresh", fallback: "Refresh")
/// Remove
internal static let remove = L10n.tr("Localizable", "AppAction.remove", fallback: "Remove")
/// Reset icon
internal static let resetIcon = L10n.tr("Localizable", "AppAction.resetIcon", fallback: "Reset icon")
/// Restore backup
internal static let restoreBackup = L10n.tr("Localizable", "AppAction.restoreBackup", fallback: "Restore backup")
}
internal enum AppDetailView {
/// AppDetailView
internal static let more = L10n.tr("Localizable", "AppDetailView.more", fallback: "More...")
/// The app requires no permissions.
internal static let noPermissions = L10n.tr("Localizable", "AppDetailView.noPermissions", fallback: "The app requires no permissions.")
/// No version information
internal static let noVersionInformation = L10n.tr("Localizable", "AppDetailView.noVersionInformation", fallback: "No version information")
/// Permissions
internal static let permissions = L10n.tr("Localizable", "AppDetailView.permissions", fallback: "Permissions")
/// Version
internal static let version = L10n.tr("Localizable", "AppDetailView.version", fallback: "Version")
/// What's New
internal static let whatsNew = L10n.tr("Localizable", "AppDetailView.whatsNew", fallback: "What's New")
}
internal enum AppPermissionGrid {
/// AppPermissionGrid
internal static let usageDescription = L10n.tr("Localizable", "AppPermissionGrid.usageDescription", fallback: "Usage Description")
}
internal enum AppPillButton {
/// AppPillButton
internal static let free = L10n.tr("Localizable", "AppPillButton.free", fallback: "Free")
/// Open
internal static let `open` = L10n.tr("Localizable", "AppPillButton.open", fallback: "Open")
}
internal enum BrowseView {
/// Search
internal static let search = L10n.tr("Localizable", "BrowseView.search", fallback: "Search")
@@ -19,6 +81,11 @@ internal enum L10n {
/// Sources
internal static let sources = L10n.tr("Localizable", "BrowseView.Actions.sources", fallback: "Sources")
}
internal enum Categories {
/// Games and
/// Emulators
internal static let gamesAndEmulators = L10n.tr("Localizable", "BrowseView.Categories.gamesAndEmulators", fallback: "Games and\nEmulators")
}
internal enum Section {
internal enum AllApps {
/// All Apps
@@ -32,6 +99,64 @@ internal enum L10n {
}
}
}
internal enum ConfirmAddSourceView {
/// Add Source
internal static let addSource = L10n.tr("Localizable", "ConfirmAddSourceView.addSource", fallback: "Add Source")
/// ConfirmAddSourceView
internal static let apps = L10n.tr("Localizable", "ConfirmAddSourceView.apps", fallback: "Apps")
/// News Items
internal static let newsItems = L10n.tr("Localizable", "ConfirmAddSourceView.newsItems", fallback: "News Items")
/// Source Contents
internal static let sourceContents = L10n.tr("Localizable", "ConfirmAddSourceView.sourceContents", fallback: "Source Contents")
/// Source Identifier
internal static let sourceIdentifier = L10n.tr("Localizable", "ConfirmAddSourceView.sourceIdentifier", fallback: "Source Identifier")
/// Source Information
internal static let sourceInfo = L10n.tr("Localizable", "ConfirmAddSourceView.sourceInfo", fallback: "Source Information")
/// Source URL
internal static let sourceURL = L10n.tr("Localizable", "ConfirmAddSourceView.sourceURL", fallback: "Source URL")
}
internal enum ConnectAppleIDView {
/// Apple ID
internal static let appleID = L10n.tr("Localizable", "ConnectAppleIDView.appleID", fallback: "Apple ID")
/// Cancel
internal static let cancel = L10n.tr("Localizable", "ConnectAppleIDView.cancel", fallback: "Cancel")
/// Connect Your Apple ID
internal static let connectYourAppleID = L10n.tr("Localizable", "ConnectAppleIDView.connectYourAppleID", fallback: "Connect Your Apple ID")
/// Failed to Sign In
internal static let failedToSignIn = L10n.tr("Localizable", "ConnectAppleIDView.failedToSignIn", fallback: "Failed to Sign In")
/// Your Apple ID is used to configure apps so they can be installed on this device. Your credentials will be stored securely in this device's Keychain and sent only to Apple for authentication.
internal static let footer = L10n.tr("Localizable", "ConnectAppleIDView.footer", fallback: "Your Apple ID is used to configure apps so they can be installed on this device. Your credentials will be stored securely in this device's Keychain and sent only to Apple for authentication.")
/// Password
internal static let password = L10n.tr("Localizable", "ConnectAppleIDView.password", fallback: "Password")
/// Sign In
internal static let signIn = L10n.tr("Localizable", "ConnectAppleIDView.signIn", fallback: "Sign In")
/// ConnectAppleIDView
internal static let startWithSignIn = L10n.tr("Localizable", "ConnectAppleIDView.startWithSignIn", fallback: "Sign in with your Apple ID to get started.")
/// Why do we need this?
internal static let whyDoWeNeedThis = L10n.tr("Localizable", "ConnectAppleIDView.whyDoWeNeedThis", fallback: "Why do we need this?")
}
internal enum MyAppsView {
/// MyAppsView
internal static let active = L10n.tr("Localizable", "MyAppsView.active", fallback: "Active")
/// App IDs Remaining
internal static let appIDsRemaining = L10n.tr("Localizable", "MyAppsView.appIDsRemaining", fallback: "App IDs Remaining")
/// apps
internal static let apps = L10n.tr("Localizable", "MyAppsView.apps", fallback: "apps")
/// Failed to refresh
internal static let failedToRefresh = L10n.tr("Localizable", "MyAppsView.failedToRefresh", fallback: "Failed to refresh")
/// My Apps
internal static let myApps = L10n.tr("Localizable", "MyAppsView.myApps", fallback: "My Apps")
/// No Updates Available
internal static let noUpdatesAvailable = L10n.tr("Localizable", "MyAppsView.noUpdatesAvailable", fallback: "No Updates Available")
/// Refresh All
internal static let refreshAll = L10n.tr("Localizable", "MyAppsView.refreshAll", fallback: "Refresh All")
/// Active
internal static let remainingAppID = L10n.tr("Localizable", "MyAppsView.remainingAppID", fallback: "Active")
/// Sideloading in progress...
internal static let sideloading = L10n.tr("Localizable", "MyAppsView.sideloading", fallback: "Sideloading in progress...")
/// Keep this lowercase
internal static let viewAppIDs = L10n.tr("Localizable", "MyAppsView.viewAppIDs", fallback: "View App IDs")
}
internal enum NewsView {
/// NewsView
internal static let title = L10n.tr("Localizable", "NewsView.title", fallback: "News")
@@ -42,6 +167,72 @@ internal enum L10n {
}
}
}
internal enum RootView {
/// Browse
internal static let browse = L10n.tr("Localizable", "RootView.browse", fallback: "Browse")
/// My Apps
internal static let myApps = L10n.tr("Localizable", "RootView.myApps", fallback: "My Apps")
/// RootView
internal static let news = L10n.tr("Localizable", "RootView.news", fallback: "News")
/// Settings
internal static let settings = L10n.tr("Localizable", "RootView.settings", fallback: "Settings")
}
internal enum SettingsView {
/// Add to Siri...
internal static let addToSiri = L10n.tr("Localizable", "SettingsView.addToSiri", fallback: "Add to Siri...")
/// Background Refresh
internal static let backgroundRefresh = L10n.tr("Localizable", "SettingsView.backgroundRefresh", fallback: "Background Refresh")
/// Connect your Apple ID
internal static let connectAppleID = L10n.tr("Localizable", "SettingsView.connectAppleID", fallback: "Connect your Apple ID")
/// Credits
internal static let credits = L10n.tr("Localizable", "SettingsView.credits", fallback: "Credits")
/// Debug
internal static let debug = L10n.tr("Localizable", "SettingsView.debug", fallback: "Debug")
/// Refreshing Apps
internal static let refreshingApps = L10n.tr("Localizable", "SettingsView.refreshingApps", fallback: "Refreshing Apps")
/// Enable Background Refresh to automatically refresh apps in the background when connected to WiFi and with Wireguard active.
internal static let refreshingAppsFooter = L10n.tr("Localizable", "SettingsView.refreshingAppsFooter", fallback: "Enable Background Refresh to automatically refresh apps in the background when connected to WiFi and with Wireguard active.")
/// Reset Image Cache
internal static let resetImageCache = L10n.tr("Localizable", "SettingsView.resetImageCache", fallback: "Reset Image Cache")
/// SwiftUI Redesign
internal static let swiftUIRedesign = L10n.tr("Localizable", "SettingsView.swiftUIRedesign", fallback: "SwiftUI Redesign")
/// Switch to UIKit
internal static let switchToUIKit = L10n.tr("Localizable", "SettingsView.switchToUIKit", fallback: "Switch to UIKit")
/// Settings
internal static let title = L10n.tr("Localizable", "SettingsView.title", fallback: "Settings")
internal enum ConnectedAppleID {
/// E-Mail
internal static let eMail = L10n.tr("Localizable", "SettingsView.ConnectedAppleID.eMail", fallback: "E-Mail")
/// SettingsView
internal static let name = L10n.tr("Localizable", "SettingsView.ConnectedAppleID.name", fallback: "Name")
/// Sign Out
internal static let signOut = L10n.tr("Localizable", "SettingsView.ConnectedAppleID.signOut", fallback: "Sign Out")
/// Connected Apple ID
internal static let text = L10n.tr("Localizable", "SettingsView.ConnectedAppleID.text", fallback: "Connected Apple ID")
/// Type
internal static let type = L10n.tr("Localizable", "SettingsView.ConnectedAppleID.type", fallback: "Type")
internal enum Footer {
/// Your Apple ID is required to sign the apps you install with SideStore.
internal static let p1 = L10n.tr("Localizable", "SettingsView.ConnectedAppleID.Footer.p1", fallback: "Your Apple ID is required to sign the apps you install with SideStore.")
/// Your credentials are only sent to Apple's servers and are not accessible by the SideStore Team. Once successfully logged in, the login details are stored securely on your device.
internal static let p2 = L10n.tr("Localizable", "SettingsView.ConnectedAppleID.Footer.p2", fallback: "Your credentials are only sent to Apple's servers and are not accessible by the SideStore Team. Once successfully logged in, the login details are stored securely on your device.")
}
}
}
internal enum SourcesView {
/// Done
internal static let done = L10n.tr("Localizable", "SourcesView.done", fallback: "Done")
/// Remove
internal static let remove = L10n.tr("Localizable", "SourcesView.remove", fallback: "Remove")
/// SideStore has reviewed these sources to make sure they meet our safety standards.
internal static let reviewedText = L10n.tr("Localizable", "SourcesView.reviewedText", fallback: "SideStore has reviewed these sources to make sure they meet our safety standards.")
/// Sources
internal static let sources = L10n.tr("Localizable", "SourcesView.sources", fallback: "Sources")
/// SourcesView
internal static let sourcesDescription = L10n.tr("Localizable", "SourcesView.sourcesDescription", fallback: "Sources control what apps are available to download through SideStore.")
/// Trusted Sources
internal static let trustedSources = L10n.tr("Localizable", "SourcesView.trustedSources", fallback: "Trusted Sources")
}
}
// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length
// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces

View File

@@ -19,3 +19,106 @@
"BrowseView.Section.PromotedCategories.showAll" = "Show all";
"BrowseView.Section.AllApps.title" = "All Apps";
"BrowseView.Actions.sources" = "Sources";
"BrowseView.Categories.gamesAndEmulators" = "Games and\nEmulators";
/* RootView */
"RootView.news" = "News";
"RootView.browse" = "Browse";
"RootView.myApps" = "My Apps";
"RootView.settings" = "Settings";
/* SettingsView */
"SettingsView.ConnectedAppleID.name" = "Name";
"SettingsView.ConnectedAppleID.eMail" = "E-Mail";
"SettingsView.ConnectedAppleID.type" = "Type";
"SettingsView.ConnectedAppleID.text" = "Connected Apple ID";
"SettingsView.ConnectedAppleID.signOut" = "Sign Out";
"SettingsView.ConnectedAppleID.Footer.p1" = "Your Apple ID is required to sign the apps you install with SideStore.";
"SettingsView.ConnectedAppleID.Footer.p2" = "Your credentials are only sent to Apple's servers and are not accessible by the SideStore Team. Once successfully logged in, the login details are stored securely on your device.";
"SettingsView.connectAppleID" = "Connect your Apple ID";
"SettingsView.backgroundRefresh" = "Background Refresh";
"SettingsView.addToSiri" = "Add to Siri...";
"SettingsView.refreshingApps" = "Refreshing Apps";
"SettingsView.switchToUIKit" = "Switch to UIKit";
"SettingsView.resetImageCache" = "Reset Image Cache";
"SettingsView.debug" = "Debug";
"SettingsView.swiftUIRedesign" = "SwiftUI Redesign";
"SettingsView.credits" = "Credits";
"SettingsView.title" = "Settings";
"SettingsView.refreshingAppsFooter" = "Enable Background Refresh to automatically refresh apps in the background when connected to WiFi and with Wireguard active.";
/* ConnectAppleIDView */
"ConnectAppleIDView.startWithSignIn" = "Sign in with your Apple ID to get started.";
"ConnectAppleIDView.signIn" = "Sign In";
"ConnectAppleIDView.appleID" = "Apple ID";
"ConnectAppleIDView.password" = "Password";
"ConnectAppleIDView.whyDoWeNeedThis" = "Why do we need this?";
"ConnectAppleIDView.footer" = "Your Apple ID is used to configure apps so they can be installed on this device. Your credentials will be stored securely in this device's Keychain and sent only to Apple for authentication.";
"ConnectAppleIDView.connectYourAppleID" = "Connect Your Apple ID";
"ConnectAppleIDView.cancel" = "Cancel";
"ConnectAppleIDView.failedToSignIn" = "Failed to Sign In";
/* SourcesView */
"SourcesView.sourcesDescription" = "Sources control what apps are available to download through SideStore.";
"SourcesView.remove" = "Remove";
"SourcesView.trustedSources" = "Trusted Sources";
"SourcesView.reviewedText" = "SideStore has reviewed these sources to make sure they meet our safety standards.";
"SourcesView.sources" = "Sources";
"SourcesView.done" = "Done";
/* AddSourceView */
"AddSourceView.sourceURL" = "Source URL";
"AddSourceView.sourceWarning" = "Please enter the source url here. Then, tap continue to validate and add the source in the next step.";
"AddSourceView.sourceWarningContinued" = "Be careful with unvalidated third-party sources! Make sure to only add sources that you trust.";
"AddSourceView.continue" = "Continue";
"AddSourceView.title" = "Add Source";
/* ConfirmAddSourceView */
"ConfirmAddSourceView.apps" = "Apps";
"ConfirmAddSourceView.newsItems" = "News Items";
"ConfirmAddSourceView.sourceContents" = "Source Contents";
"ConfirmAddSourceView.sourceIdentifier" = "Source Identifier";
"ConfirmAddSourceView.sourceURL" = "Source URL";
"ConfirmAddSourceView.sourceInfo" = "Source Information";
"ConfirmAddSourceView.addSource" = "Add Source";
/* AppPillButton */
"AppPillButton.free" = "Free";
"AppPillButton.open" = "Open";
/* AppAction */
"AppAction.install" = "Install";
"AppAction.open" = "Open";
"AppAction.refresh" = "Refresh";
"AppAction.activate" = "Activate";
"AppAction.deactivate" = "Deactivate";
"AppAction.remove" = "Remove";
"AppAction.enableJIT" = "Activate JIT";
"AppAction.backup" = "Backup";
"AppAction.exportBackup" = "Export backup";
"AppAction.restoreBackup" = "Restore backup";
"AppAction.chooseCustomIcon" = "Customize icon";
"AppAction.resetIcon" = "Reset icon";
/* AppDetailView*/
"AppDetailView.more" = "More...";
"AppDetailView.whatsNew" = "What's New";
"AppDetailView.version" = "Version";
"AppDetailView.noVersionInformation" = "No version information";
"AppDetailView.noPermissions" = "The app requires no permissions.";
"AppDetailView.permissions" = "Permissions";
/* AppPermissionGrid */
"AppPermissionGrid.usageDescription" = "Usage Description";
/* MyAppsView */
"MyAppsView.active" = "Active";
"MyAppsView.sideloading" = "Sideloading in progress...";
"MyAppsView.refreshAll" = "Refresh All";
"MyAppsView.appIDsRemaining" = "App IDs Remaining";
"MyAppsView.noUpdatesAvailable" = "No Updates Available";
"MyAppsView.failedToRefresh" = "Failed to refresh";
"MyAppsView.apps" = "apps"; /* Keep this lowercase */
"MyAppsView.viewAppIDs" = "View App IDs";
"MyAppsView.myApps" = "My Apps";

View File

@@ -0,0 +1,123 @@
/*
Localizable.strings
AltStore
Created by Joshua Laymon on 23.12.22.
Copyright © 2022 SideStore. All rights reserved.
*/
/* NewsView */
"NewsView.title" = "Noticias";
"NewsView.Section.FromSources.title" = "De Tus Fuentes";
/* BrowseView */
"BrowseView.title" = "Navegar";
"BrowseView.search" = "Buscar";
"BrowseView.Section.PromotedCategories.title" = "Categorías Promocionadas";
"BrowseView.Section.PromotedCategories.showAll" = "Ver todos";
"BrowseView.Section.AllApps.title" = "Todos de las Aplicaciones";
"BrowseView.Actions.sources" = "Fuentes";
"BrowseView.Categories.gamesAndEmulators" = "Juegos y\nEmuladores";
/* RootView */
"RootView.news" = "Noticias";
"RootView.browse" = "Navegar";
"RootView.myApps" = "Mis Apps";
"RootView.settings" = "Configuración";
/* SettingsView */
"SettingsView.ConnectedAppleID.name" = "Nombre";
"SettingsView.ConnectedAppleID.eMail" = "Correo electrónico";
"SettingsView.ConnectedAppleID.type" = "Tipo";
"SettingsView.ConnectedAppleID.text" = "Apple ID conectado";
"SettingsView.ConnectedAppleID.signOut" = "Cerrar sesión";
"SettingsView.ConnectedAppleID.Footer.p1" = "Se requiere de su Apple ID para firmar las aplicaciones que se instalan con SideStore.";
"SettingsView.ConnectedAppleID.Footer.p2" = "Sus datos son enviados solamente a Apple, SideStore Team no tiene acceso alguno a sus credenciales. Los detalles del inicio de sesión serán guardadas de forma segura en su dispositivo después de haber iniciado sesión exitosamente.";
"SettingsView.connectAppleID" = "Inicia sesión con un Apple ID";
"SettingsView.backgroundRefresh" = "Refrescar en segundo plano";
"SettingsView.addToSiri" = "Agregar a Siri...";
"SettingsView.refreshingApps" = "Refrescando las aplicaciones";
"SettingsView.switchToUIKit" = "Cambiar a UIKit";
"SettingsView.resetImageCache" = "Borrar el caché de imagenes";
"SettingsView.debug" = "Depurar";
"SettingsView.swiftUIRedesign" = "Rediseño de SwiftUI";
"SettingsView.credits" = "Créditos";
"SettingsView.title" = "Configuración";
"SettingsView.refreshingAppsFooter" = "Active el refresco en segundo plano para que las aplicaciones sean refrescadas automáticamente cuando estés conectado a una red Wi-Fi y tengas a WireGuard activado.";
/* ConnectAppleIDView */
"ConnectAppleIDView.startWithSignIn" = "Inicia sesión con su Apple ID para comenzar.";
"ConnectAppleIDView.signIn" = "Inicia sesión";
"ConnectAppleIDView.password" = "Contraseña";
"ConnectAppleIDView.whyDoWeNeedThis" = "¿Por qué necesitamos esto?";
"ConnectAppleIDView.footer" = "Su Apple ID es usa para configurar las aplicaciones para instalar en su dispositivo. Los detalles del inicio de sesión serán guardadas de forma segura en su dispositivo y son enviados solomente a Apple para autenticación.";
"ConnectAppleIDView.connectYourAppleID" = "Conectar su Apple ID";
"ConnectAppleIDView.cancel" = "Cancelar";
"ConnectAppleIDView.failedToSignIn" = "No Pude iniciar sesión";
/* SourcesView */
"SourcesView.sourcesDescription" = "Los fuentes controlan las aplicaciones que están disponibles a travès de SideStore.";
"SourcesView.remove" = "Eliminar";
"SourcesView.trustedSources" = "Fuentes Confianza";
"SourcesView.reviewedText" = "SideStore Team ha reseñado estas fuentes para asegurarse que seguras.";
"SourcesView.sources" = "Fuentes";
"SourcesView.done" = "Listo";
/* AddSourceView */
"AddSourceView.sourceURL" = "URL de fuente";
"AddSourceView.sourceWarning" = "Introduce el URL de fuente aquí. Luego, toca \"Continuar\" para validar y agregar la fuente en el siguiente paso.";
"AddSourceView.sourceWarningContinued" = "Ten cuidado con las fuentes de un tercero. Solo debe agregar fuentes en las que confíe.";
"AddSourceView.continue" = "Continuar";
"AddSourceView.title" = "Agregar Fuente";
/* ConfirmAddSourceView */
"ConfirmAddSourceView.apps" = "Aplicaciones";
"ConfirmAddSourceView.newsItems" = "Noticias";
"ConfirmAddSourceView.sourceContents" = "Contenidos de fuente";
"ConfirmAddSourceView.sourceIdentifier" = "Identificador de fuente";
"ConfirmAddSourceView.sourceURL" = "URL de fuente";
"ConfirmAddSourceView.sourceInfo" = "Información de fuente";
"ConfirmAddSourceView.addSource" = "Agregar Fuente";
/* AppPillButton */
"AppPillButton.free" = "Gratis";
"AppPillButton.open" = "Abrir";
/* AppAction */
"AppAction.install" = "Instalar";
"AppAction.open" = "Abrir";
"AppAction.refresh" = "Refrescar";
"AppAction.activate" = "Activar";
"AppAction.deactivate" = "Desactivar";
"AppAction.remove" = "Eliminar";
"AppAction.enableJIT" = "Activar JIT";
"AppAction.backup" = "Respaldar";
"AppAction.exportBackup" = "Exportar respaldo";
"AppAction.restoreBackup" = "Restablecer respaldo";
"AppAction.chooseCustomIcon" = "Personalizar icono";
"AppAction.resetIcon" = "Reiniciar icono";
/* AppDetailView*/
"AppDetailView.more" = "Más...";
"AppDetailView.whatsNew" = "Novedades";
"AppDetailView.version" = "Versión";
"AppDetailView.noVersionInformation" = "Sin información de versión";
"AppDetailView.noPermissions" = "Esta aplicación no requiere de permisos.";
"AppDetailView.permissions" = "Los permisos";
/* AppPermissionGrid */
"AppPermissionGrid.usageDescription" = "Descripciones de uso";
/* MyAppsView */
"MyAppsView.active" = "Activo";
"MyAppsView.sideloading" = "Instalando en progeso...";
"MyAppsView.refreshAll" = "Refrescar todos";
"MyAppsView.appIDsRemaining" = "App IDs restante";
"MyAppsView.noUpdatesAvailable" = "No hay actualizaciones disponibles";
"MyAppsView.failedToRefresh" = "No se pudo refrescar";
"MyAppsView.apps" = "aplicaciones"; /* Keep this lowercase */
"MyAppsView.viewAppIDs" = "Ver App IDs";
"MyAppsView.myApps" = "Mis Aplicaciones";

View File

@@ -114,7 +114,7 @@ struct AppDetailView: View {
ExpandableText(text: storeApp.localizedDescription)
.lineLimit(6)
.expandButton(TextSet(text: "More...", font: .callout, color: .accentColor))
.expandButton(TextSet(text: L10n.AppDetailView.more, font: .callout, color: .accentColor))
.padding(.horizontal)
currentVersionView
@@ -158,11 +158,11 @@ struct AppDetailView: View {
VStack(alignment: .leading, spacing: 8) {
HStack(alignment: .bottom) {
VStack(alignment: .leading) {
Text("What's New")
Text(L10n.AppDetailView.whatsNew)
.bold()
.font(.title3)
Text("Version \(storeApp.version)")
Text("\(L10n.AppDetailView.version) \(storeApp.version)")
.font(.callout)
.foregroundColor(.secondary)
}
@@ -180,9 +180,9 @@ struct AppDetailView: View {
if let versionDescription = storeApp.versionDescription {
ExpandableText(text: versionDescription)
.lineLimit(5)
.expandButton(TextSet(text: "More...", font: .callout, color: .accentColor))
.expandButton(TextSet(text: L10n.AppDetailView.more, font: .callout, color: .accentColor))
} else {
Text("No version information")
Text(L10n.AppDetailView.noVersionInformation)
.foregroundColor(.secondary)
}
}
@@ -190,12 +190,12 @@ struct AppDetailView: View {
var permissionsView: some View {
VStack(alignment: .leading, spacing: 8) {
Text("Permissions")
Text(L10n.AppDetailView.permissions)
.bold()
.font(.title3)
if storeApp.permissions.isEmpty {
Text("The app requires no permissions.")
Text(L10n.AppDetailView.noPermissions)
.font(.callout)
.foregroundColor(.secondary)
} else {

View File

@@ -44,7 +44,7 @@ struct AppPermissionGridItemView: View {
.foregroundColor(.primary)
}
.alert(isPresented: self.$isPopoverPresented) {
Alert(title: Text("Usage Description"), message: Text(permission.usageDescription))
Alert(title: Text(L10n.AppPermissionGrid.usageDescription), message: Text(permission.usageDescription))
}
}
}

View File

@@ -23,15 +23,15 @@ struct AddSourceView: View {
.autocapitalization(.none)
.autocorrectionDisabled()
} header: {
Text("Source URL")
Text(L10n.AddSourceView.sourceURL)
} footer: {
VStack(alignment: .leading, spacing: 4) {
Text("Please enter the source url here. Then, tap continue to validate and add the source in the next step.")
Text(L10n.AddSourceView.sourceWarning)
HStack(alignment: .top) {
Image(systemSymbol: .exclamationmarkTriangleFill)
Text("Be careful with unvalidated third-party sources! Make sure to only add sources that you trust.")
Text(L10n.AddSourceView.sourceWarningContinued)
}
}
}
@@ -39,12 +39,12 @@ struct AddSourceView: View {
SwiftUI.Button {
self.continueHandler(self.sourceUrlText)
} label: {
Text("Continue")
Text(L10n.AddSourceView.continue)
}
.disabled(URL(string: self.sourceUrlText)?.host == nil)
}
.listStyle(InsetGroupedListStyle())
.navigationTitle("Add Source")
.navigationTitle(L10n.AddSourceView.title)
}
}

View File

@@ -131,7 +131,7 @@ struct PromotedCategoryView: View {
HStack {
Image(systemSymbol: .dpadRightFill)
Text("Games &\nEmulators")
Text(L10n.BrowseView.Categories.gamesAndEmulators)
.multilineTextAlignment(.leading)
}
.foregroundColor(.accentColor)

View File

@@ -25,7 +25,7 @@ struct ConfirmAddSourceView: View {
List {
Section {
VStack(alignment: .leading) {
Text("\(source.apps.count) Apps")
Text("\(source.apps.count) \(L10n.ConfirmAddSourceView.apps)")
Text(source.apps.map { $0.name }.joined(separator: ", "))
.font(.callout)
@@ -34,28 +34,28 @@ struct ConfirmAddSourceView: View {
}
VStack() {
Text("\(source.newsItems.count) News Items")
Text("\(source.newsItems.count) \(L10n.ConfirmAddSourceView.newsItems)")
}
} header: {
Text("Source Contents")
Text(L10n.ConfirmAddSourceView.sourceContents)
}
Section {
VStack(alignment: .leading) {
Text("Source Identifier")
Text(L10n.ConfirmAddSourceView.sourceIdentifier)
Text(source.identifier)
.font(.callout)
.foregroundColor(.secondary)
}
VStack(alignment: .leading) {
Text("Source URL")
Text(L10n.ConfirmAddSourceView.sourceURL)
Text(source.sourceURL.absoluteString)
.font(.callout)
.foregroundColor(.secondary)
}
} header: {
Text("Source Info")
Text(L10n.ConfirmAddSourceView.sourceInfo)
}
}
.listStyle(InsetGroupedListStyle())
@@ -65,7 +65,7 @@ struct ConfirmAddSourceView: View {
SwiftUI.Button {
confirmationHandler(fetchedSource)
} label: {
Label("Add Source", systemSymbol: .plus)
Label(L10n.ConfirmAddSourceView.addSource, systemSymbol: .plus)
}
.buttonStyle(FilledButtonStyle())
.padding()

View File

@@ -35,7 +35,7 @@ struct SourcesView: View {
LazyVStack(alignment: .leading, spacing: 24) {
// Installed Sources
LazyVStack(alignment: .leading, spacing: 12) {
Text("Sources control what apps are available to download through SideStore.")
Text(L10n.SourcesView.sourcesDescription)
.font(.callout)
.foregroundColor(.secondary)
@@ -58,7 +58,7 @@ struct SourcesView: View {
SwiftUI.Button {
self.removeSource(source)
} label: {
Label("Remove", systemSymbol: .trash)
Label(L10n.SourcesView.remove, systemSymbol: .trash)
}
}))
}
@@ -67,11 +67,11 @@ struct SourcesView: View {
// Trusted Sources
LazyVStack(alignment: .leading) {
Text("Trusted Sources")
Text(L10n.SourcesView.trustedSources)
.font(.title3)
.bold()
Text("SideStore has reviewed these sources to make sure they meet our safety standards.")
Text(L10n.SourcesView.reviewedText)
.font(.callout)
.foregroundColor(.secondary)
@@ -80,7 +80,7 @@ struct SourcesView: View {
}
.padding()
}
.navigationTitle("Sources")
.navigationTitle(L10n.SourcesView.sources)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
SwiftUI.Button {
@@ -107,7 +107,7 @@ struct SourcesView: View {
ToolbarItem(placement: .navigationBarTrailing) {
SwiftUI.Button(action: self.dismiss) {
Text("Done").bold()
Text(L10n.SourcesView.done).bold()
}
}
}

View File

@@ -20,18 +20,18 @@ enum AppAction: Int, CaseIterable {
var title: String {
switch self {
case .install: return "Install"
case .open: return "Open"
case .refresh: return "Refresh"
case .activate: return "Activate"
case .deactivate: return "Deactivate"
case .remove: return "Remove"
case .enableJIT: return "Enable JIT"
case .backup: return "Back Up"
case .exportBackup: return "Export Backup"
case .restoreBackup: return "Restore Backup"
case .chooseCustomIcon: return "Change Icon"
case .resetCustomIcon: return "Reset Icon"
case .install: return L10n.AppAction.install
case .open: return L10n.AppAction.open
case .refresh: return L10n.AppAction.refresh
case .activate: return L10n.AppAction.activate
case .deactivate: return L10n.AppAction.deactivate
case .remove: return L10n.AppAction.remove
case .enableJIT: return L10n.AppAction.enableJIT
case .backup: return L10n.AppAction.backup
case .exportBackup: return L10n.AppAction.exportBackup
case .restoreBackup: return L10n.AppAction.restoreBackup
case .chooseCustomIcon: return L10n.AppAction.chooseCustomIcon
case .resetCustomIcon: return L10n.AppAction.resetIcon
}
}

View File

@@ -68,7 +68,7 @@ struct MyAppsView: View {
LazyVStack(spacing: 16) {
if let progress = SideloadingManager.shared.progress {
VStack {
Text("Sideloading in progress...")
Text(L10n.MyAppsView.sideloading)
.padding()
ProgressView(progress)
@@ -84,14 +84,14 @@ struct MyAppsView: View {
}
HStack {
Text("Active")
Text(L10n.MyAppsView.active)
.font(.title2)
.bold()
Spacer()
SwiftUI.Button {
} label: {
Text("Refresh All")
Text(L10n.MyAppsView.refreshAll)
}
}
@@ -111,14 +111,14 @@ struct MyAppsView: View {
VStack {
if DatabaseManager.shared.activeTeam()?.type == .free {
Text("\(remainingAppIDs) App IDs Remaining")
Text("\(remainingAppIDs) \(L10n.MyAppsView.appIDsRemaining)")
.foregroundColor(.secondary)
}
SwiftUI.Button {
self.isShowingAppIDsView = true
} label: {
Text("View App IDs")
Text(L10n.MyAppsView.viewAppIDs)
}
.sheet(isPresented: self.$isShowingAppIDsView) {
NavigationView {
@@ -130,7 +130,7 @@ struct MyAppsView: View {
.padding(.horizontal)
}
.background(Color(UIColor.systemGroupedBackground).ignoresSafeArea())
.navigationTitle("My Apps")
.navigationTitle(L10n.MyAppsView.myApps)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
SwiftUI.Button {
@@ -239,7 +239,7 @@ extension MyAppsView {
NotificationManager.shared.reportError(error: failure.value)
} else {
// TODO: Localize
let title = "Failed to refresh \(failures.count) apps."
let title = "\(L10n.MyAppsView.failedToRefresh) \(failures.count) \(L10n.MyAppsView.apps)"
let error = failures.first?.value as NSError?
let message = error?.localizedFailure ?? error?.localizedFailureReason ?? error?.localizedDescription

View File

@@ -90,10 +90,10 @@ extension RootView {
var displayName: String {
switch self {
case .news: return "News"
case .browse: return "Browse"
case .myApps: return "My Apps"
case .settings: return "Settings"
case .news: return L10n.RootView.news
case .browse: return L10n.RootView.browse
case .myApps: return L10n.RootView.myApps
case .settings: return L10n.RootView.settings
}
}

View File

@@ -30,16 +30,16 @@ struct ConnectAppleIDView: View {
var body: some View {
ScrollView {
VStack(alignment: .leading, spacing: 32) {
Text("Sign in with your Apple ID to get started.")
Text(L10n.ConnectAppleIDView.startWithSignIn)
VStack(spacing: 16) {
RoundedTextField(title: "Apple ID", placeholder: "user@sidestore.io", text: $email)
RoundedTextField(title: L10n.ConnectAppleIDView.appleID, placeholder: "user@sidestore.io", text: $email)
RoundedTextField(title: "Password", placeholder: "••••••", text: $password, isSecure: true)
RoundedTextField(title: L10n.ConnectAppleIDView.password, placeholder: "••••••", text: $password, isSecure: true)
}
SwiftUI.Button(action: signIn) {
Text("Sign in")
Text(L10n.ConnectAppleIDView.signIn)
.bold()
}
.buttonStyle(FilledButtonStyle(isLoading: isLoading))
@@ -48,10 +48,10 @@ struct ConnectAppleIDView: View {
Spacer()
VStack(alignment: .leading) {
Text("Why do we need this?")
Text(L10n.ConnectAppleIDView.whyDoWeNeedThis)
.bold()
Text("Your Apple ID is used to configure apps so they can be installed on this device. Your credentials will be stored securely in this device's Keychain and sent only to Apple for authentication.")
Text(L10n.ConnectAppleIDView.footer)
}
.padding()
.background(
@@ -62,11 +62,11 @@ struct ConnectAppleIDView: View {
.padding(.horizontal)
}
.frame(maxWidth: .infinity)
.navigationTitle("Connect your Apple ID")
.navigationTitle(L10n.ConnectAppleIDView.connectYourAppleID)
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
SwiftUI.Button(action: self.cancel) {
Text("Cancel")
Text(L10n.ConnectAppleIDView.cancel)
}
}
}
@@ -87,7 +87,7 @@ struct ConnectAppleIDView: View {
break
case .failure(let error as NSError):
let error = error.withLocalizedFailure(NSLocalizedString("Failed to Log In", comment: ""))
let error = error.withLocalizedFailure(NSLocalizedString(L10n.ConnectAppleIDView.failedToSignIn, comment: ""))
print(error)
case .success((let account, let session)):

View File

@@ -36,21 +36,21 @@ struct SettingsView: View {
if let connectedAppleID = connectedTeams.first {
HStack {
Text("Name")
Text(L10n.SettingsView.ConnectedAppleID.name)
.foregroundColor(.secondary)
Spacer()
Text(connectedAppleID.name)
}
HStack {
Text("E-Mail")
Text(L10n.SettingsView.ConnectedAppleID.eMail)
.foregroundColor(.secondary)
Spacer()
Text(connectedAppleID.account.appleID)
}
HStack {
Text("Type")
Text(L10n.SettingsView.ConnectedAppleID.type)
.foregroundColor(.secondary)
Spacer()
Text(connectedAppleID.type.localizedDescription)
@@ -59,18 +59,18 @@ struct SettingsView: View {
SwiftUI.Button {
self.connectAppleID()
} label: {
Text("Connect your Apple ID")
Text(L10n.SettingsView.connectAppleID)
}
}
} header: {
if !connectedTeams.isEmpty {
HStack {
Text("Connected Apple ID")
Text(L10n.SettingsView.ConnectedAppleID.text)
Spacer()
SwiftUI.Button {
self.disconnectAppleID()
} label: {
Text("Sign Out")
Text(L10n.SettingsView.ConnectedAppleID.signOut)
.font(.callout)
.bold()
}
@@ -78,21 +78,21 @@ struct SettingsView: View {
}
} footer: {
VStack(spacing: 4) {
Text("Your Apple ID is required to sign the apps you install with SideStore.")
Text(L10n.SettingsView.ConnectedAppleID.Footer.p1)
Text("Your credentials are only sent to Apple's servers and are not accessible by the SideStore Team. Once successfully logged in, the login details are stored securely on your device.")
Text(L10n.SettingsView.ConnectedAppleID.Footer.p2)
}
}
Section {
Toggle(isOn: self.$isBackgroundRefreshEnabled, label: {
Text("Background Refresh")
Text(L10n.SettingsView.backgroundRefresh)
})
SwiftUI.Button {
self.isShowingAddShortcutView = true
} label: {
Text("Add to Siri...")
Text(L10n.SettingsView.addToSiri)
}
.sheet(isPresented: self.$isShowingAddShortcutView) {
if let shortcut = INShortcut(intent: INInteraction.refreshAllApps().intent) {
@@ -100,22 +100,22 @@ struct SettingsView: View {
}
}
} header: {
Text("Refreshing Apps")
Text(L10n.SettingsView.refreshingApps)
} footer: {
Text("Enable Background Refresh to automatically refresh apps in the background when connected to WiFi and with Wireguard active.")
Text(L10n.SettingsView.refreshingAppsFooter)
}
Section {
SwiftUI.Button(action: switchToUIKit) {
Text("Switch to UIKit")
Text(L10n.SettingsView.switchToUIKit)
}
SwiftUI.Button(action: resetImageCache) {
Text("Reset Image Cache")
Text(L10n.SettingsView.resetImageCache)
}
} header: {
Text("Debug")
Text(L10n.SettingsView.debug)
}
@@ -124,7 +124,7 @@ struct SettingsView: View {
SafariView(url: URL(string: "https://fabian-thies.de")!)
} label: {
HStack {
Text("SwiftUI Redesign")
Text(L10n.SettingsView.swiftUIRedesign)
.foregroundColor(.secondary)
Spacer()
Text("fabianthdev")
@@ -132,7 +132,7 @@ struct SettingsView: View {
}
} header: {
Text("Credits")
Text(L10n.SettingsView.credits)
}
Section {
@@ -144,7 +144,7 @@ struct SettingsView: View {
}
}
.listStyle(InsetGroupedListStyle())
.navigationTitle("Settings")
.navigationTitle(L10n.SettingsView.title)
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
SwiftUI.Button {