我正在 ios 平台上建立一个项目,想在这个应用程序中使用两种语言,也想要。用户可以在运行时更改语言假设我们可以使用两个语言按钮按钮 1 用于英语,按钮 2 用于德语,用户可以随时使用这些按钮更改应用程序语言。任何帮助或教程
提前致谢
我正在 ios 平台上建立一个项目,想在这个应用程序中使用两种语言,也想要。用户可以在运行时更改语言假设我们可以使用两个语言按钮按钮 1 用于英语,按钮 2 用于德语,用户可以随时使用这些按钮更改应用程序语言。任何帮助或教程
提前致谢
假设您已经为英语和德语创建了本地化,您的应用将使用在设置中选择的语言(这是首选选项)。
如果您想直接从您的应用程序设置语言:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"];
只会将您的应用程序的语言设置为英语(对于德语,我假设键是“de”)。您还应该:
[[NSUserDefaults standardUserDefaults] synchronize];
在您的应用程序重新启动之前,这不会生效。
使用该方法创建一个类“LanguageUtils”:
- (NSString *) localizedString:(NSString *)key
{
if (self.currentLanguage == nil) {
self.currentLanguage = @"en";
}
NSString* path = [[NSBundle mainBundle] pathForResource:[self.currentLanguage lowercaseString] ofType:@"lproj"];
NSBundle* languageBundle = [NSBundle bundleWithPath:path];
return [languageBundle localizedStringForKey:key value:@"" table:nil];
}
和属性 NSString currentLanguage。
然后在你的 .pch 中做:
#undef NSLocalizedString
#define NSLocalizedString(key, _comment) [[Language sharedInstance] localizedString:key]
像魅力一样工作,您可以在运行时重新定义当前语言。
请记住,您的视图应该由您自己刷新。它不会自动为您完成。
我想出了一个解决方案,允许您使用NSLocalizedString
. 我创建了一个NSBundle
call类别NSBundle+RunTimeLanguage
。界面是这样的。
// NSBundle+RunTimeLanguage.h
#import <Foundation/Foundation.h>
@interface NSBundle (RunTimeLanguage)
#define NSLocalizedString(key, comment) [[NSBundle mainBundle] runTimeLocalizedStringForKey:(key) value:@"" table:nil]
- (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName;
@end
实现是这样的。
// NSBundle+RunTimeLanguage.m
#import "NSBundle+RunTimeLanguage.h"
#import "AppDelegate.h"
@implementation NSBundle (RunTimeLanguage)
- (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSString *path= [[NSBundle mainBundle] pathForResource:[appDelegate languageCode] ofType:@"lproj"];
NSBundle *languageBundle = [NSBundle bundleWithPath:path];
NSString *localizedString=[languageBundle localizedStringForKey:key value:key table:nil];
return localizedString;
}
@end
不仅仅是将导入添加NSBundle+RunTimeLanguage.h
到使用NSLocalizedString
.
如您所见,我将语言代码存储在AppDelegate
. 这可以存储在您想要的任何地方。
我唯一不喜欢的就是NSLocalizedString
marco重新定义的警告。也许有人可以帮我修复这部分。
这非常好,并且在应用程序内以及设备语言发生变化时也会更改语言。我在许多应用程序中都使用了它。
对于本地化,我们通常使用
NSLocalizedString(@"hello",@"Hello World");
在自定义实现中,他们有类似的东西
AMLocalizedString(@"hello",@"Hello World");
这是演示教程
https://github.com/object2dot0/Advance-Localization-in-ios-apps
只需删除
[self dealloc];
从
-(IBAction) languageSelection:(id)sender
所以不会崩溃!!!请享用!
您必须为此使用本地化。只需将键和值存储在 localizable.string 中,然后根据您的要求加载适当的 .string 文件。您可以参考以下教程: http ://www.raywenderlich.com/2876/how-to-localize-an-iphone-app-tutorial
SWIFT 2.0 版本 我们可以在运行时执行此操作,而无需在 Swift 2.0 中重新启动应用程序,如下所示
在类中创建一个函数,假设LanguageManager是类的名称
class LanguageManager
{
static let sharedInstance = LanguageManager()
//Make a function for Localization. Language Code is the one which we will be deciding on button click.
func LocalizedLanguage(key:String,languageCode:String)->String{
//Make sure you have Localizable bundles for specific languages.
var path = NSBundle.mainBundle().pathForResource(languageCode, ofType: "lproj")
//Check if the path is nil, make it as "" (empty path)
path = (path != nil ? path:"")
let languageBundle:NSBundle!
if(NSFileManager.defaultManager().fileExistsAtPath(path!)){
languageBundle = NSBundle(path: path!)
return languageBundle!.localizedStringForKey(key, value: "", table: nil)
}else{
// If path not found, make English as default
path = NSBundle.mainBundle().pathForResource("en", ofType: "lproj")
languageBundle = NSBundle(path: path!)
return languageBundle!.localizedStringForKey(key, value: "", table: nil)
}
}
}
如何使用这个。
现在假设您有两种语言用于应用程序(英语和西班牙语)
英语 - en
西班牙语 - es
假设您必须为标签放置一些东西
//LOGIN_LABEL_KEY is the one that you will define in Localizable.strings for Login label text
logInLabel.text = LanguageManager.sharedInstance.LocalizedLanguage("LOGIN_LABEL_KEY", languageCode: "es")
//This will use the Spanish version of the text.
//"es" is the language code which I have hardcoded here. We can use a variable or some stored value in UserDefaults which will change on Button Click and will be passed in loginLabel
有关语言代码的更多信息,请参阅下面的链接
https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/LanguageandLocaleIDs/LanguageandLocaleIDs.html
或者