Przeglądaj źródła

1.多国语言设置 非指定语言显示英文

huangxiaodong 1 rok temu
rodzic
commit
880d5e8fb8

+ 16 - 0
创维盒子/双子星云手机.xcodeproj/project.pbxproj

@@ -145,6 +145,8 @@
 		6BBB35D92AE7645200E4A59B /* RunInBackground.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 6BBB35D62AE7645200E4A59B /* RunInBackground.mp3 */; };
 		6BBB35DD2AE76AD800E4A59B /* AudioSessionObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BBB35DB2AE76AD800E4A59B /* AudioSessionObject.h */; };
 		6BBB35DE2AE76AD800E4A59B /* AudioSessionObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BBB35DC2AE76AD800E4A59B /* AudioSessionObject.m */; };
+		6BBB35E22AE935C000E4A59B /* DDYLanguageTool.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BBB35E02AE935C000E4A59B /* DDYLanguageTool.h */; };
+		6BBB35E32AE935C000E4A59B /* DDYLanguageTool.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BBB35E12AE935C000E4A59B /* DDYLanguageTool.m */; };
 		6BF0F3D02AD391D8000AA133 /* connectDeviceManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BF0F3CE2AD391D8000AA133 /* connectDeviceManager.h */; };
 		6BF0F3D12AD391D8000AA133 /* connectDeviceManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BF0F3CF2AD391D8000AA133 /* connectDeviceManager.m */; };
 		6BF0F3D52AD3937B000AA133 /* DeviceThirdIdModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BF0F3D32AD3937B000AA133 /* DeviceThirdIdModel.h */; };
