2

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

提前致谢

4

7 回答 7

8

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

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

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

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

[[NSUserDefaults standardUserDefaults] synchronize];

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

于 2013-04-16T08:50:30.707 回答
3

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

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

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

于 2013-08-05T10:57:17.613 回答
2

我想出了一个解决方案,允许您使用NSLocalizedString. 我创建了一个NSBundlecall类别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. 这可以存储在您想要的任何地方。

我唯一不喜欢的就是NSLocalizedStringmarco重新定义的警告。也许有人可以帮我修复这部分。

于 2014-05-01T18:28:57.450 回答
1

非常好,并且在应用程序内以及设备语言发生变化时也会更改语言。我在许多应用程序中都使用了它。

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

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

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

 AMLocalizedString(@"hello",@"Hello World");
于 2013-04-16T09:24:41.783 回答
1

这是演示教程

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

只需删除

 [self dealloc];

 -(IBAction) languageSelection:(id)sender

所以不会崩溃!!!请享用!

于 2013-08-05T10:46:13.333 回答
0

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

于 2013-04-16T08:41:31.870 回答
0

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

或者

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

于 2015-10-29T06:25:56.187 回答