DDYLanguageTool.m 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /// MARK: - DDYAuthManager 2018/10/30
  2. /// !!!: Author: 豆电雨
  3. /// !!!: QQ/WX: 634778311
  4. /// !!!: Github: https://github.com/RainOpen/
  5. /// !!!: Blog: https://juejin.im/user/57dddcd8128fe10064cadee9
  6. /// MARK: - DDYLanguageTool.M
  7. #import "DDYLanguageTool.h"
  8. #import <UIKit/UIKit.h>
  9. #import <objc/runtime.h>
  10. #define DDYLanguages @"DDYLanguages"
  11. NSString *const DDY_ZHS = @"zh-Hans";
  12. NSString *const DDY_EN = @"en";
  13. NSString *const DDY_ZHT = @"zh-Hant";
  14. NSString *const DDY_JA = @"ja";
  15. NSString *const DDY_FR = @"fr";
  16. NSString *const DDY_DE = @"de";
  17. NSString *const DDY_KO = @"ko";
  18. NSErrorDomain DDYLanguageErrorDomain = @"DDYLanguageErrorDomain";
  19. static inline void ddy_Swizzle(Class class, SEL originalSelector, SEL swizzledSelector) {
  20. Method originalMethod = class_getInstanceMethod(class, originalSelector);
  21. Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
  22. if (class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))) {
  23. class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
  24. } else {
  25. method_exchangeImplementations(originalMethod, swizzledMethod);
  26. }
  27. }
  28. @implementation NSBundle (DDYLanguage)
  29. + (void)load {
  30. static dispatch_once_t onceToken;
  31. dispatch_once(&onceToken, ^{
  32. ddy_Swizzle([self class], @selector(localizedStringForKey:value:table:), @selector(ddyLanguageLocalizedStringForKey:value:table:));
  33. ddy_Swizzle([self class], NSSelectorFromString(@"dealloc"), @selector(ddyLanguageDealloc));
  34. });
  35. }
  36. - (NSString *)ddyLanguageLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName {
  37. NSString *language = [[NSUserDefaults standardUserDefaults] objectForKey:DDYLanguages];
  38. // 可以加更多条件,比如特定的key,value,tableName才进行交换,否则直接return原方法返回值([language isEqualToString:@"Localizable"])
  39. if (language && ![self.bundlePath hasSuffix:@".lproj"]) {
  40. NSBundle *languageBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]];
  41. if (languageBundle) {
  42. return [languageBundle ddyLanguageLocalizedStringForKey:key value:value table:tableName];
  43. }
  44. }
  45. return [self ddyLanguageLocalizedStringForKey:key value:value table:tableName];
  46. }
  47. - (void)ddyLanguageDealloc {
  48. objc_removeAssociatedObjects(self);
  49. [self ddyLanguageDealloc];
  50. }
  51. @end
  52. @implementation DDYLanguageTool
  53. // MARK: - 类方法
  54. // MARK: 手机系统语言
  55. + (NSString *)ddy_SystemLanguage {
  56. return [[NSLocale preferredLanguages] objectAtIndex:0];
  57. }
  58. // MARK: App应用语言
  59. + (NSString *)ddy_AppLanguage {
  60. return [[NSUserDefaults standardUserDefaults] objectForKey:DDYLanguages];
  61. }
  62. // MARK: 设置语言 nil:跟随系统 language:相应语言
  63. + (void)ddy_SetLanguage:(NSString *)language complete:(void (^)(NSError *))complete {
  64. NSError *languageError;
  65. if (language == nil || [language isEqualToString:@""]) {
  66. [[NSUserDefaults standardUserDefaults] removeObjectForKey:DDYLanguages];
  67. languageError = [NSError errorWithDomain:DDYLanguageErrorDomain code:kDDYLanguageErrorNil userInfo:@{@"reason":@"Remove language setting"}];
  68. } else {
  69. NSBundle *languageBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]];
  70. if (languageBundle) {
  71. [[NSUserDefaults standardUserDefaults] setObject:language forKey:DDYLanguages];
  72. languageError = [NSError errorWithDomain:DDYLanguageErrorDomain code:kDDYLanguageErrorSuccess userInfo:@{@"reason":@"Success"}];
  73. } else {
  74. languageError = [NSError errorWithDomain:DDYLanguageErrorDomain code:kDDYLanguageErrorUnsupport userInfo:@{@"reason":@"Unsupported language"}];
  75. }
  76. }
  77. [[NSUserDefaults standardUserDefaults] synchronize];
  78. if (complete) {
  79. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  80. complete(languageError);
  81. });
  82. }
  83. }
  84. @end