我有一个iPhone应用程序,它有一个按钮,可以在运行时更改显示语言.我查看了NSLocalizedString(),它将根据系统偏好返回相应的字符串.我有什么选择而不是硬编码所有显示字符串并根据运行时用户语言选择返回?任何指针都将非常感激.
我正在构建一个我已经发布的应用程序版本,但有一些更改.它不是一个精简/完整版本关系,但它们足够相似,我正在使用具有不同目标的相同项目.
我想重新编写我在新版本的第一个版本中使用的几乎所有字符串,并且想知道解决此问题的最佳方法.我没有在声明每个字符串之前使用#ifdef/#else语句,而是考虑使用NSLocalizedStrings.但是,实际语言仍然相同.
我在这篇文章中读到你可以自己设置语言,所以大概我可以发明自己的语言并将其设置为那个.但我想知道这是不是最好的办法?任何建议都是最受欢迎的.
我正在为我的应用程序使用单个本地化的Storyboard.该应用程序必须有一个选项来动态更改语言.到目前为止,我想出了如何更改应用程序启动期间使用的语言:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", @"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize]; //to make the change immediate
Run Code Online (Sandbox Code Playgroud)
并设法通过删除关键窗口的所有子视图重新加载我的整个应用程序,从故事板重新加载初始视图控制器并使其成为新的根视图控制器.(它有一些问题,比如管理开放资源,但可以做到.)
我唯一想知道的是如何强制iOS以新语言重新加载故事板?似乎故事板以某种方式缓存,并且-UIStoryboad:stroyboardWithName:fromNib不会完全重新加载它,所以它出现在最后一种语言中.
我已经考虑了其他两个选择:
每种语言都有不同的故事板文件(这是无法管理的,我不想这样做)
在我的所有视图控制器中使用事件侦听器,它们响应语言更改并在UI上设置新字符串(每次从故事板中实例化任何接口元素时也必须调用它).这个解决方案需要更多的时间,而不是我们想要花费的时间,并且还大大增加了错误的可能性.
还有一些更聪明的方法吗?我不想保持我的应用程序的当前状态,所以重新启动它就像它被杀死和实现似乎是一个合理的解决方案.
我正在尝试实现可以更改应用程序语言的功能.
我试着像这样设置:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject("de", forKey: "AppleLanguages")
Run Code Online (Sandbox Code Playgroud)
应用程序重启后语言仍为"系统默认".
现在我通过设置测试不同的语言Scheme > Application Language > language.
但用户是否可以单击按钮并在重新启动后查看所选语言?
还有什么方法可以避免在重启时更改语言?
我用意大利语和英语本地化我的应用程序,使用Localizable.strings文件和NSLocalizedString macro.我也启用了base localization.在iOS 8的模拟器和设备上一切正常,但在iOS 9上,应用程序始终使用英语,即使在iPhone设置中选择默认意大利语的设备上也是如此.iOS 9是否会改变本地化?
这是Xcode本地化设置的屏幕截图
1
以及用于测试的设备

提前致谢
我想在我的应用程序中有一个选项来改变我的应用程序语言(只是应用程序语言而不是整个系统),请你给我一些提示?
提前致谢,
我知道本地化!
有没有办法在运行单元测试时强制使用特定的语言环境?
例如。始终使用 en_US 或强制无语言环境,以便不加载任何 .lproj 文件。
我的单元测试对设置应用程序(在 iOS 模拟器中)中当前选择的语言很敏感。最好我希望我的单元测试对语言不敏感。
下面是我的单元测试代码,显示了问题
@interface MYGalleryTests : SenTestCase
@end
@implementation MYGalleryTests
-(void)test0 {
// This test doesn't work.
// I get 'No pictures' when locale is en_US
// I get 'Ingen billeder' when locale is da_DK
NSString* actual = [MYGallery emptyMessage];
NSString* expected = @"EMPTY_MESSAGE";
STAssertEqualObjects(actual, expected, nil);
}
@end
@interface MYGallery : NSObject
+(NSString*)emptyMessage;
@end
@implementation MYGallery
+(NSString*)emptyMessage {
return NSLocalizedStringFromTable(@"EMPTY_MESSAGE", @"Gallery", @"Message shown when gallery is empty");
}
@end
en.lproj/Gallery.strings
/* Message …Run Code Online (Sandbox Code Playgroud) 有没有办法将XCTest单元测试切换到从右到左模式来测试应用程序的阿拉伯语版本,其中句子从屏幕的右侧到左侧写入?我的应用代码逻辑基于语言方向表现不同.我想在单元测试中验证此功能.我需要做的是从XCTest单元测试用例将应用程序切换到从右到左的语言模式.
通过将Scheme的应用程序语言设置更改为从右到左的伪语言,可以以从右到左的模式运行应用程序.有没有办法在单元测试中做类似的事情?
我最终将semanticContentAttribute测试中的视图更改为.ForceRightToLeft.它做我需要做的事情.虽然它感觉不是一个非常干净的方法.首先,它只适用于iOS 9.其次,看起来我正在从单元测试中修改我的应用程序视图.相反,如果有可能,我宁愿将整个应用程序的语言从右向左切换.
class MyTests: XCTestCase {
func testRightToLeft() {
if #available(iOS 9.0, *) {
let view = UIView()
view.semanticContentAttribute = .ForceRightToLeft
// Test code involving the view
}
}
}
Run Code Online (Sandbox Code Playgroud) 我的应用程序在运行时更改语言,并建议用户重新启动应用程序.我是这样做的:
typealias LanguageLocaleType = (language: String?, locale: String?, title: String)
let elements: [LanguageLocaleType] = [
(nil, nil, "System Default"),
("en", "en_US", "English"),
("ar", "ar_SA", "Arabic"),
]
//...func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)...
let element = elements[indexPath.row]
guard let language = element.language else {
// How to really reset app back to OS language/locale???
UserDefaults.standard.removeObject(forKey: "AppleLanguages")
UserDefaults.standard.removeObject(forKey: "AppleLocale")
return
}
UserDefaults.standard.set([language], forKey: "AppleLanguages")
if let locale = element.locale, !locale.isEmpty,
Locale.current.identifier != locale,
!Locale.current.identifier.hasPrefix("\(language)_") {
UserDefaults.standard.set(locale, forKey: "AppleLocale")
}
Run Code Online (Sandbox Code Playgroud)
我想提供在列表中设置语言并选择正确的语言,其中一个语言被提供给语言设置System …
我正在尝试更改应用程序语言,但是当我关闭应用程序并再次运行它后,我在main.h语言chages中运行此代码.这可以在不重新启动的情况下更改语言吗?
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSArray *languages = [NSArray arrayWithObject:@"en_GB"];
[[NSUserDefaults standardUserDefaults] setObject:languages forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
Run Code Online (Sandbox Code Playgroud)