Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在运行时使用iphone SDK中的两个按钮更改应用程序语言?_Iphone_Ios_Objective C_Ios4 - Fatal编程技术网

如何在运行时使用iphone SDK中的两个按钮更改应用程序语言?

如何在运行时使用iphone SDK中的两个按钮更改应用程序语言?,iphone,ios,objective-c,ios4,Iphone,Ios,Objective C,Ios4,我正在ios平台上建立一个项目,希望在此应用程序中使用两种语言 而且还想要。用户可以在运行时更改语言,假设我们可以使用两个语言按钮按钮1(英语)和按钮2(德语),用户可以随时使用这些按钮更改应用程序语言。有什么帮助或教程吗 提前感谢您必须为此使用本地化。只需将键和值存储在side localizable.string中,并根据需要加载相应的.string文件。 有关此信息,您可以参考以下教程: 假设您已为英语和德语创建本地化,您的应用程序将使用“设置”中选择的语言(这是首选选项) 如果要直接从应

我正在ios平台上建立一个项目,希望在此应用程序中使用两种语言 而且还想要。用户可以在运行时更改语言,假设我们可以使用两个语言按钮按钮1(英语)和按钮2(德语),用户可以随时使用这些按钮更改应用程序语言。有什么帮助或教程吗


提前感谢

您必须为此使用本地化。只需将键和值存储在side localizable.string中,并根据需要加载相应的.string文件。 有关此信息,您可以参考以下教程:

假设您已为英语和德语创建本地化,您的应用程序将使用“设置”中选择的语言(这是首选选项)

如果要直接从应用程序设置语言:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"];
将应用程序的语言设置为英语(对于德语,我假设键为“de”)。你亦应:

[[NSUserDefaults standardUserDefaults] synchronize];
这将在应用程序重新启动之前生效。

非常好,应用程序内的语言以及设备语言更改时都会更改。我在很多应用程序中都使用了这个

对于本地化,我们通常使用

 NSLocalizedString(@"hello",@"Hello World"); 
在自定义实现中,它们有类似的内容

 AMLocalizedString(@"hello",@"Hello World");
这里是演示教程

移除

 [self dealloc];

所以它不会崩溃!!!享受吧

使用该方法创建一个类“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
而不仅仅是将import
NSBundle+RunTimeLanguage.h
添加到使用
NSLocalizedString
的文件中

如您所见,我将语言代码存储在
AppDelegate
的属性中。这可以存放在你想要的任何地方


我唯一不喜欢的是一个警告,
NSLocalizedString
marco重新定义了它。也许有人能帮我修理这个部件。

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
有关语言代码的更多信息,请参见下面的链接



:这是一种有效的方法。但您必须重新启动不友好的应用程序。正确。但苹果不重启应用程序就无法更改语言。我想你可以通过编程自己重新实现本地化,但这不是很吸引人。是的,实际上我也遇到了同样的问题,但要求是在应用程序中,用户应该能够更改语言,当时我没有任何方法,所以我遵循了以下教程。似乎在iOS 7.1模拟器中工作。无需重新启动直到重新启动,操作系统8才工作。但这是为了测试,所以重新启动是可以的,事实上,我添加了一个退出(1)来强制在更改语言后崩溃应用程序,hacky,但是有效。这对storyboard有效吗,意味着如果我们想更改storyboard(或xib)上uielement的文本我们可以将文本更改为新的集合语言吗?您可以在之前添加一个
#undef NSLocalizedString
,以消除重新定义警告此方法的缺点是
genstrings
命令不再起作用
//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