Pompeu
为 iOS 自动本地化 xib 和 storyboard
安装
最简单安装 Pompeu 的方法是使用 Cocoa Pods
pod 'Pompeu', '~> 1.0'
使用示例
在您 UIViewController 子类中,您只需调用 pmp_localizate
即可。通常,您会在 viewDidLoad
方法的末尾做这个调用。
- (void)viewDidLoad
{
[super viewDidLoad];
[self pmp_localizate];
}
通过这个调用,Pompeu 会做以下操作:
- 遍历 视图控制器视图的子视图 并本地化发现的所有字符串。
- 本地化 UINavigationItem 通过翻译其标题和标题视图以及包含的 UIBarButtonItems 标题。
- 本地化 工具栏项 的数组。
- 本地化 UITabBarItem。
- 获取
self.tabBarController
并本地化其视图控制器 UITabBarItems。
此外,您还可以直接在 UIView 实例上调用 pmp_localizate
。这将本地化包含的所有子视图。
受影响类
在遍历UIView子视图层级时,Pompeu正在查找特定的子类进行本地化
- UILabel:本地化text属性。
- UIButton:为UIControlStateNormal、UIControlStateHighlighted、UIControlStateSelected和UIControlStateDisabled状态本地化title属性。
- UITextView:本地化text属性。
- UITextField:本地化text和placeholder属性。
- UISegmentedControl:本地化所有分段的标题。
处理本地化前缀
使用Pompeu
类来配置本地化前缀。前缀用于定义哪些字符串需要本地化且哪些不需要。Pompeu
对象有一个名为localizationPrefixes
的属性(数组),默认为空。这意味着所有字符串都将本地化。
要添加自定义前缀,只需将自定义数组设置到localizationPrefixes
中。例如,通过以下操作
[Pompeu defaultPompeu].localizationPrefixes = @[@"ls_"];
仅具有ls_前缀的字符串将进行本地化。
注意:默认情况下,所有本地化调用都使用Pompeu
类的默认实例。要使用特定的Pompeu实例,请使用pmp_localizateWithPompeu:
方法而不是pmp_localizate
方法。
特殊注意事项
最佳实践
在您的项目中使用 Pompeu 的最佳方式是创建一个继承自 UIViewController
的子类,并将其作为其他所有子类超类。相同的逻辑也适用于 UITableViewController
。
例如,我们可以定义名为 MJViewController
的类(及其对称的 MJTableViewController
),并将它们用作其他 UIViewController
(和 UITableViewController
)的超类。
@interface MJViewController : UIViewController
@end
@implementation MJViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self pmp_localizate];
}
@end
通过这样做,您不需要为视图控制器添加任何额外的代码来本地化它们,并可以随时在 XIB 和 Storyboard 中本地化任意数量的字符串。
与 UITableView 或 UICollectionView 一起工作
当处理使用可重复使用单元(如 UITableView
或 UICollectionView
)的视图时,我们需要本地化每个可重复使用的视图。
当在 Storyboard 中使用可重复使用视图的静态定义时,这一点更加重要。在这种情况下,我们需要对每个单元格调用 pmp_localizate
。例如,如果我们在一个 UITableViewController
子类上使用静态定义,我们将必须添加以下代码
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
[cell pmp_localizate];
return cell;
}
对于标题和页脚也适用
- (NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
NSString *title = [super tableView:tableView titleForHeaderInSection:section];
return [[Pompeu defaultPompeu] localizedString:title];
}
- (NSString*)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
{
NSString *title = [super tableView:tableView titleForFooterInSection:section];
return [[Pompeu defaultPompeu] localizedString:title];
}