Mas_Tan

Site blog for Tan

No Praise For Colorful


Welcome To My Blog

CocoaPods 多语言实现

最近公司有需求,所有的服务要走上国际化。 之前做的服务(cocoapods 私有库)都是只用了中文,借此机会记录一下。

Step 1

Podfile 中使用 use_frameworks!. 这样每个私有库的内容会被单独打包进一个framework 内部,而不是全部分散的放在main bundle 内部

Step 2

私有库配置文件定义. 在podspec 文件中,指定资源打包的方式 resource_bundles Sample 如下

  s.resource_bundles = {
    'PictureBook' => ['SourceCode/Assets/*']
  }

如上,SourceCode/Assets/* 目录下的文件都会被打进PictureBook.bundle 里。

Step 3

在你私有库开发目录的资源文件目录下,新建 Strings File, 命名为Localizable, 这个是默认的名字. 然后选择Pods 工程文件,切换到Info tab 栏,添加 简体中文,默认选中刚才创建的 Localizable.strings 文件。

再看Localizable.strings 文件夹可以展开了,在Localizable.strings(English)Localizable.strings(Chinese(xxx)) 中编写对应的key-value 值。

Sample分别如下

Localizable.strings(English)

"test"="this is test";

Localizable.strings(Chinese(xxx))

"test"="这是测试";

注意最后的 分号 ,如果不加分号会加载不到文字哦 !

Step 4

代码中调用,不能按通常的方式。 一般的调用方式,程序会在main Bundle 的根目录下查找语言文件。而我们的语言文件被打包到私有库中(xxxx.framewok),该framework 中有二进制程序和xxxx.bundle 文件,所有的资源文件都会被打包到(xxxx.bundle)中。

所以我们要加载资源的时候要指定加载的bundle.

OC 实现:

//  NSString+Localable.h
#import <Foundation/Foundation.h>
@interface NSString (Localable)
@property (copy, nonatomic, readonly) NSString *CI_localizable;
@end
// 该类用于定位bundle 位置
@interface NoUse : NSObject
@end


//  NSString+Localable.m
#import "NSString+Localable.h"

@implementation NoUse
@end

@implementation NSString (Localable)

-(NSString *)CI_localizable{
    NSArray *bundlePaths = [[NSBundle bundleForClass:[NoUse class]] pathsForResourcesOfType:@"bundle" inDirectory:nil];
    if (bundlePaths.count < 1) {
        return self;
    }
    NSString *resourcePath = bundlePaths.firstObject;
    NSBundle *resourceBundle = [NSBundle bundleWithPath:resourcePath];
    NSString *ret = [resourceBundle localizedStringForKey:self value:@"" table:nil];
    return ret;
}

@end

调用: NSString *retStr = @"test".CI_localizable

Swift 实现:

import Foundation
extension String{
    class NoUse {}
    var CI_locale: String {
        let bundlePaths = Bundle(for: NoUse.self).paths(forResourcesOfType: "bundle", inDirectory: nil)
        guard bundlePaths.count > 0 , let resourcePath = bundlePaths.first else {
            return self
        }
        let resourceBundle = Bundle(path: resourcePath)
        let msg = NSLocalizedString(self, tableName: nil, bundle: resourceBundle!, value: "", comment: "")
        return msg
    }
}

调用: let retStr = "test".CI_locale

这样就基本OK了。

最近的文章

EOS 搭建网络

安装本地环境下载代码下载最新代码,master 分支即可,--recursive 会把submodule 也一起下载下来git clone https://github.com/EOSIO/eos --recursive编译安装切换到eos 目录,执行 eosio_build.sh 脚本cd eos./eosio_build.sh最后出现 EOSIO 几个超大的字母就是OK 了。验证安装是否成功Linux:~/opt/mongodb/bin/mongod -f ~/opt/mongodb/...…

继续阅读
更早的文章

Ubuntu 运行 Hyperledger Fabric 网络失败 -- 阿里云服务器

环境: System Version: Ubuntu Linux 14.04 / 16.04 LTS Hyperledger Composer version: 0.19.1步骤:mkdir ~/fabric-dev-servers && cd ~/fabric-dev-serverscurl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-de...…

继续阅读