• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 从右到左的语言在运行时更改本地化。无法切换 UI 必须重新启动应用程序

[复制链接]
菜鸟教程小白 发表于 2022-12-12 23:01:11 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

问题是我们想在运行时切换语言。 我们有一个支持英语和阿拉伯语的应用程序。

我正在做的是更改“AppleLanguages”,然后重置 Root View Controller 。 我使用了以下代码:

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableArray* languages = [userDefaults objectForKey"AppleLanguages"];
NSString *language = nil;
if([[languages objectAtIndex:0] isEqual"en"]) {
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects"ar", @"en",nil] forKey"AppleLanguages"];
    language = @"ar";
} else {
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects"en",@"ar", nil] forKey"AppleLanguages"];
    language = @"en";
}
UIViewController *initViewController = [storyBoard instantiateInitialViewController];
[appDelegate.window setRootViewController:initViewController];
appDelegate.window.rootViewController = [storyBoard instantiateViewControllerWithIdentifier"Home"];

appDelegate.window.backgroundColor = [UIColor whiteColor ];
[appDelegate.window makeKeyAndVisible];

原生本地化发生变化,但必须重新启动应用才能看到对 UI 的影响。

提前致谢。



Best Answer-推荐答案


问题在于语言更改没有反射(reflect)在 bundle 上。 所以我无法更改 UI 以及本地化文本。 我们可以使用以下代码来更改捆绑设置。 以下代码将在运行时切换语言。 需要子类化 NSBundle 类,如下所示:- @implementation BundleEx

- (NSString *)localizedStringForKeyNSString *)key valueNSString *)value tableNSString *)tableName
{
NSBundle *bundle = objc_getAssociatedObject(self, &kBundleKey);
if (bundle) {
    return [bundle localizedStringForKey:key value:value table:tableName];
}
else {
    return [super localizedStringForKey:key value:value table:tableName];
}

}

@end

@implementation NSBundle (Language)

+ (void)setLanguageNSString *)language
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    object_setClass([NSBundle mainBundle], [BundleEx class]);
});

BOOL appleTextDirection = NO;
BOOL rightToLeftWritingDirection = NO;

if ([language isEqual"ar"]) {
    rightToLeftWritingDirection  =YES;
    appleTextDirection = NO;

    if ([[[UIView alloc] init] respondsToSelectorselector(setSemanticContentAttribute]) {
        [[UIView appearance] setSemanticContentAttribute:
         UISemanticContentAttributeForceRightToLeft];
    }
}else {
    rightToLeftWritingDirection  =NO;
    appleTextDirection = YES;

    if ([[[UIView alloc] init] respondsToSelectorselector(setSemanticContentAttribute]) {
        [[UIView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight];
    }
}
[[NSUserDefaults standardUserDefaults] setBool:appleTextDirection forKey:@"AppleTextDirection"];
[[NSUserDefaults standardUserDefaults] setBool:rightToLeftWritingDirection forKey:@"NSForceRightToLeftWritingDirection"];
[[NSUserDefaults standardUserDefaults] synchronize];

id value = language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil;
objc_setAssociatedObject([NSBundle mainBundle], &kBundleKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

以及用于切换的代码:-

-(void)toggleTheLanguageWithNSString *)identifier{
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableArray* languages = [userDefaults objectForKey:@"AppleLanguages"];
NSString *language = nil;
if ([[languages objectAtIndex:0] rangeOfString:@"en"].location != NSNotFound) {
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"ar",@"en",nil] forKey:@"AppleLanguages"];
    language = @"ar";
}else  if ([[languages objectAtIndex:0] rangeOfString:@"ar"].location != NSNotFound) {

    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en",@"ar", nil] forKey:@"AppleLanguages"];
    language = @"en";

}

[[NSUserDefaults standardUserDefaults]synchronize];
[NSBundle setLanguage:language];

UIStoryboard *mystoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
self.window.rootViewController = [mystoryboard instantiateViewControllerWithIdentifier:identifier];
[self.window makeKeyAndVisible];
    [UIView transitionWithView:self.window duration:1 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{

    } completion:^(BOOL finished) {

    }];

}

关于ios - 从右到左的语言在运行时更改本地化。无法切换 UI 必须重新启动应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40857870/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap