美文网首页iOS开发·适配篇程序员iOS Developer
IOS百行代码全局语言本地化/国际化

IOS百行代码全局语言本地化/国际化

作者: heroims | 来源:发表于2017-02-15 01:54 被阅读292次

IOS本地化/国际化项目配置

废话不多说先把基本配置搞定图文一起来

3618569F-C518-4582-8580-9DC73F1E8B2E.png

这里点个“+”直接就o了
剩下的就是创建strings文件也就是语言映射文件

32E018FA-1E4C-4127-BD87-0AE0B0B1641D.png

划线的就是创建时候该点击的InfoPlist.strings就是定义CFBundleDisplayName来确定app的名字
Localizable.strings则是正经的语言映射表了
xib,storyboard和image也是一个套路看划线那点击就ok了


6DCE952A-4868-4652-AAB5-59C36DF129D5.png

百行代码全局Hook完成本地化

废话不多说先放代码在解释
https://github.com/heroims/LocalizedEngine

#import "LocalizedEngine.h"
#import <objc/runtime.h>
#import <UIKit/UIKit.h>

#define LocalizedString(string) NSLocalizedString(string, nil)

@interface NSObject (LocalizedEngineSwizzling)

@end
@implementation NSObject (LocalizedEngineSwizzling)

+ (BOOL)les_swizzleMethod:(SEL)origSel withMethod:(SEL)altSel {
    Method origMethod = class_getInstanceMethod(self, origSel);
    Method altMethod = class_getInstanceMethod(self, altSel);
    if (!origMethod || !altMethod) {
        return NO;
    }
    class_addMethod(self,
                    origSel,
                    class_getMethodImplementation(self, origSel),
                    method_getTypeEncoding(origMethod));
    class_addMethod(self,
                    altSel,
                    class_getMethodImplementation(self, altSel),
                    method_getTypeEncoding(altMethod));
    method_exchangeImplementations(class_getInstanceMethod(self, origSel),
                                   class_getInstanceMethod(self, altSel));
    return YES;
}

+ (BOOL)les_swizzleClassMethod:(SEL)origSel withMethod:(SEL)altSel {
    return [object_getClass((id)self) les_swizzleMethod:origSel withMethod:altSel];
}

@end

@interface NSString (LocalizedEngine)

@end

@implementation NSString(LocalizedEngine)

-(CGRect)le_boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSString *, id> *)attributes context:(nullable NSStringDrawingContext *)context{
    return [LocalizedString(self) le_boundingRectWithSize:size options:options attributes:attributes context:context];
}

- (CGSize)le_sizeWithAttributes:(nullable NSDictionary<NSString *, id> *)attrs{
    return [LocalizedString(self) le_sizeWithAttributes:attrs];
}
@end

@interface UILabel (LocalizedEngine)

@end

@implementation UILabel(LocalizedEngine)

-(void)le_setText:(NSString *)text{
    [self le_setText:LocalizedString(text)];
}

@end

@interface UITabBarItem (LocalizedEngine)

@end
@implementation UITabBarItem (LocalizedEngine)

-(void)le_setTitle:(NSString *)title{
    [self le_setTitle:LocalizedString(title)];
}

@end

@interface UIViewController (LocalizedEngine)

@end
@implementation UIViewController (LocalizedEngine)

-(void)le_setTitle:(NSString *)title{
    [self le_setTitle:LocalizedString(title)];
}

@end

@interface UIButton (LocalizedEngine)

@end
@implementation UIButton (LocalizedEngine)

-(void)le_setTitle:(NSString *)title forState:(UIControlState)state{
    [self le_setTitle:LocalizedString(title) forState:state];
}

@end

@implementation LocalizedEngine

+(void)startEngine{
    [[UILabel class] les_swizzleMethod:@selector(setText:) withMethod:@selector(le_setText:)];
    [[UITabBarItem class] les_swizzleMethod:@selector(setTitle:) withMethod:@selector(le_setTitle:)];
    [[UIViewController class] les_swizzleMethod:@selector(setTitle:) withMethod:@selector(le_setTitle:)];
    [[UIButton class] les_swizzleMethod:@selector(setTitle:forState:) withMethod:@selector(le_setTitle:forState:)];
    [[NSString class] les_swizzleMethod:@selector(boundingRectWithSize:options:attributes:context:) withMethod:@selector(le_boundingRectWithSize:options:attributes:context:)];
    [[NSString class] les_swizzleMethod:@selector(sizeWithAttributes:) withMethod:@selector(le_sizeWithAttributes:)];


}

@end

调用只需要一句话
[LocalizedEngine startEngine];
其实只对UILabel做一次全局的文本就都被替换了,另一方面就是NSString对可变宽高的处理,这两个就已经解决了大部分需求,只不过后来发现系统控件在传递文本时做了布局的自适应,所以就有了UITabBarItem UIButton UIViewController的扩展,
根据自己APP情况适当调整即可,包括NSAttributedString 细化出来这些估计也不会超过200行,上边放出的是初版,.m总共100行冒头,轻轻松松省去慢慢找位置加,有人找你做本地化,从此只需要做好string对照表即可,让人按格式给你。
这只是利用AOP这种面向切面开发的思想解决问题的实例,同样的道理,风格扩展,日志,crash防御都能很好的独立且省事的完成。
后续还将放一篇AOPLogger的讲讲

相关文章

  • iOS语言本地化/国际化(图文详解)

    3分钟实现iOS语言本地化/国际化(图文详解)前言语言本地化,又叫做语言国际化。是指根据用户操作系统的语言设置,自...

  • iOS 本地化 国际化

    配置需要国际化的语言(国际化的准备工作)App名称本地化代码中字符串本地化多人开发情况下的字符串本地化图片本地化(...

  • 【技术文章收集】收集

    3分钟实现iOS语言本地化/国际化(图文详解) Apple Watch App开发基础 crash iOS Cra...

  • IOS百行代码全局语言本地化/国际化

    IOS本地化/国际化项目配置 废话不多说先把基本配置搞定图文一起来 这里点个“+”直接就o了剩下的就是创建stri...

  • 2018-02-08

    iOS开发 App本地化(国际化)笔记

  • 本地化

    今天做不如修仙的本地化,看到这篇文章很详细3分钟实现iOS语言本地化/国际化,评论区还有应用内切换语言的方法,修改...

  • iOS 开发之 国际化/本地化 配置

    一、本地化与国际化 1.1、多语言支持的 国际化 和 本地化 有什么区别?答:i18n:国际化(在其他语言叫国际化...

  • iOS国际化遇到的那些坑

    本文主要讲述国际化过程中所遇到的那些问题,国际化的详细步骤可以参考:3分钟实现iOS语言本地化/国际化(图文详解)...

  • iOS 本地化/国际化 多语言 开发/上架

    iOS 本地化/国际化 多语言 开发/上架 因为项目有同时面对大陆和海外市场的需求,所以需要做本地化处理。 1)开...

  • iOS国际化(本地化)

    iOS App国际化(本地化)分为App内部语言更换和App跟随手机语言变化,本文所记录的是跟随手机语言变化 在X...

网友评论

    本文标题:IOS百行代码全局语言本地化/国际化

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