十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
上架时需要把主要语言切换成英文,存储时一直提示“因为您必须先为使用这种语言的每个版本提供所有必需的截屏”错误。
成都创新互联是一家集网站建设,友好企业网站建设,友好品牌网站建设,网站定制,友好网站建设报价,网络营销,网络优化,友好网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
解决办法:删除掉英文的所有截屏,构建版本不要选择内容,重新进入APP信息页面,主要语言选择英文,存储,存储成功
1.在Project设置,添加中英两种语言:
2.新建Localizable.strings文件,作为多语言对应的词典,存储多种语言,点击右侧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;//获取当前资源文件
+(void)initUserLanguage;//初始化语言文件
+(NSString *)userLanguage;//获取应用当前语言
+(void)setUserlanguage:(NSString *)language;//设置当前语言
@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){
//获取系统当前语言版本
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. 自定义一个宏方便处理:
// ----- 多语言设置
#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));
结果:
Localizable.strings(Chinese, Simplified)
Localizable.strings(English)
PS: 使用[NSLocalizedString(@"TITLE", nil);]这种方式赋值的,多语言文件的名字必须是Localizable,否则只会显示它的key
手机系统为英文时:
手机系统为中文时:
多语言文件名字不为Localizable,创建过程一致,只是名字换成其他的,结果:
这时候仍然用NSLocalizedString给控件赋值,只会显示对应的key了
正确显示:
启动时,默认语言:
ps: 没有做什么封装 只是大概思路和用法来理解一下
开发语言:Swift 5.0
开发环境:Xcode 11.5
发布平台:IOS 13
在IOS多语言切换3文章中,我们已经实现了用户通过App手动设置语言,来设置程序文字和图片的多语言化,但随着App开发的需求,一旦引入了Framework,按照上一章实现的功能,所有在Framework中使用的文字和图片资源,无法随着用户设置的语言进行切换,原因在于每个Framework或者项目都有自己的独立Bundle,上一章中,我们只对Bundle.main包进行了处理,所以接下来,我们要对每个Framework的Bundle都进行多语言的处理。
以以下demo为例,建立一个包含2个framework的项目。
在Main.Storyboard和SubRes.Storyboard中,已经设置好文字的中文与英文,此时运行程序可以通过切换IOS设备的语言来实现App的语言切换
在SubRes.Storyboard中,使用MainRes中一张图片arrowblue。
但运行程序后,图片无法显示,原因是ios中,每个不同的framework有着自己默认的bundle,而加载SubRes.Storyboard时,使用的是SubRes的bundle,但是arrowblue存在于MainRes的bundle中,SubRes.Storyboard无法找到这个图片。
此问题的解决办法是在Target-SubRes-BuildPhases-CopyBundleResources中,点击+号,添加MainRes的Assets.xcassets。
这样程序在编译时,会把MainRes的bundle中的资源,复制到SubRes的bundle内,这样程序运行就正常了
我们期待程序使用用户指定的语言而非系统指定的语言,和前几章相同,我们通过实现MyLanguage类来完成此功能,MyLanguage类中,维护了一个bundleDir,保存当前所有framework的bundle,每次用户切换语言,我们更新bundleDir,构造并且记录用户指定语言的bundle。
同时我们必须重定义Bundle类。
最后,我们需要扩展Bundle类,记录当前Bundle的名字,方便通过字典查找。
在AppDelegate中使用MyLanguage
此时,运行程序,可以看到模拟器的语言是英文,但APP中的文字已经成功设置为中文了。
在SubRes实现MyResource类,用于获取此framework中的多语言文字和图片,具体内容前几章有提到,就不多做介绍了