| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- //
- // AppLocalization.swift
- // App for Indeed
- //
- // English-first localization using Localizable.strings (same pattern as the LinkedIn app).
- // Add more locales by creating `<locale>.lproj/Localizable.strings` and extending AppLanguage.
- //
- import Foundation
- enum AppLanguage: String, CaseIterable {
- case english = "English"
- case arabic = "Arabic"
- var localeIdentifier: String {
- switch self {
- case .english:
- return "en"
- case .arabic:
- return "ar"
- }
- }
- static var systemLanguage: AppLanguage {
- let preferred = Locale.preferredLanguages.first ?? "en"
- for language in AppLanguage.allCases where preferred.hasPrefix(language.localeIdentifier) {
- return language
- }
- return .english
- }
- var localizedDisplayName: String {
- switch self {
- case .english:
- return "English"
- case .arabic:
- return "العربية"
- }
- }
- }
- func appLocalized(_ key: String, language: AppLanguage) -> String {
- guard let path = Bundle.main.path(forResource: language.localeIdentifier, ofType: "lproj"),
- let bundle = Bundle(path: path) else {
- return key
- }
- return bundle.localizedString(forKey: key, value: key, table: nil)
- }
- func currentAppLanguage() -> AppLanguage {
- let code = UserDefaults.standard.string(forKey: "com.appforindeed.preferredLanguage") ?? "en"
- return AppLanguage.allCases.first(where: { $0.localeIdentifier == code }) ?? .english
- }
- /// Resolves copy for the user’s currently selected language.
- func L(_ key: String) -> String {
- appLocalized(key, language: currentAppLanguage())
- }
- /// Localized CV template title; `name` is always the English localization key.
- func localizedTemplateName(_ nameKey: String) -> String {
- L(nameKey)
- }
- @MainActor
- final class AppLanguageManager {
- static let shared = AppLanguageManager()
- static let didChangeNotification = Notification.Name("AppLanguageManager.didChange")
- private enum UserDefaultsKey {
- static let preferredLanguage = "com.appforindeed.preferredLanguage"
- }
- var current: AppLanguage {
- currentAppLanguage()
- }
- func applyStoredPreferenceOnLaunch() {
- if UserDefaults.standard.string(forKey: UserDefaultsKey.preferredLanguage) == nil {
- setLanguage(AppLanguage.systemLanguage, notify: false)
- }
- }
- func setLanguage(_ language: AppLanguage, notify: Bool = true) {
- let code = language.localeIdentifier
- UserDefaults.standard.set(code, forKey: UserDefaultsKey.preferredLanguage)
- UserDefaults.standard.set([code], forKey: "AppleLanguages")
- if notify {
- NotificationCenter.default.post(name: Self.didChangeNotification, object: self)
- }
- }
- func setLanguage(code: String, notify: Bool = true) {
- guard let language = AppLanguage.allCases.first(where: { $0.localeIdentifier == code }) else { return }
- setLanguage(language, notify: notify)
- }
- }
|