Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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
如何设置iOS应用程序的默认本地化_Ios_Objective C_Iphone_Xcode - Fatal编程技术网

如何设置iOS应用程序的默认本地化

如何设置iOS应用程序的默认本地化,ios,objective-c,iphone,xcode,Ios,Objective C,Iphone,Xcode,我正在为说俄语的人开发应用程序。俄罗斯附近的许多国家都有第二语言——俄语。我的应用程序有两种本地化:俄语和英语。我需要将俄语本地化设置为默认值。英语应该只适用于像设备语言一样使用英语的人 我知道苹果建议在设置中优先使用首选语言,但我有一个重要的理由不遵循这一建议 如何将俄语本地化设置为默认值?您可能需要在Info.plist中将俄语设置为CFBundleDevelopmentRegion的值 CbundleDevelopmentRegion(String-iOS,OS X)指定捆绑包的本机区域。

我正在为说俄语的人开发应用程序。俄罗斯附近的许多国家都有第二语言——俄语。我的应用程序有两种本地化:俄语和英语。我需要将俄语本地化设置为默认值。英语应该只适用于像设备语言一样使用英语的人

我知道苹果建议在设置中优先使用首选语言,但我有一个重要的理由不遵循这一建议


如何将俄语本地化设置为默认值?

您可能需要在Info.plist中将俄语设置为
CFBundleDevelopmentRegion
的值

CbundleDevelopmentRegion(String-iOS,OS X)指定捆绑包的本机区域。此键包含一个字符串值,该值通常对应于编写包的人的母语。如果无法找到用户首选区域或语言的资源,则此值指定的语言将用作默认语言

更新 如果您确实想要并且需要覆盖操作系统的语言优先级,您可以使用
AppleLanguages
user defaults键(不过,正如您所知,不建议这样做):


我认为您需要使用文件中的
本地化本地开发区域


我没有找到正确的解决方案。唯一适合我的问题的方法是使用
NSLocalizedStringFromTableInBundle
而不是
nsLocalizedStrings
。这种方式不允许对图像或笔尖进行本地化,但使用字符串时效果很好

首先,您需要定义当前设备语言:

NSString *lang = (NSString *)[[NSLocale preferredLanguages] objectAtIndex:0];
NSBundle *myLangBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:lang ofType:@"lproj"]];
接下来查找此语言的捆绑包:

NSString *lang = (NSString *)[[NSLocale preferredLanguages] objectAtIndex:0];
NSBundle *myLangBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:lang ofType:@"lproj"]];
如果找到捆绑包,请在
NSLocalizedStringFromTableInBundle
中使用它:

_label.text = NSLocalizedStringFromTableInBundle(@"LabelText",nil,myLangBundle,nil);

否则,请查找并使用默认捆绑包。

正如eofster所说,您应该将
AppleLanguages
键设置为
NSUserDefaults
以所需的顺序排列语言,但为了在第一次午餐时工作,您应该很早就开始,甚至早于
applicationwill午餐with选项:

对于我来说,这个解决方案非常有效,并且在使用
NSLocalizedStringFromTableInBundle
时具有优势,因为它也适用于故事板和NIB

下面是关于Swift语言的逐步解决方案

  • 创建UIApplication的子类,如下所述:

  • 第二个重写
    init
    方法,您可以使用
    UIApplication
    子类自己替换首选语言列表

    override init() {
        if let languages = NSUserDefaults.standardUserDefaults().objectForKey("AppleLanguages") as? [String],
            let language = languages.first where !language.hasPrefix("en")
        {
            NSUserDefaults.standardUserDefaults().setObject(["ru", "en"], forKey: "AppleLanguages")
        }
    
        super.init()
    }
    
    Swift 4:

    override init() {
    if let languages = UserDefaults.standard.object(forKey: "AppleLanguages") as? [String],
        let language = languages.first(where:{!$0.hasPrefix("en")})
    {
        UserDefaults.standard.set(["ru", "en"], forKey: "AppleLanguages")
    }
    
    super.init()
    
    }

  • 就这些。若首选语言不是英语,你们将用俄语代替列表


  • 另外,如果您不仅要进行本地化,还要进行国际化,请不要忘记检查日期选择器、日期格式化程序、数字格式化程序等使用的区域设置。

    在我的应用程序中,我只有带硬编码字符串的俄语本地化,但我使用带有本地化包的库。默认情况下,库中的字符串为英语。因为
    NSBundle.mainBundle.preferredLanguages
    [“en”]

    在我用
    CbundleLocalizations
    键在Info.plist中指定应用程序本地化语言后,它们变成了俄语:

    CbundleLocalizations(Array-iOS,OS-X)标识本地化 由应用程序手动处理。如果您的可执行文件未绑定或 不使用现有的bundle本地化机制,您可以包括 此键用于指定应用程序处理的本地化

    此属性数组中的每个条目都是一个字符串,用于标识 受支持对象的语言名称或ISO语言标识符 本地化。请参阅中的“语言和区域设置” 国际化中的国际化与本土化引导 有关如何指定语言标识符的信息的文档


    首选语言有时返回“ru_ru”,但我的lproj是ru.lproj。所以我决定换一个解决方案。 我在所有可本地化的字符串文件中添加了“test.lang.phrase=“YES”;如果找不到本地化,我将加载默认本地化

    NSString *result = nil;
    NSString *testLang = NSLocalizedString(@"test.lang.phrase", nil);
    if ([testLang isEqualToString:@"YES"]) {
        result = NSLocalizedString(str, nil);
    }
    if (!result) {
        NSBundle *myLangBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]];
        result = NSLocalizedStringFromTableInBundle(str, nil, myLangBundle,nil);
    }
    

    我尝试过这样做,但没有结果。如果您按下Info.plist中CbundledevelopmentRegion字段的值,您可以看到XCode仅为该参数建议了11种语言。我尝试手动输入“ru”“但没有结果。您的应用程序有俄语和英语本地化,并且该键设置为ru,对吗?”?然后选择其他语言,比如西班牙语,用户界面仍然是英语?我注意到,至少在iOS 7中,操作系统考虑了系统首选项中语言的顺序。因此,如果您在英语之后切换到西班牙语,则顺序将是西班牙语、英语、俄语,并且应用程序将使用英语。看看情况是否如此。例如,在俄语之后切换到不支持的语言。是的,如果顺序为:西班牙语、俄语、英语,则应用程序使用俄语。但是,例如在乌克兰,很多人在买了iPhone之后,会先选择乌克兰语,并且永远不会改变语言顺序。在这种情况下,乌克兰用户的第二项顺序为英语。设置
    AppleLanguages
    键可能会出现问题。你可能必须很早就设置它,就像在main()中一样。这个问题已经有6年了,苹果没有解决它。这就是人们的答案@hasan83不为我工作。你能提出一个解决方案吗。