上架時需要把主要語言切換成英文,存儲時一直提示“因?yàn)槟仨毾葹槭褂眠@種語言的每個版本提供所有必需的截屏”錯誤。
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),友好企業(yè)網(wǎng)站建設(shè),友好品牌網(wǎng)站建設(shè),網(wǎng)站定制,友好網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,友好網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
解決辦法:刪除掉英文的所有截屏,構(gòu)建版本不要選擇內(nèi)容,重新進(jìn)入APP信息頁面,主要語言選擇英文,存儲,存儲成功
1.在Project設(shè)置,添加中英兩種語言:
2.新建Localizable.strings文件,作為多語言對應(yīng)的詞典,存儲多種語言,點(diǎn)擊右側(cè)Localization,勾選中英:
3.添加一個字段,
在English中,添加:SUBMIT_BTN_TITLE = Go;
在Chinese中,添加:SUBMIT_BTN_TITLE = 開始;
4.一個工具類GDLocalizableController,用來切換本地語言:
//
// GDLocalizableController.h
// guide-book
//
// Created by why on 7/16/14.
// Copyright (c) 2014 why. All rights reserved.
//
#import
@interface GDLocalizableController : NSObject
+(NSBundle *)bundle;//獲取當(dāng)前資源文件
+(void)initUserLanguage;//初始化語言文件
+(NSString *)userLanguage;//獲取應(yīng)用當(dāng)前語言
+(void)setUserlanguage:(NSString *)language;//設(shè)置當(dāng)前語言
@end
//
// GDLocalizableController.m
// guide-book
//
// Created by why on 7/16/14.
// Copyright (c) 2014 why. All rights reserved.
//
#import GDLocalizableController.h
@implementation GDLocalizableController
static NSBundle *bundle = nil;
+ ( NSBundle * )bundle{
return bundle;
}
+(void)initUserLanguage{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *string = [def valueForKey:@userLanguage];
if(string.length == 0){
//獲取系統(tǒng)當(dāng)前語言版本
NSArray* languages = [def objectForKey:@AppleLanguages];
NSString *current = [languages objectAtIndex:0];
string = current;
[def setValue:current forKey:@userLanguage];
[def synchronize];//持久化,不加的話不會保存
}
//獲取文件路徑
NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@lproj];
bundle = [NSBundle bundleWithPath:path];//生成bundle
}
+(NSString *)userLanguage{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *language = [def valueForKey:@userLanguage];
return language;
}
+(void)setUserlanguage:(NSString *)language{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
//1.第一步改變bundle的值
NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@lproj ];
bundle = [NSBundle bundleWithPath:path];
//2.持久化
[def setValue:language forKey:@userLanguage];
[def synchronize];
}
@end
5. 自定義一個宏方便處理:
// ----- 多語言設(shè)置
#define CHINESE @zh-Hans
#define ENGLISH @en
#define GDLocalizedString(key) [[GDLocalizableController bundle] localizedStringForKey:(key) value:@ table:nil]
6.使用:
[GDLocalizableController setUserlanguage:CHINESE];
NSLog(GDLocalizedString(@SUBMIT_BTN_TITLE));
[GDLocalizableController setUserlanguage:ENGLISH];
NSLog(GDLocalizedString(@SUBMIT_BTN_TITLE));
結(jié)果:
Localizable.strings(Chinese, Simplified)
Localizable.strings(English)
PS: 使用[NSLocalizedString(@"TITLE", nil);]這種方式賦值的,多語言文件的名字必須是Localizable,否則只會顯示它的key
手機(jī)系統(tǒng)為英文時:
手機(jī)系統(tǒng)為中文時:
多語言文件名字不為Localizable,創(chuàng)建過程一致,只是名字換成其他的,結(jié)果:
這時候仍然用NSLocalizedString給控件賦值,只會顯示對應(yīng)的key了
正確顯示:
啟動時,默認(rèn)語言:
ps: 沒有做什么封裝 只是大概思路和用法來理解一下
開發(fā)語言:Swift 5.0
開發(fā)環(huán)境:Xcode 11.5
發(fā)布平臺:IOS 13
在IOS多語言切換3文章中,我們已經(jīng)實(shí)現(xiàn)了用戶通過App手動設(shè)置語言,來設(shè)置程序文字和圖片的多語言化,但隨著App開發(fā)的需求,一旦引入了Framework,按照上一章實(shí)現(xiàn)的功能,所有在Framework中使用的文字和圖片資源,無法隨著用戶設(shè)置的語言進(jìn)行切換,原因在于每個Framework或者項(xiàng)目都有自己的獨(dú)立Bundle,上一章中,我們只對Bundle.main包進(jìn)行了處理,所以接下來,我們要對每個Framework的Bundle都進(jìn)行多語言的處理。
以以下demo為例,建立一個包含2個framework的項(xiàng)目。
在Main.Storyboard和SubRes.Storyboard中,已經(jīng)設(shè)置好文字的中文與英文,此時運(yùn)行程序可以通過切換IOS設(shè)備的語言來實(shí)現(xiàn)App的語言切換
在SubRes.Storyboard中,使用MainRes中一張圖片arrowblue。
但運(yùn)行程序后,圖片無法顯示,原因是ios中,每個不同的framework有著自己默認(rèn)的bundle,而加載SubRes.Storyboard時,使用的是SubRes的bundle,但是arrowblue存在于MainRes的bundle中,SubRes.Storyboard無法找到這個圖片。
此問題的解決辦法是在Target-SubRes-BuildPhases-CopyBundleResources中,點(diǎn)擊+號,添加MainRes的Assets.xcassets。
這樣程序在編譯時,會把MainRes的bundle中的資源,復(fù)制到SubRes的bundle內(nèi),這樣程序運(yùn)行就正常了
我們期待程序使用用戶指定的語言而非系統(tǒng)指定的語言,和前幾章相同,我們通過實(shí)現(xiàn)MyLanguage類來完成此功能,MyLanguage類中,維護(hù)了一個bundleDir,保存當(dāng)前所有framework的bundle,每次用戶切換語言,我們更新bundleDir,構(gòu)造并且記錄用戶指定語言的bundle。
同時我們必須重定義Bundle類。
最后,我們需要擴(kuò)展Bundle類,記錄當(dāng)前Bundle的名字,方便通過字典查找。
在AppDelegate中使用MyLanguage
此時,運(yùn)行程序,可以看到模擬器的語言是英文,但APP中的文字已經(jīng)成功設(shè)置為中文了。
在SubRes實(shí)現(xiàn)MyResource類,用于獲取此framework中的多語言文字和圖片,具體內(nèi)容前幾章有提到,就不多做介紹了