@@ -470,6 +472,8 @@
 		6BBB35D62AE7645200E4A59B /* RunInBackground.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = RunInBackground.mp3; sourceTree = "<group>"; };
 		6BBB35DB2AE76AD800E4A59B /* AudioSessionObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioSessionObject.h; sourceTree = "<group>"; };
 		6BBB35DC2AE76AD800E4A59B /* AudioSessionObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AudioSessionObject.m; sourceTree = "<group>"; };
+		6BBB35E02AE935C000E4A59B /* DDYLanguageTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDYLanguageTool.h; sourceTree = "<group>"; };
+		6BBB35E12AE935C000E4A59B /* DDYLanguageTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDYLanguageTool.m; sourceTree = "<group>"; };
 		6BF0F3CE2AD391D8000AA133 /* connectDeviceManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = connectDeviceManager.h; sourceTree = "<group>"; };
 		6BF0F3CF2AD391D8000AA133 /* connectDeviceManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = connectDeviceManager.m; sourceTree = "<group>"; };
 		6BF0F3D32AD3937B000AA133 /* DeviceThirdIdModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DeviceThirdIdModel.h; sourceTree = "<group>"; };
@@ -1041,6 +1045,15 @@
 			path = BackgroundKeepAlive;
 			sourceTree = "<group>";
 		};
+		6BBB35DF2AE935C000E4A59B /* DDYLanguageTool */ = {
+			isa = PBXGroup;
+			children = (
+				6BBB35E02AE935C000E4A59B /* DDYLanguageTool.h */,
+				6BBB35E12AE935C000E4A59B /* DDYLanguageTool.m */,
+			);
+			path = DDYLanguageTool;
+			sourceTree = "<group>";
+		};
 		6BF0F3CD2AD391BE000AA133 /* connectDeviceManager */ = {
 			isa = PBXGroup;
 			children = (
@@ -1111,6 +1124,7 @@
 		A003F6B727D841FF00715CBF /* Vendor */ = {
 			isa = PBXGroup;
 			children = (
+				6BBB35DF2AE935C000E4A59B /* DDYLanguageTool */,
 				6BBB35D42AE7645200E4A59B /* BackgroundKeepAlive */,
 				6BF52C8F2AD5546500A617DB /* pingTool */,
 				18664FEA2AC28A0E008F8A61 /* UDP */,
@@ -1441,6 +1455,7 @@
 				6B3F963A2AD2AD0B008E349E /* newWorkInterface.h in Headers */,
 				18F9CAFC2ABD35C4003FF71A /* ModifyPWDFirstViewController.h in Headers */,
 				1810F9012AA1839C00322116 /* PhoneTimeInfoModel.h in Headers */,
+				6BBB35E22AE935C000E4A59B /* DDYLanguageTool.h in Headers */,
 				6BF0F3D52AD3937B000AA133 /* DeviceThirdIdModel.h in Headers */,
 				18FCE5332AD12FE00020F623 /* ConnectTestViewController.h in Headers */,
 				181E84F22A8F0A9B00292B96 /* HelpDownScrollView.h in Headers */,
@@ -1786,6 +1801,7 @@
 				A031DD7A27EC713A00909527 /* HWSetViewController.m in Sources */,
 				183AE6022A89CE3C00B11CB0 /* JSONValueTransformer.m in Sources */,
 				183AE6522A8A2CF000B11CB0 /* AFAutoPurgingImageCache.m in Sources */,
+				6BBB35E32AE935C000E4A59B /* DDYLanguageTool.m in Sources */,
 				6BBB35DE2AE76AD800E4A59B /* AudioSessionObject.m in Sources */,
 				181E84FC2A8F57A500292B96 /* ChangeLogoViewController.m in Sources */,
 				A031DD7F27EC78C800909527 /* HWAgreementViewController.m in Sources */,

+ 45 - 0
创维盒子/双子星云手机/AppDelegate/AppDelegate.m

@@ -9,6 +9,8 @@
 #import <CoreMotion/CoreMotion.h>
 #import "ShearDeviceUDPManager.h"
 #import "AudioSessionObject.h"
+#import "DDYLanguageTool.h"
+
 @interface AppDelegate (){
     CMMotionManager *cmManager;
 }
@@ -32,6 +34,8 @@
 
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     
+    [self setLanguagesFun];
+    
     //设置默认值
     self.couldPhone_W_PHONE = 720.0;
     self.couldPhone_H_PHONE = 1280.0;
@@ -114,5 +118,46 @@
 }
 
 
+#pragma mark 多国语言相关
+-(void)setLanguagesFun{
+    NSArray *arLanguages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
+    NSLog(@"arLanguages:%@",arLanguages);
+    ///获取设备当前地区的代码和APP语言环境
+    NSString *languageCode = [NSLocale preferredLanguages][0];
+    // 获取国际通用国家地区代码(应该和手机本身有关)
+    NSString *countryCode = [NSString stringWithFormat:@"-%@", [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]];
+//    if (languageCode) {
+//        languageCode = [languageCode stringByReplacingOccurrencesOfString:countryCode withString:@""];
+//    }
+    NSLog(@"countryCode:%@ languageCode : %@",countryCode, languageCode);
+    ///当前APP使用的语言
+    NSString *preferredLanguage = [[[NSBundle mainBundle] preferredLocalizations] firstObject];
+    //获取设备当前地区的代码和APP语言环境
+    NSString *localeIdentifier = [[NSLocale currentLocale] objectForKey:NSLocaleIdentifier];
+    NSLog(@"preferredLanguage:%@ localeIdentifier : %@",preferredLanguage, localeIdentifier);
+    
+    //目前支持 中文(简体 繁体) 英文 日语(还没做)
+    if([languageCode  rangeOfString:preferredLanguage].location != NSNotFound){
+        if([preferredLanguage rangeOfString:@"ja"].location != NSNotFound){
+            //日文现在也显示英文
+            [self setDefaultEnglishFun];
+        }
+        else{
+            [DDYLanguageTool ddy_SetLanguage:@"" complete:^(NSError *error) {
+                   // 刷新rootVC等
+            }];
+        }
+    }
+    else{
+        [self setDefaultEnglishFun];
+    }
+}
 
+#pragma mark 设置当前显示语言为中文
+- (void)setDefaultEnglishFun{
+    //默认设为英文
+    [DDYLanguageTool ddy_SetLanguage:@"en" complete:^(NSError *error) {
+           // 刷新rootVC等
+    }];
+}
 @end

+ 44 - 0
创维盒子/双子星云手机/Vendor/DDYLanguageTool/DDYLanguageTool.h

@@ -0,0 +1,44 @@
+/// MARK: - DDYAuthManager 2018/10/30
+/// !!!: Author: 豆电雨
+/// !!!: QQ/WX:  634778311
+/// !!!: Github: https://github.com/RainOpen/
+/// !!!: Blog:   https://juejin.im/user/57dddcd8128fe10064cadee9
+/// MARK: - App语言切换工具
+
+#import <Foundation/Foundation.h>
+
+#define DDYLocalStr(key)  [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]
+#define DDYLocalStrFromTable(key, tbl)  [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
+
+// 中文(简体 大陆)
+extern NSString *const DDY_CN;
+// 英文(通用)
+extern NSString *const DDY_EN;
+// 中文(繁体 港澳台)
+extern NSString *const DDY_ZHT;
+// 日本语
+extern NSString *const DDY_JA;
+// 法语
+extern NSString *const DDY_FR;
+// 德语
+extern NSString *const DDY_DE;
+// 韩语
+extern NSString *const DDY_KO;
+
+
+extern NSErrorDomain DDYLanguageErrorDomain;
+#define kDDYLanguageErrorSuccess       0  // 设置语言成功 (完成App内语言,不再跟随系统语言)
+#define kDDYLanguageErrorNil          -1  // 语言为空 (恢复跟随系统语言,而不再是App内语言)
+#define kDDYLanguageErrorUnsupport    -2  // 不支持的语言 (设置的语言没有相应的 .lproj 文件)
+#define kDDYLanguageErrorUnknown      -3  // 未知错误
+
+@interface DDYLanguageTool : NSObject
+
+/// 手机系统语言
++ (NSString *)ddy_SystemLanguage;
+/// App应用语言(应用内设置的语言,nil或@""代表只跟随系统)
++ (NSString *)ddy_AppLanguage;
+/// 设置语言 (nil则跟随系统,其他具体语言则查找 language.lproj 配置)
++ (void)ddy_SetLanguage:(NSString *)language complete:(void (^)(NSError *error))complete;
+
+@end

+ 99 - 0
创维盒子/双子星云手机/Vendor/DDYLanguageTool/DDYLanguageTool.m

@@ -0,0 +1,99 @@
+/// MARK: - DDYAuthManager 2018/10/30
+/// !!!: Author: 豆电雨
+/// !!!: QQ/WX:  634778311
+/// !!!: Github: https://github.com/RainOpen/
+/// !!!: Blog:   https://juejin.im/user/57dddcd8128fe10064cadee9
+/// MARK: - DDYLanguageTool.M
+
+#import "DDYLanguageTool.h"
+#import <UIKit/UIKit.h>
+#import <objc/runtime.h>
+
+#define DDYLanguages @"DDYLanguages"
+
+NSString *const DDY_ZHS = @"zh-Hans";
+NSString *const DDY_EN  = @"en";
+NSString *const DDY_ZHT = @"zh-Hant";
+NSString *const DDY_JA  = @"ja";
+NSString *const DDY_FR  = @"fr";
+NSString *const DDY_DE  = @"de";
+NSString *const DDY_KO  = @"ko";
+
+NSErrorDomain DDYLanguageErrorDomain = @"DDYLanguageErrorDomain";
+
+static inline void ddy_Swizzle(Class class, SEL originalSelector, SEL swizzledSelector) {
+    Method originalMethod = class_getInstanceMethod(class, originalSelector);
+    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
+    if (class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))) {
+        class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
+    } else {
+        method_exchangeImplementations(originalMethod, swizzledMethod);
+    }
+}
+
+@implementation NSBundle (DDYLanguage)
+
++ (void)load {
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        ddy_Swizzle([self class], @selector(localizedStringForKey:value:table:), @selector(ddyLanguageLocalizedStringForKey:value:table:));
+        ddy_Swizzle([self class], NSSelectorFromString(@"dealloc"), @selector(ddyLanguageDealloc));
+    });
+}
+
+- (NSString *)ddyLanguageLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName {
+    NSString *language = [[NSUserDefaults standardUserDefaults] objectForKey:DDYLanguages];
+    // 可以加更多条件,比如特定的key,value,tableName才进行交换,否则直接return原方法返回值([language isEqualToString:@"Localizable"])
+    if (language && ![self.bundlePath hasSuffix:@".lproj"]) {
+        NSBundle *languageBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]];
+        if (languageBundle) {
+            return [languageBundle ddyLanguageLocalizedStringForKey:key value:value table:tableName];
+        }
+    }
+    return [self ddyLanguageLocalizedStringForKey:key value:value table:tableName];
+}
+
+- (void)ddyLanguageDealloc {
+    objc_removeAssociatedObjects(self);
+    [self ddyLanguageDealloc];
+}
+
+@end
+
+@implementation DDYLanguageTool
+
+// MARK: - 类方法
+// MARK: 手机系统语言
++ (NSString *)ddy_SystemLanguage {
+    return [[NSLocale preferredLanguages] objectAtIndex:0];
+}
+
+// MARK: App应用语言
++ (NSString *)ddy_AppLanguage {
+    return [[NSUserDefaults standardUserDefaults] objectForKey:DDYLanguages];
+}
+
+// MARK: 设置语言 nil:跟随系统 language:相应语言
++ (void)ddy_SetLanguage:(NSString *)language complete:(void (^)(NSError *))complete {
+    NSError *languageError;
+    if (language == nil || [language isEqualToString:@""]) {
+        [[NSUserDefaults standardUserDefaults] removeObjectForKey:DDYLanguages];
+        languageError = [NSError errorWithDomain:DDYLanguageErrorDomain code:kDDYLanguageErrorNil userInfo:@{@"reason":@"Remove language setting"}];
+    } else {
+        NSBundle *languageBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]];
+        if (languageBundle) {
+            [[NSUserDefaults standardUserDefaults] setObject:language forKey:DDYLanguages];
+            languageError = [NSError errorWithDomain:DDYLanguageErrorDomain code:kDDYLanguageErrorSuccess userInfo:@{@"reason":@"Success"}];
+        } else {
+            languageError = [NSError errorWithDomain:DDYLanguageErrorDomain code:kDDYLanguageErrorUnsupport userInfo:@{@"reason":@"Unsupported language"}];
+        }
+    }
+    [[NSUserDefaults standardUserDefaults] synchronize];
+    if (complete) {
+        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+            complete(languageError);
+        });
+    }
+}
+
+@end