Glotty
示例
要运行示例项目,请先克隆存储库,然后从 Example 目录运行 pod install
。
需求
安装
Glotty 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod "Glotty"
许可协议
Glotty 按Apache许可协议提供。有关更多信息,请参阅LICENSE文件。
简介
SDLocalizationManager(以下简称LM)主要诞生于简化并标准化需要应用内部语言变化的开发,从而脱离操作系统选择的默认语言。
LM的另一个目的是使DateFormatter和NumberFormers更常见,并为项目支持的个人语言提供更加“可自定义”的体验。
因此,LM可以分为两个主要模块:
- 第一个是用于地区管理
- 第二个是用于格式化器
地区管理
初始设置
默认地区
如果您希望驱动应用中的语言,需要在方法支持的地区中设置默认的地区。
- (void) setDefaultLocaleWithIdentifier: (NSString *) identifier;
支持的地区
当您不想在应用中驱动语言,但打算使用其格式化程序时,LM也非常有用。
为了在应用程序中试验语言,您必须通过以下方法设置支持的地区
- (void) setSupportedLocales: (NSArray *) locales
或者通过以下方式从外部文件上传地区
- (void) loadSupportedLocalesFromFileWithName: (NSString *) fileName
在这种情况下,该文件通常是添加到项目资源的 plist 文件,其中包含本地标识符数组。
此时,LM 控制本地默认设置。如果未设置或不受支持,则 LM 选择第一个受支持的本地列表并将其设置为默认值。
然后 LM 自动根据以下优先级选择一个受支持的地区
-
最初检查是否将地区之前保存到 UserDefaults 中。如果它仍在支持的地区,则选择该地区。
-
第二步,LM 在操作系统指示的 preferredLanguages 之间循环,并对每个这些进行检查
- 如果语言受支持,则选择并保存到 UserDefaults 以供将来执行。
- 否则,如果语言是特定国家的(例如“en \ _GB”),则检查其泛型版本(“en”)是否受支持。在这种情况下,选择泛型版本并将其保存到 UserDefaults 中。
-
作为最后的手段,设置为“本地选择”默认地区。
允许操作系统识别的本地
默认情况下,LM 只允许您设置操作系统识别为“受支持”的地区。如果传递了一个非标准地区,这将被丢弃,并将错误写入控制台。
在罕见的情况下,如果您需要使用非标准地区,您可以通过设置以下属性来避免它
allowsOnlyLocalesAvailableOnSystem = NO;
通过这样做,LM 不会执行任何合规性检查。
如果将非标准地区设置为 选定的地区,LM 将要求它的 委托 识别应该使用哪种标准地区来处理未来的位置和格式化。如果没有指出有效标准地区,LM 将回退到默认地区。
LM 初始化示例
通常在 AppDelegate 中
[[SDLocalizationManager sharedManager] setAllowsOnlyLocalesAvailableOnSystem: NO];
[[SDLocalizationManager sharedManager] setSupportedLocales: @ [@ "en",
@ "en-US", @ "it", @ "invented-locale"];
[[SDLocalizationManager sharedManager] setDefaultLocaleWithIdentifier: @ "it"];
使用区域设置
更改选中语言
要更改选中的语言,只需调用该方法
- (void) setSelectedLocaleWithIdentifier: (NSString *) identifier;
传递支持的一个标识符。
LM 将检查指示位置是否受支持,然后回退到其无国家特定的区域设置受支持或最终到默认区域设置。
如果选定的区域设置已更改,LM 将启动通知
SDLocalizationManagerLanguageDidChangeNotification
要了解是否选中了特定语言,可以调用控制方法
- (BOOL) isLocaleWithIdentifierSelected: (NSString *) identifier;
重置设置
如果您想重置已保存的设置,以便 LM 重新计算要使用的语言,请在设置 supportedLocales 和/或 defaultLocal 之前调用以下方法
``- (BOOL) resetSavedSettings;`
该方法返回 YES,如果它重置了已保存的设置,否则返回 NO。
支持区域设置的方法
获取支持的区域设置列表,调用方法
- (NSArray *) supportedLocales;
若要了解是否支持某个区域设置,请改为调用
- (BOOL) supportsLocaleWithIdentifier: (NSString *) identifier;
要获取 LM 将使用特定标识符的 * NSLocale * 对象,请调用
- (NSLocale *) supportedLocaleWithIdentifier: (NSString *) identifier;
如果给定的标识符不受支持,方法会检查其无国家特定的区域设置是否受支持,并返回相应的 NSLocale。即使这不受支持,该方法也返回 nil。
本地化
获取本地化值
LM 允许您获取与指定键关联的本地化值。在此阶段,LM 将在选择区域(如 en-US.strings)关联的第一个文件中查找该键。作为一个第二次尝试,它将在无国家特定区域的文件中尝试(如 en.strings)。搜索在默认区域文件中结束。
如果找不到该值,方法将返回一个默认值(如果有传入参数)或键本身。
如果方法输入文件名,LM 只会在具有该名称的文件中查找。
注意 如果没有设置“支持的区域”,那么以下方法将返回类似系统方法 NSLocalizedString 返回的值。
这四个方法是:
- (NSString *) localizedKey: (NSString *) key;
- (NSString *) localizedKey: (NSString *) key fromTable: (NSString *) tableName;
- (NSString *) localizedKey: (NSString *) key withDefaultValue (NSString *) defaultValue;
- (NSString *) localizedKey: (NSString *) key fromTable: (NSString *) tableName withDefaultValue: (NSString *) defaultValue;
- (NSString *) localizedKey: (NSString *) key fromTable: (NSString *) tableName placeholderDictionary: (NSDictionary <NSString *, NSString *> *) placeholderDictionary withDefaultValue: (NSString *) defaultValue;
这四个方法对应于四个舒适的 C 方法
NSString * SDLocalizedString (NSString * key);
NSString * SDLocalizedStringFromTable (NSString * key, NSString * table);
NSString * SDLocalizedStringWithDefault (NSString * key, NSString * val);
NSString * SDLocalizedStringFromTableWithDefault (NSString * key, NSString * table, NSString * val);
NSString * SDLocalizedStringWithPlaceholders (NSString * key, NSDictionary <NSString *, NSString *> * placeholders);
通过代码添加字符串
可以通过传递与特定表和本地化相关的对应字典以编程方式添加字符串。
- (void) addStrings:(NSDictionary<NSString*, NSString*>*)strings toTableWithName:(NSString*)tableName forLocalization:(NSString*)localization;
这些字符串将在应用程序生命周期内保留。要移除它们,请使用类似的方法。
- (void) resetAddedStringsToTableWithName:(NSString*)tableName forLocalization:(NSString*)localization;
支持的语言名称
LM 提供两种方法来获取操作系统支持的语言显示名称。
第一个返回选定的语言当前所有本地化的名称
- (NSArray *) supportedLocalesNamesInSelectedLocale;
第二个返回它自己的语言中的任何本地化名称
- (NSArray *) supportedLocalesNamesInCorrespondingLocale;
在任一情况下,如果不存在该名称,它将返回一个空字符串。
它还提供两种方法来检索本地化文件中的语言名称。
首先查看 Localizable.strings
- (NSArray *) supportedLocalesNamesInLocalizableStrings;
第二个在主题文件中搜索
- (NSArray *) supportedLocalesNamesInTableWithName: (NSString *) tableName;
.strings中的键必须遵循以下约定
LM_locale_name_ <locale_id \>"
例如
LM_locale_name_it_IT '' = 'Italian';
格式化程序和日历
LM提供多种格式化程序和日历,以应对最常见的情况。
格式化程序使用所选区域设置对日期和数字进行一致性格式化。如果没有选择区域设置,则使用[NSLocale currentLocale]。但是,您可以向LM请求格式化程序并更改其设置,但这些设置在两次调用格式化程序之间不一定保持不变,因为所有格式化程序和日历在发生某些事件时都会被重置,尤其是所选区域设置更改时。
UserDefaultFormatters和UserDefaultCalendars允许您在UserDefaults中保存格式化和日历首选项,在网络应用程序中非常有用,在这些应用程序中,用户可以选择日期格式、货币、时区等。对于这些组件,一些方便的属性允许您设置并保存所需设置到UserDefaults中。
LM子类
如果您将LM子类化以添加格式化程序或日历,重要的是要重写方法
- (void) resetFormattersAndCalendars;
其中必须调用super并且必须将所有从子类添加的格式化程序和日历放置为nil。这是必要的,因为这些组件在任何时间都不会设置区域,只有在创建时才会使用。
日期格式化程序
LM提供的日期格式化程序的简要描述
-
simpleDateFormatter:遵循模板"dd / MM / yyyy"的格式化程序。最终格式取决于所选区域设置。
-
twelveHoursTimeFormatter:遵循模板"hh: mm a"的格式化程序,对于12小时格式后跟周期(AM/PM)。最终格式取决于所选区域设置。
-
twentyFourHoursTimeFormatter:遵循24小时模板"HH: mm"。最终格式取决于所选区域设置。
-
simpleDateTimeFormatter:遵循模板"dd / mm / yyyy HH: mm"。最终格式取决于所选区域设置。
-
serverDateTimeFormatter:具有固定格式"yyyy-MM-dd hh: mm: ss.SSS"和GMT时区,用于处理遵循此模式的服务器日期。
-
userDefaultDateFormatter:使用在userDefaultDateFormat属性中设置的格式和所选区域设置。格式保存在UserDefaults中。默认情况下为"dd / MM / yyyy"。
-
userDefaultTimeFormatter:使用在userDefaultTimeFormat属性中设置的格式和所选区域设置。格式保存在UserDefaults中。默认为"HH: mm"。
-
userDefaultDateTimeFormatter:使用在userDefaultDateFormat和userDefaultTimeFormat属性中设置的格式和所选区域设置。
数字格式化
默认情况下,数字格式化器使用所选区域设置来确定小数分隔符和千位分隔符的符号。这些符号可以通过向 Localizable.strings 添加来覆盖,并定义它们各自的键
#define kDecimalSeparatorLocalizedKey @ "LM_decimal_separator"
#define kGroupingSeparatorLocalizedKey @ "LM_grouping_separator"
LM提供的数字格式化器的简要说明
-
用户默认距离格式化器:通过添加测量单位来格式化距离,该单位可以通过属性 userDefaultDistanceUnit 设置和保存。默认情况下,使用 "m" 为公制系统,"ft" 为美国系统。默认情况下,始终在逗号后使用数字。
-
用户默认速度格式化器:通过添加测量单位来格式化速度,该单位可以通过属性 userDefaultSpeedUnit 设置和保存。默认情况下,使用 "km / h" 为公制系统,"mph" 为美国系统。默认情况下,始终在逗号后使用数字。
-
用户默认货币格式化器:通过在数值后面添加货币符号来格式化数字,该符号可以通过属性 userDefaultCurrencySymbol 设置和保存。默认情况下,使用所选区域设置的符号。默认情况下,始终在逗号后使用两位数字。
-
百分比格式化器:通过避免默认情况下由 NSNumberFormatter 执行的除以 100 操作来以百分比格式格式化数字。
日历
LM提供的日历的简要说明
-
用户默认日历:带有在属性 userDefaultTimeZone 中指定的 timeZone 和在属性 **userDefaultCalendarIdentifier * 中指定的 calendarIdentifier 的日历。使用所选区域设置。默认情况下,timeZone 和 calendarIdentifier 是由操作系统指定的。
-
UTC日历:设置为 timeZone UTC 的日历。
-
GMT日历:设置为 timeZone GMT 的日历。