NSBundle+MJRefresh.m 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. //
  2. // NSBundle+MJRefresh.m
  3. // MJRefresh
  4. //
  5. // Created by MJ Lee on 16/6/13.
  6. // Copyright © 2016年 小码哥. All rights reserved.
  7. //
  8. #import "NSBundle+MJRefresh.h"
  9. #import "MJRefreshComponent.h"
  10. #import "MJRefreshConfig.h"
  11. static NSBundle *mj_defaultI18nBundle = nil;
  12. static NSBundle *mj_systemI18nBundle = nil;
  13. @implementation NSBundle (MJRefresh)
  14. + (instancetype)mj_refreshBundle
  15. {
  16. static NSBundle *refreshBundle = nil;
  17. if (refreshBundle == nil) {
  18. #ifdef SWIFT_PACKAGE
  19. NSBundle *containnerBundle = SWIFTPM_MODULE_BUNDLE;
  20. #else
  21. NSBundle *containnerBundle = [NSBundle bundleForClass:[MJRefreshComponent class]];
  22. #endif
  23. refreshBundle = [NSBundle bundleWithPath:[containnerBundle pathForResource:@"MJRefresh" ofType:@"bundle"]];
  24. }
  25. return refreshBundle;
  26. }
  27. + (UIImage *)mj_arrowImage
  28. {
  29. static UIImage *arrowImage = nil;
  30. if (arrowImage == nil) {
  31. arrowImage = [[UIImage imageWithContentsOfFile:[[self mj_refreshBundle] pathForResource:@"arrow@2x" ofType:@"png"]] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
  32. }
  33. return arrowImage;
  34. }
  35. + (UIImage *)mj_trailArrowImage {
  36. static UIImage *arrowImage = nil;
  37. if (arrowImage == nil) {
  38. arrowImage = [[UIImage imageWithContentsOfFile:[[self mj_refreshBundle] pathForResource:@"trail_arrow@2x" ofType:@"png"]] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
  39. }
  40. return arrowImage;
  41. }
  42. + (NSString *)mj_localizedStringForKey:(NSString *)key
  43. {
  44. return [self mj_localizedStringForKey:key value:nil];
  45. }
  46. + (NSString *)mj_localizedStringForKey:(NSString *)key value:(NSString *)value
  47. {
  48. NSString *table = MJRefreshConfig.defaultConfig.i18nFilename;
  49. // 如果没有缓存, 则走初始化逻辑
  50. if (mj_defaultI18nBundle == nil) {
  51. NSString *language = MJRefreshConfig.defaultConfig.languageCode;
  52. // 如果配置中没有配置语言
  53. if (!language) {
  54. language = [NSLocale preferredLanguages].firstObject;
  55. }
  56. NSBundle *bundle = MJRefreshConfig.defaultConfig.i18nBundle;
  57. // 首先优先使用公共配置中的 i18nBundle, 如果为空则使用 mainBundle
  58. bundle = bundle ? bundle : NSBundle.mainBundle;
  59. // 按语言选取语言包
  60. NSString *i18nFolderPath = [bundle pathForResource:language ofType:@"lproj"];
  61. mj_defaultI18nBundle = [NSBundle bundleWithPath:i18nFolderPath];
  62. // 检查语言包, 如果没有查找到, 则默认使用 mainBundle
  63. mj_defaultI18nBundle = mj_defaultI18nBundle ? mj_defaultI18nBundle : NSBundle.mainBundle;
  64. // 获取 MJRefresh 自有的语言包
  65. if (mj_systemI18nBundle == nil) {
  66. mj_systemI18nBundle = [self mj_defaultI18nBundleWithLanguage:language];
  67. }
  68. }
  69. // 首先在 MJRefresh 内置语言文件中寻找
  70. value = [mj_systemI18nBundle localizedStringForKey:key value:value table:nil];
  71. // 然后在 MainBundle 对应语言文件中寻找
  72. value = [mj_defaultI18nBundle localizedStringForKey:key value:value table:table];
  73. return value;
  74. }
  75. + (NSBundle *)mj_defaultI18nBundleWithLanguage:(NSString *)language {
  76. if ([language hasPrefix:@"en"]) {
  77. language = @"en";
  78. } else if ([language hasPrefix:@"zh"]) {
  79. if ([language rangeOfString:@"Hans"].location != NSNotFound) {
  80. language = @"zh-Hans"; // 简体中文
  81. } else { // zh-Hant\zh-HK\zh-TW
  82. language = @"zh-Hant"; // 繁體中文
  83. }
  84. } else if ([language hasPrefix:@"ko"]) {
  85. language = @"ko";
  86. } else if ([language hasPrefix:@"ru"]) {
  87. language = @"ru";
  88. } else if ([language hasPrefix:@"uk"]) {
  89. language = @"uk";
  90. } else {
  91. language = @"en";
  92. }
  93. // 从MJRefresh.bundle中查找资源
  94. return [NSBundle bundleWithPath:[[NSBundle mj_refreshBundle] pathForResource:language ofType:@"lproj"]];
  95. }
  96. @end
  97. @implementation MJRefreshConfig (Bundle)
  98. + (void)resetLanguageResourceCache {
  99. mj_defaultI18nBundle = nil;
  100. mj_systemI18nBundle = nil;
  101. }
  102. @end