美文网首页iOS开发 国际化
iOS修改App默认语言

iOS修改App默认语言

作者: BiBiMan | 来源:发表于2023-05-11 20:33 被阅读0次

    现在越来越多的“螺丝”厂商加入了地球村,走上了国际大舞台,国际化的道路是越走越宽、越走越远,App也要国际化以避免不必要的使用障碍,方能更好地服务于地球村,所以我们就先来说一说如何国际化(本地化)App。
    在App开发过程中可Localize...本地化的文件很多,其中包括.string.xib(.nib).plist.json.storyboard(故事板).bundle.xcassets(Image/Color Set)等等都是可以做本地化配置。

    .strings .xib .plist .json .storyboard .bundle .xcassets/Image .xcassets/Color 在实际开发过程中不难发现以上文件会有一些共同之处,一般在文件属性配置区都能看到Localize...按钮或者文件下拉列表区能看到xx.lproj文件夹,不同的是在多语言本地配置的方式上有所区别。下面我们就以.json文件为例,来实操一下如何将.json本地化(国际化),在不同的系统语言与地区下,展现不同的json数据。
    第一步:创建一个Localizable.json文件,并将文件添加进项目中。Xcode没有直接Command+N创建.json文件的选项,我们可以使用终端命令行touch Localizable.json创建一个.json文件内容如下:
    [
        {
            "country":"中国",
            "telCode":"+86"
        },
        {
            "country":"俄罗斯",
            "telCode":"+7"
        },
        {
            "country":"朝鲜",
            "telCode":"+850"
        },
        {
            "country":"巴基斯坦",
            "telCode":"+92"
        },
        {
            "country":"塞尔维亚",
            "telCode":"+381"
        }
    ]
    

    第二步:开启Localizable.json文件本地化能力,新增需要支持的国家语言配置。在App开发过程中默认的开发语言是English - Development Localization,根据第一步创建的文件内容,我们需要新增中国俄罗斯、朝鲜、巴基斯坦、塞尔维亚五国语言。

    开启本地化能力 添加多国语言 完成以上步骤后,现在的Localizable.json是这样的: Localizable.json
    第三步:分别将本地化后生成的Localizable.json文件内容进行相应翻译,这里使用的百度在线翻译有道在线翻译
    中文(简体)
    [
        {
            "country":"中国",
            "telCode":"+86"
        },
        {
            "country":"俄罗斯",
            "telCode":"+7"
        },
        {
            "country":"朝鲜",
            "telCode":"+850"
        },
        {
            "country":"巴基斯坦",
            "telCode":"+92"
        },
        {
            "country":"塞尔维亚",
            "telCode":"+381"
        }
    ]
    俄语
    [
        {
            "country":"Китай",
            "telCode":"+86"
        },
        {
            "country":"Россия",
            "telCode":"+7"
        },
        {
            "country":"Северн кор",
            "telCode":"+850"
        },
        {
            "country":"Пакистан",
            "telCode":"+92"
        },
        {
            "country":"сербия",
            "telCode":"+381"
        }
    ]
    朝鲜语
    [
        {
            "country":"중국",
            "telCode":"+86"
        },
        {
            "country":"러시아",
            "telCode":"+7"
        },
        {
            "country":"조선",
            "telCode":"+850"
        },
        {
            "country":"파키스탄",
            "telCode":"+92"
        },
        {
            "country":"세르비아",
            "telCode":"+381"
        }
    ]
    乌尔都语(巴基斯坦)
    [
        {
            "country":"چین",
            "telCode":"+86"
        },
        {
            "country":"روس",
            "telCode":"+7"
        },
        {
            "country":"شمال کوریا",
            "telCode":"+850"
        },
        {
            "country":"پاکستان",
            "telCode":"+92"
        },
        {
            "country":"سربی",
            "telCode":"+381"
        }
    ]
    塞尔维亚语
    [
        {
            "country":"Кина",
            "telCode":"+86"
        },
        {
            "country":"Русија",
            "telCode":"+7"
        },
        {
            "country":"Северна Кореја",
            "telCode":"+850"
        },
        {
            "country":"Пакистан",
            "telCode":"+92"
        },
        {
            "country":"Србија",
            "telCode":"+381"
        }
    ]
    英语
    [
        {
            "country":"China",
            "telCode":"+86"
        },
        {
            "country":"Russia",
            "telCode":"+7"
        },
        {
            "country":"North Korea",
            "telCode":"+850"
        },
        {
            "country":"Pakistan",
            "telCode":"+92"
        },
        {
            "country":"Serbia",
            "telCode":"+381"
        }
    ]
    

    第四步:编译运行App,修改手机系统设置语言与地区项,切换以上五国官方语言(不含英语)分别查看App内展示内容。

    不同语言展示内容 不出意外的话,应该都会得到上述的结果,如果你觉得这样就OK了,甚至脑子里开始浮现老外用户各种开心的样子时,其实隐藏的坑正躺在那里,你的老外用户随时都有可能踩破那个坑。

    坑!!!

    当你觉得应该、已经没有坑的时候,我们应该千方百计去制造可能的坑。正如上述过于简单的过程和轻易得到的结果,后面一定隐藏着出人意料的大坑,所以我们的项目(实操)还没有结束,下面我们将手机系统设置语言与地区项设置成五国语言以外的语言比如日语,再来看看App内会展示什么内容。

    日语下的App 你会发现虽然手机系统语言已切换成日语,但App内却显示的是中文,你肯定又开始疑惑了为什么不是English,毕竟上述我们提到默认语言是English,所以你依旧很是不甘,觉得至少应该也要显示的是English内容,如果是这样,那这个坑你是踩定了!

    修改App默认语言

    由这个坑引出本篇文章的主题《修改App默认语言》,上段我们说到日语环境下App内显示的是中文内容,很显然此时的App默认语言应该还是中文(简体),那么如何修改App默认语言呢?比如我想把默认语言设置成English,在五国以外的语言统统显示为English,那肯定有人支招了:
    第一招:修改Info.plist属性配置,添加Localization native development region或者Development localization属性值为en或者English

    属性1 属性2 不知道是不是由于姿势不对,还是因为Xcode照的是大中国的月亮,然并卵,可能还要加一个Localized resources can be mixed属性配置,值设置为YES 属性3 本以为可以出现奇迹,结果又很意外,可能真的是因为大中国的月亮没外国的圆、美、亮还大,最终还是宣告失败。
    第二招:打开Xcode导航栏菜单Product>Scheme>Edit Scheme>App Language选择要设置的默认语言。 设置默认语言 设置默认语言 这一招操作起来简单,而且暂时可以满足预期的效果,而且无论App Language设置成五国以外的其他什么语言,App内这回都会显示English内容,但是,问题来了,比如下图的操作: Localizable.json勾掉BaseEnglish本地配置时[[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"json"]会找不到Localizable.json的文件路径,说白点以下调用会直接导致App报错退出
    NSString *filePath =[[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"json"];
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    

    因为filePath没有值,进而data也为nil,最后导致Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil',结果就是App闪退,只有勾上BaseEnglish其中任一项,App会以其作为默认语言并做对应的内容展示,当两项同时勾上时,会优先选择English作为App的默认语言,所以在使用第二招时,要确保BaseEnglish至少有一项是勾选上的,否则就有可能出现上述的情况。
    第三招:使用KVC机制修改App默认语言,但是这种方式,只有在App再次启动时才会生效,也就是说,一旦采用KVC去修改App语言环境,就应该给用户附加一个弹窗交互,提示用户完全关闭kill掉整个App的进程,重新启动App。

    [[NSUserDefaults standardUserDefaults] setValue:@[@"语言代号"] forKey:@"AppleLanguages"];
    

    其中语言代号可以在首选语言列表中去选择:[NSLocale preferredLanguages];当你随意填写一个语言代号去KVC一个默认App语言,那么恭喜你[NSLocale preferredLanguages]后面会以这个随意的语言代号为唯一元素的NSarray作为返回值,即使是重启App,但App会以English作为默认语言展示内容。
    最后总结一下,以上三个办法,第二招是最方便、最简单、最实用的,其次是第二招,而第一招是徒劳,所以你以为这样就完了吗,13不答应!

    13重磅出击,支持App独立语言设置

    在说13支持App独立语言设置之前,先来温故下App同步系统语言之首选语言顺序的那些事。还是以上述实操例子中的五国语言为例,首先我们在设置iPhone语言时,当所选择的语言为五国语言之一时,App会按照所选的语言做对应的内容展示,就像这样

    不同语言展示对应内容 如果将iPhone语言设置为五国语言之外时,App会按照首选语言顺序从上往下的顺序查找所支持的语言,当查到所支持的语言时,App会以此语言作为App语言来做对应的内容展示 优先选择支持语言 优先选择支持语言 优先选择支持语言
    再来说13支持App独立语言设置:打开设置>LocalizationsDemo(App名称)>语言,选择语言。 设置App独立语言 不难最开始的时候,App首选语言(建议语言)列表和手机系统的首选语言顺序列表并不是一致的 首选语言 一旦App设置了独立语言,无论手机系统语言切换成什么语言,App内部均会以设置的独立语言来展示App内的内容。 设置App独立语言
    最后说一个很奇怪的现象,当将手机设置>语言与地区>首选语言列表中的语言删减至只有一条时,在手机设置主页会发现我们的App会从底部的应用列表中移除,但当你重新添加一条首选语言后,手机设置主页底部的应用列表中又会出现我们的App

    .END

    相关文章

      网友评论

        本文标题:iOS修改App默认语言

        本文链接:https://www.haomeiwen.com/subject/wvdjsdtx.html