gpt4 book ai didi

iOS - 通过按钮更改用户的语言

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:01:23 27 4
gpt4 key购买 nike

我正在制作一个仅使用自定义图形和旁白的交互式 child 故事。

我有英语和西类牙语的所有图形。

我在任何地方都没有任何非自定义按钮,没有文本字段,也没有单个“标准”Apple 应用程序 UI 元素。一切都是自定义 PNG 文件。

我只是在寻找一种允许用户从英语切换为西类牙语或反之亦然的方法。

我已经创建了一个自定义的英语和西类牙语按钮,按下时会突出显示。

该应用程序将(根据我的阅读需要重新启动),然后该应用程序将显示其西类牙语页面(以及嵌入 PNG 中的西类牙语文本)。西类牙旁白将随之而来。

用户可以随时选择点击英语语言按钮,并在需要时返回英语。

Tabtale 的“美人鱼公主”应用程序在这方面做得非常好,远远超出我的需要,但它是我所追求的一个很好的例子。您单击一个按钮,更改您的区域,应用程序重新启动,并且您选择的区域的所有自定义文本和旁白结果。

我只有两个地区(语言),所以我的需求要简单得多。

但是究竟如何才能真正做到这一点呢?

干杯!

最佳答案

好吧,这比我想象的要难得多......


基本上,我通过使用 NSBundle 上的一个类别和一种名为 isa-swizzeling 的技术来交换将由 NSLocalizedString(…) 调用的 NSBundle 方法


NSBundle+Language.h

#import <Foundation/Foundation.h>

@interface NSBundle (Language)
+(void)setLanguage:(NSString*)language;

@end

NSBundle+Language.m

#import "NSBundle+Language.h"
#import <objc/runtime.h>

static const char associatedLanguageBundle=0;

@interface PrivateBundle : NSBundle
@end

@implementation PrivateBundle
-(NSString*)localizedStringForKey:(NSString *)key
value:(NSString *)value
table:(NSString *)tableName
{
NSBundle* bundle=objc_getAssociatedObject(self, &associatedLanguageBundle);
return bundle ? [bundle localizedStringForKey:key
value:value
table:tableName] : [super localizedStringForKey:key
value:value
table:tableName];
}
@end

@implementation NSBundle (Language)
+(void)setLanguage:(NSString*)language
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
object_setClass([NSBundle mainBundle],[PrivateBundle class]);
});

objc_setAssociatedObject([NSBundle mainBundle], &associatedLanguageBundle, language ?
[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end

AppDelegate 将监听 LANGUAGE_WILL_CHANGE 通知,设置语言并广播通知 LANGUAGE_DID_CHANGE

AppDelegate.m

#import "AppDelegate.h"
#import "NSBundle+Language.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageWillChange:) name:@"LANGUAGE_WILL_CHANGE" object:nil];

NSString *targetLang = [[NSUserDefaults standardUserDefaults] objectForKey:@"selectedLanguage"];
[NSBundle setLanguage:targetLang?:@"en"];
return YES;
}

-(void)languageWillChange:(NSNotification *) noti
{
NSString *targetLang = [noti object];
[[NSUserDefaults standardUserDefaults] setObject:targetLang forKey:@"selectedLanguage"];

[NSBundle setLanguage:targetLang];

[[NSNotificationCenter defaultCenter] postNotificationName:@"LANGUAGE_DID_CHANGE" object:targetLang];
}


@end

BaseViewController 将发送 LANGUAGE_WILL_CHANGE 并监听 LANGUAGE_DID_CHANGE


BaseViewController.h

#import <UIKit/UIKit.h>

@interface BaseViewController : UIViewController
-(void) languageDidChange;
- (IBAction)switchLanguage:(id)sender;
@end

BaseViewController.m

#import "BaseViewController.h"

@interface BaseViewController ()
@property (weak, nonatomic) IBOutlet UIButton *englishButton;
@property (weak, nonatomic) IBOutlet UIButton *spanishButton;

@end

@implementation BaseViewController

- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageDidChangeNotification:) name:@"LANGUAGE_DID_CHANGE" object:nil];
}

- (IBAction)switchLanguage:(id)sender {

NSString *localString;
if (self.englishButton == sender) {
localString = @"en";
} else if(self.spanishButton == sender){
localString = @"es";
}

if (localString) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"LANGUAGE_WILL_CHANGE" object:localString];
}
}

-(void)languageDidChangeNotification:(NSNotification *)notification
{
[self languageDidChange];
}

-(void)languageDidChange
{

}

@end

现在任何子类 BaseViewController 的 View Controller 都可以实现 languageDidChange 来调用 NSLocalizedString


ViewController.m

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
[self languageDidChange];
}


-(void)languageDidChange
{
self.label.text = NSLocalizedString(@"Hello World", nil);
self.imageView.image = [UIImage imageNamed:NSLocalizedString(@"image.png", nil)];
}

@end

你看,我只是简单地本地化图像名称,我将图像 en_image.pnges_image.png 添加到图像 Assets 包中,并将它们映射到可本地化的字符串

"image.png" = "en_image.png";

"image.png" = "es_image.png";

结果

enter image description here


您可以在此处找到此示例代码:https://github.com/vikingosegundo/ImmidiateLanguageChange

关于iOS - 通过按钮更改用户的语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29872222/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com