我正在通过Swift在XCODE 6.3上制作ios应用程序.我的应用程序将具有选择语言功能,如下图所示
我已经有了当地语言的故事板.但我无法找到如何通过按钮以编程方式更改应用程序的本地化.
任何人都知道如何做到这一点
当我在设备语言上单独更改应用程序使用的语言时,在我关闭应用程序并重新启动它之前它不会生效.如何根据所选语言不再要求重新启动应用程序以再次加载所有nib文件和.strings文件?
我用它在运行时更改语言:
NSArray* languages = [NSArray arrayWithObjects:@"ar", @"en", nil];
[[NSUserDefaults standardUserDefaults] setObject:languages forKey:@"AppleLanguages"];
Run Code Online (Sandbox Code Playgroud) 我似乎有些应用程序可以在应用程序内部更改语言,而无需重新启动应用程序,我想知道它们是如何实现的.
例如,对于我们使用NSLocalizedString
,我知道可以在运行时在未初始化main.m
时设置语言AppDelegate
,但是一旦初始化(特别是创建了视图控制器),更改它直到下次重新启动才会生效
[[NSUserDefaults standardUserDefaults]
setObject:[NSMutableArray arrayWithObjects:language, nil]
forKey:@"AppleLanguages"];
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何在不重新启动应用程序的情况下完成这些动态语言更改?
我正在本地化我的iOS应用程序,并且在模拟器中它每次都以我选择的语言正确运行.
在我的iPhone 5上进行测试时,它只会在应用首次运行时正确检测语言.每次我在设备上重新编译并运行我的应用程序时,它会检测到"en"作为语言,即使我选择了Español("es")进行测试.
我使用以下方法检测语言:
[[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0]
我也用过:
[[NSLocale preferredLanguages] objectAtIndex:0]
结果相同.
如果我在第一次运行后终止应用程序,并在设备上重新启动它,它会继续正确检测语言.
但是如果我杀死应用程序然后在初始运行后通过Xcode重新编译/重新启动,它将加载"en"(英语)而不是检测到.
之后,杀死并重新启动应用程序会持续检测为英语,除非我完全删除应用程序,并通过Xcode重新编译/重新安装/运行应用程序.然后循环重复...后续重建/重启而不首先从设备中删除应用程序导致错误检测.
我的设备上的所有其他应用程序一直显示西班牙语.整个UI以西班牙语显示.
更新:我现在已经在运行iOS 6的iPad(第3代)上进行了测试,并且遇到了相同的行为.
更新2:
在didFinishLaunchingWithOptions中,我有这个代码来检测语言:(语言是NSString*):
language = [[NSLocale preferredLanguages] objectAtIndex:0];
接下来是这个调试语句,比较我得到的值,以及稍微不同的检测方式,仅用于调试:
NSLog(@"Detected language: %@ / %@", language, [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0]);
当应用程序在西班牙语模式下正常工作时,输出显示为"检测到的语言:es/es",然后显示为"检测到的语言:en/en".仍然不知道为什么它决定加载为英语有时......
更新4:我感谢大家的答案,我尝试了各种建议.不幸的是,我无法奖励+100赏金,因为没有任何建议似乎解决了这个问题.如果某人确实找到了适合我的解决方案,那么我将在那时再向他们奖励+50赏金.
更新5:我已经从Xcode 4.5更新到4.5.2,并遇到了同样的问题.
更新6:我现在已经从头开始创建了一个新的测试项目,它工作得很好!显然,我的项目布局方式或者可能是其中一个数据文件中的某些内容必定是错误的.我想我的下一个旅程将是从头开始重新创建项目,逐个复制文件数据......
更新7(稍后):可悲的是,在通过精心重建我的项目暂时解决(看似)之后,我再次面临这个问题.在第一次加载时,语言被正确呈现,但在后续加载时,它将恢复为英语.
已解决请参阅下面的最终解决方案.感谢大家的帮助.我可能会拿出一些赏金,因为无论如何它都会浪费掉.
有没有办法在运行时更改应用程序语言?
因此,更改后NSLocalizedString
立即返回新语言的字符串.
我现在正在做的是使用以下代码更改语言:
- (void)onChangeLanguage: (id)sender
{
NSArray *lang = [NSArray arrayWithObjects:((InfoWhatever *)sender).language, nil];
[[NSUserDefaults standardUserDefaults] setObject:lang forKey:@"AppleLanguages"];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
NSString *currentLanguage = [languages objectAtIndex:0];
NSLog(@"Current language: %@", currentLanguage);
}
Run Code Online (Sandbox Code Playgroud)
只有在重新启动应用程序后,语言才会更改.
如何更改Xcode 5中的语言
我有3个按钮 ChangeLanguageViewController
这是:
这是代码:
#import <UIKit/UIKit.h>
@interface ChangeLanguageViewController :UIViewController
-(IBAction)changeEnglish:(id)sender;
-(IBAction)changeChinesesimplified:(id)sender;
-(IBAction)changeBahasaMalaysia:(id)sender;
-(IBAction)changeEnglish:(id)sender{
[[NSUSerDefaults standardUSerDefaults] setObject:[NSArray arrayWithObjects:@"en", @"zh-Hans", @"ms", nil] forKey:@"AppleLanguage"];
}
-(IBAction)changeChinesesimplified:(id)sender{
[[NSUSerDefaults standardUSerDefaults] setObject:[NSArray arrayWithObjects:@"zh-Hans", @"ms", @"en", nil] forKey:@"AppleLanguage"];
}
-(IBAction)changeBahasaMalaysia:(id)sender{
[[NSUSerDefaults standardUSerDefaults] setObject:[NSArray arrayWithObjects:@"ms",@"en",@"zh-Hans", nil] forKey:@"AppleLanguage"];
}
Run Code Online (Sandbox Code Playgroud)
我想看到当用户按下按钮时语言发生变化,它不会杀死应用程序,但会改变应用程序内部的语言
我正在为iOS构建一个以英语和法语提供的应用程序.我已经阅读了一些关于国际化的教程,并且我了解它是如何工作的以及我需要做什么.
我遇到的问题是有一个特定的情况,我想为英语用户加载法语字符串.
我知道可以为整个应用程序设置语言,但是它需要在应用程序生效之前重新启动它.我想避免这种情况,而是能够根据需要选择加载法语或英语字符串.
是否可以通过编程方式从特定语言的.strings文件中加载字符串?
xcode localization internationalization nslocalizedstring ios
我正在开发一个应用程序,除其他外,将播放一个大型音频文件(30MB).
我想将应用程序提交到几个国家/地区的App Store.每个目标国家/地区的音频文件不同,应用程序的其余部分保持不变(尽管已本地化).
我为每个国家创建了一个目标,一个bash脚本负责根据目标将正确的音频文件复制到已编译的应用程序中,并且效果很好.
我还对资源(Images和Localized.strings)进行了本地化,以便于维护.
假设我为瑞典制定了目标,我想只包括瑞典语本地化以强制应用程序始终显示瑞典语(与音频文件匹配).
以下是实际问题:*如何从目标中排除所有本地化或强制目标仅使用特定的本地化,而不管手机设置如何?
我正在测试本地化功能的小型iOS 7项目存在以下问题.
NSString *title = NSLocalizedString(@"MY_BUTTON", @"My comment for my button");
[self.myButton setTitle:title forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)
/*我对我的按钮的评论*/"MY_BUTTON"="我的[VALUE]按钮"; 其中VALUE = Base,Dutch; 所以标签应该是我的基本按钮和我的荷兰按钮
问题:如果我使用模拟器的语言作为荷兰语启动我的应用程序,标签是(按预期)"我的荷兰按钮".如果我用英文启动它,标签是"我的基本按钮"(好吧......)
但是,如果我将手机的语言设置为法语启动它,而我之前将其设置为荷兰语,则按钮的标签不会默认为Base,而是再次显示"My Dutch Button"
有什么想法吗?
谢谢
我正在构建一个我已经发布的应用程序版本,但有一些更改.它不是一个精简/完整版本关系,但它们足够相似,我正在使用具有不同目标的相同项目.
我想重新编写我在新版本的第一个版本中使用的几乎所有字符串,并且想知道解决此问题的最佳方法.我没有在声明每个字符串之前使用#ifdef/#else语句,而是考虑使用NSLocalizedStrings.但是,实际语言仍然相同.
我在这篇文章中读到你可以自己设置语言,所以大概我可以发明自己的语言并将其设置为那个.但我想知道这是不是最好的办法?任何建议都是最受欢迎的.
ios ×8
localization ×7
xcode ×6
objective-c ×4
iphone ×2
xcode4 ×2
base ×1
cocoa ×1
performance ×1
swift ×1
target ×1