You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
5.1 KiB
167 lines
5.1 KiB
//
|
|
// 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.index(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()
|
|
}
|
|
}
|
|
|