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

  1. //
  2. // Localize.swift
  3. // Localize
  4. //
  5. // Created by Roy Marmelstein on 05/08/2015.
  6. // Copyright © 2015 Roy Marmelstein. All rights reserved.
  7. //
  8. import Foundation
  9. /// Internal current language key
  10. let LCLCurrentLanguageKey = "LCLCurrentLanguageKey"
  11. /// Default language. English. If English is unavailable defaults to base localization.
  12. let LCLDefaultLanguage = "en"
  13. /// Base bundle as fallback.
  14. let LCLBaseBundle = "Base"
  15. /// Name for language change notification
  16. public let LCLLanguageChangeNotification = "LCLLanguageChangeNotification"
  17. // MARK: Localization Syntax
  18. /**
  19. Swift 1.x friendly localization syntax, replaces NSLocalizedString
  20. - Parameter string: Key to be localized.
  21. - Returns: The localized string.
  22. */
  23. public func Localized(_ string: String) -> String {
  24. return string.localized()
  25. }
  26. /**
  27. Swift 1.x friendly localization syntax with format arguments, replaces String(format:NSLocalizedString)
  28. - Parameter string: Key to be localized.
  29. - Returns: The formatted localized string with arguments.
  30. */
  31. public func Localized(_ string: String, arguments: CVarArg...) -> String {
  32. return String(format: string.localized(), arguments: arguments)
  33. }
  34. /**
  35. Swift 1.x friendly plural localization syntax with a format argument
  36. - parameter string: String to be formatted
  37. - parameter argument: Argument to determine pluralisation
  38. - returns: Pluralized localized string.
  39. */
  40. public func LocalizedPlural(_ string: String, argument: CVarArg) -> String {
  41. return string.localizedPlural(argument)
  42. }
  43. public extension String {
  44. /**
  45. Swift 2 friendly localization syntax, replaces NSLocalizedString
  46. - Returns: The localized string.
  47. */
  48. func localized() -> String {
  49. return localized(using: nil, in: .main)
  50. }
  51. /**
  52. Swift 2 friendly localization syntax with format arguments, replaces String(format:NSLocalizedString)
  53. - Returns: The formatted localized string with arguments.
  54. */
  55. func localizedFormat(_ arguments: CVarArg...) -> String {
  56. return String(format: localized(), arguments: arguments)
  57. }
  58. /**
  59. Swift 2 friendly plural localization syntax with a format argument
  60. - parameter argument: Argument to determine pluralisation
  61. - returns: Pluralized localized string.
  62. */
  63. func localizedPlural(_ argument: CVarArg) -> String {
  64. return NSString.localizedStringWithFormat(localized() as NSString, argument) as String
  65. }
  66. }
  67. // MARK: Language Setting Functions
  68. open class Localize: NSObject {
  69. /**
  70. List available languages
  71. - Returns: Array of available languages.
  72. */
  73. open class func availableLanguages(_ excludeBase: Bool = false) -> [String] {
  74. var availableLanguages = Bundle.main.localizations
  75. // If excludeBase = true, don't include "Base" in available languages
  76. if let indexOfBase = availableLanguages.index(of: "Base") , excludeBase == true {
  77. availableLanguages.remove(at: indexOfBase)
  78. }
  79. return availableLanguages
  80. }
  81. /**
  82. Current language
  83. - Returns: The current language. String.
  84. */
  85. open class func currentLanguage() -> String {
  86. if let currentLanguage = UserDefaults.standard.object(forKey: LCLCurrentLanguageKey) as? String {
  87. return currentLanguage
  88. }
  89. return defaultLanguage()
  90. }
  91. /**
  92. Change the current language
  93. - Parameter language: Desired language.
  94. */
  95. open class func setCurrentLanguage(_ language: String) {
  96. let selectedLanguage = availableLanguages().contains(language) ? language : defaultLanguage()
  97. if (selectedLanguage != currentLanguage()){
  98. UserDefaults.standard.set(selectedLanguage, forKey: LCLCurrentLanguageKey)
  99. UserDefaults.standard.synchronize()
  100. NotificationCenter.default.post(name: Notification.Name(rawValue: LCLLanguageChangeNotification), object: nil)
  101. }
  102. }
  103. /**
  104. Default language
  105. - Returns: The app's default language. String.
  106. */
  107. open class func defaultLanguage() -> String {
  108. var defaultLanguage: String = String()
  109. guard let preferredLanguage = Bundle.main.preferredLocalizations.first else {
  110. return LCLDefaultLanguage
  111. }
  112. let availableLanguages: [String] = self.availableLanguages()
  113. if (availableLanguages.contains(preferredLanguage)) {
  114. defaultLanguage = preferredLanguage
  115. }
  116. else {
  117. defaultLanguage = LCLDefaultLanguage
  118. }
  119. return defaultLanguage
  120. }
  121. /**
  122. Resets the current language to the default
  123. */
  124. open class func resetCurrentLanguageToDefault() {
  125. setCurrentLanguage(self.defaultLanguage())
  126. }
  127. /**
  128. Get the current language's display name for a language.
  129. - Parameter language: Desired language.
  130. - Returns: The localized string.
  131. */
  132. open class func displayNameForLanguage(_ language: String) -> String {
  133. let locale : NSLocale = NSLocale(localeIdentifier: currentLanguage())
  134. if let displayName = locale.displayName(forKey: NSLocale.Key.identifier, value: language) {
  135. return displayName
  136. }
  137. return String()
  138. }
  139. }