Pompeu 1.0.0

Pompeu 1.0.0

Mobile Jazz 维护。



Pompeu 1.0.0

Version Platform Build Status CocoaDocs

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:为UIControlStateNormalUIControlStateHighlightedUIControlStateSelectedUIControlStateDisabled状态本地化title属性。
  • UITextView:本地化text属性。
  • UITextField:本地化textplaceholder属性。
  • 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 一起工作

当处理使用可重复使用单元(如 UITableViewUICollectionView)的视图时,我们需要本地化每个可重复使用的视图。

当在 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];
}