123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- //
- // Localize.swift
- // Localize
- //
- // Created by Roy Marmelstein on 05/08/2015.
- // Copyright © 2015 Roy Marmelstein. All rights reserved.
- //
- import Foundation
- /// Internal current language key
- let LCLCurrentLanguageKey = "LCLCurrentLanguageKey"
- /// Default language. English. If English is unavailable defaults to base localization.
- let LCLDefaultLanguage = "en"
- /// Base bundle as fallback.
- let LCLBaseBundle = "Base"
- /// Name for language change notification
- public let LCLLanguageChangeNotification = "LCLLanguageChangeNotification"
- // MARK: Localization Syntax
- /**
- Swift 1.x friendly localization syntax, replaces NSLocalizedString
- - Parameter string: Key to be localized.
- - Returns: The localized string.
- */
- public func Localized(_ string: String) -> String {
- return string.localized()
- }
- /**
- Swift 1.x friendly localization syntax with format arguments, replaces String(format:NSLocalizedString)
- - Parameter string: Key to be localized.
- - Returns: The formatted localized string with arguments.
- */
- public func Localized(_ string: String, arguments: CVarArg...) -> String {
- return String(format: string.localized(), arguments: arguments)
- }
- /**
- Swift 1.x friendly plural localization syntax with a format argument
-
- - parameter string: String to be formatted
- - parameter argument: Argument to determine pluralisation
-
- - returns: Pluralized localized string.
- */
- public func LocalizedPlural(_ string: String, argument: CVarArg) -> String {
- return string.localizedPlural(argument)
- }
- public extension String {
- /**
- Swift 2 friendly localization syntax, replaces NSLocalizedString
- - Returns: The localized string.
- */
- func localized() -> String {
- return localized(using: nil, in: .main)
- }
- /**
- Swift 2 friendly localization syntax with format arguments, replaces String(format:NSLocalizedString)
- - Returns: The formatted localized string with arguments.
- */
- func localizedFormat(_ arguments: CVarArg...) -> String {
- return String(format: localized(), arguments: arguments)
- }
-
- /**
- Swift 2 friendly plural localization syntax with a format argument
-
- - parameter argument: Argument to determine pluralisation
-
- - returns: Pluralized localized string.
- */
- func localizedPlural(_ argument: CVarArg) -> String {
- return NSString.localizedStringWithFormat(localized() as NSString, argument) as String
- }
- }
- // MARK: Language Setting Functions
- open class Localize: NSObject {
-
- /**
- List available languages
- - Returns: Array of available languages.
- */
- open class func availableLanguages(_ excludeBase: Bool = false) -> [String] {
- var availableLanguages = Bundle.main.localizations
- // If excludeBase = true, don't include "Base" in available languages
- if let indexOfBase = availableLanguages.firstIndex(of: "Base") , excludeBase == true {
- availableLanguages.remove(at: indexOfBase)
- }
- return availableLanguages
- }
-
- /**
- Current language
- - Returns: The current language. String.
- */
- open class func currentLanguage() -> String {
- if let currentLanguage = UserDefaults.standard.object(forKey: LCLCurrentLanguageKey) as? String {
- return currentLanguage
- }
- return defaultLanguage()
- }
-
- /**
- Change the current language
- - Parameter language: Desired language.
- */
- open class func setCurrentLanguage(_ language: String) {
- let selectedLanguage = availableLanguages().contains(language) ? language : defaultLanguage()
- if (selectedLanguage != currentLanguage()){
- UserDefaults.standard.set(selectedLanguage, forKey: LCLCurrentLanguageKey)
- UserDefaults.standard.synchronize()
- NotificationCenter.default.post(name: Notification.Name(rawValue: LCLLanguageChangeNotification), object: nil)
- }
- }
-
- /**
- Default language
- - Returns: The app's default language. String.
- */
- open class func defaultLanguage() -> String {
- var defaultLanguage: String = String()
- guard let preferredLanguage = Bundle.main.preferredLocalizations.first else {
- return LCLDefaultLanguage
- }
- let availableLanguages: [String] = self.availableLanguages()
- if (availableLanguages.contains(preferredLanguage)) {
- defaultLanguage = preferredLanguage
- }
- else {
- defaultLanguage = LCLDefaultLanguage
- }
- return defaultLanguage
- }
-
- /**
- Resets the current language to the default
- */
- open class func resetCurrentLanguageToDefault() {
- setCurrentLanguage(self.defaultLanguage())
- }
-
- /**
- Get the current language's display name for a language.
- - Parameter language: Desired language.
- - Returns: The localized string.
- */
- open class func displayNameForLanguage(_ language: String) -> String {
- let locale : NSLocale = NSLocale(localeIdentifier: currentLanguage())
- if let displayName = locale.displayName(forKey: NSLocale.Key.identifier, value: language) {
- return displayName
- }
- return String()
- }
- }
|