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

Posted

技术标签:

【中文标题】如何使用 iphone SDK 中的两个按钮在运行时更改应用程序语言?【英文标题】:how to change Application language on run time using Two Button in iphone SDK? 【发布时间】:2013-04-16 08:29:05 【问题描述】:

我正在 ios 平台上构建一个项目,并希望在此应用程序中使用两种语言 并且还想要。用户可以在运行时更改语言假设我们可以使用两个语言按钮按钮 1 用于英语,按钮 2 用于德语,用户可以随时使用这些按钮更改应用程序语言。任何帮助或教程

提前致谢

【问题讨论】:

【参考方案1】:

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

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

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"];

会将您的应用程序的语言仅设置为英语(对于德语,我假设键是“de”)。您还应该:

[[NSUserDefaults standardUserDefaults] synchronize];

这在您的应用程序重新启动之前不会生效。

【讨论】:

:这是有效的方法。但是您必须重新启动对用户不友好的应用程序。 正确。但是Apple不允许在不重新启动应用程序的情况下更改语言。我想您可以通过编程方式自己重新实现本地化,但这并不是很吸引人。 是的,实际上我也遇到了同样的问题,但要求就像在应用程序中用户应该能够更改语言当时我没有任何办法,所以我按照以下教程进行操作。 似乎在 iOS 7.1 模拟器中工作。无需重启 iOS 8 在重新启动之前无法工作。但这是为了测试,所以重启就ok了,其实我加了一个exit(1),就是改语言后强制让app崩溃,hacky,但是可以。【参考方案2】:

有一个使用该方法的类“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]

像魅力一样工作,您可以在运行时重新定义当前语言。

请记住,您的视图应该由您自己刷新。它不会自动为您完成。

【讨论】:

【参考方案3】:

我想出了一个允许您使用NSLocalizedString 的解决方案。我创建了一个NSBundle 类别,调用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 重新定义的警告。也许有人可以帮我修复这部分。

【讨论】:

您可以在前面添加#undef NSLocalizedString 以消除重定义警告【参考方案4】:

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

对于本地化我们通常使用

 NSLocalizedString(@"hello",@"Hello World"); 

在自定义实现中,他们有类似的东西

 AMLocalizedString(@"hello",@"Hello World");

【讨论】:

这种方法的缺点是genstrings命令已经失效了【参考方案5】:

这里是演示教程

https://github.com/object2dot0/Advance-Localization-in-ios-apps

只需删除

 [self dealloc];

来自

 -(IBAction) languageSelection:(id)sender

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

【讨论】:

这个工作与故事板一起工作,意味着如果我们想更改故事板(或 xib)上 uielement 的文本,我们可以将文本更改为新的设置语言【参考方案6】:

您必须为此使用本地化。只需将键和值存储在 localizable.string 中,然后根据您的要求加载适当的 .string 文件。 您可以参考以下教程: http://www.raywenderlich.com/2876/how-to-localize-an-iphone-app-tutorial

【讨论】:

【参考方案7】:

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)
        
    

如何使用它。 现在假设您的应用程序有两种语言(英语和西班牙语) 英语 - zh 西班牙语 - 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

http://www.ibabbleon.com/iOS-Language-Codes-ISO-639.html

【讨论】:

以上是关于如何使用 iphone SDK 中的两个按钮在运行时更改应用程序语言?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iphone sdk 中裁剪图像圈

如何提交在iPhone OS 3和iPhone SDK 4上运行的应用程序版本?

iPhone SDK:如何在警报中获取 UITextField 的值?

iphone sdk 4.0 中的按钮尺寸变小了

iPhone SDK - 像相机应用程序中的扩展按钮

在 iphone sdk 中将固定大小的圆形按钮设置为图像