【问题标题】:Xcode 11/iOS 13 Localization issueXcode 11/iOS 13 本地化问题
【发布时间】:2019-09-12 11:41:50
【问题描述】:

自从在 Xcode 11 GM 中打开项目后,我遇到了分组 UITableView 未在我的设置控制器中本地化的问题。

我使用可本地化字符串并检查所有 ObjectId 是否正确。它适用于 Xcode 10 和 iOS 12 SDK。奇怪的是,本地化在应用程序的其他任何地方都有效。就是这样一个 TableView。

有人,有什么想法吗?我什至尝试删除本地化并重新添加它。

【问题讨论】:

  • 你用 ios 12 设备在 xcode 11 中检查了吗?
  • @Priyal 是的,iOS 12 模拟器和物理设备..
  • 我可以确认发生在我身上。

标签: ios xcode localization


【解决方案1】:

更新:该问题似乎已在 Xcode 11.2 中得到修复

--

现在已在 Xcode 11.1 GM 的发行说明中确认这是一个问题。

情节提要和 XIB 文件中的 UITableViewCell 标签在运行时不使用字符串文件中的本地化字符串值。 (52839404)

https://developer.apple.com/documentation/xcode_release_notes/xcode_11_1_release_notes/

【讨论】:

  • 这是 Xcode,所以你期待什么。这个错误阻止我发布我的更新。
  • @BrenoPrata 完全正确,他们在没有解决方法的情况下发布了它 facepalms
  • 刚刚下载了 xCode 11.1 - 我仍然遇到同样的问题。
  • 我使用的是 XCode 11.2.1,这个问题仍然存在
【解决方案2】:

我在使用 Xcode 11 GM 时遇到了同样的问题。 就我而言,静态 UITableViewCell 中标题 UILabel 的本地化字符串未应用。

这是我的解决方法;

  1. 使用情节提要手动将标签的对象 ID 复制到辅助功能标识符中。
  2. 在 UITableViewDataSource 类中实现以下代码。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = super.tableView(tableView, cellForRowAt: indexPath)
    if let label = cell.textLabel, let id = label.accessibilityIdentifier, id.count > 0 {
        let key = id + ".text"
        let localizedString = NSLocalizedString(key, tableName: "Main", comment: "")
        if key != localizedString {
            label.text = localizedString
        }
    }
    return cell
}

【讨论】:

  • 谢谢!如果由于某种原因这种新行为是设计使然,则必须使用类似的东西..
  • 今天发布... Xcode 11.2 Beta...仍未修复。
  • 解决 Apple 在 iOS 13 中引入的恼人问题之一的好方法。
  • 我有很多故事板文件,所以我将“主要”替换为:let storyboardName = storyboard?.value(forKey: "name") as? String
  • 是的,同样的问题,运行 XCode 11.1
【解决方案3】:

Xcode 11 现已正式发布,但似乎并没有改变。我还有一个带有静态单元格的表格,单元格的标题使用 objectIds 正确本地化,并且这种方法多年来也可以正常工作。但从 iOS 13 开始,我必须创建 IBOutlets 并在 viewDidLoad 中本地化静态单元格。如果有人有更好的想法,欢迎!

【讨论】:

  • 不幸的是,我没有更好的主意!
【解决方案4】:

lavox 提供的解决方法也对我有用。在我的应用程序中,我使用的是objective-c。这是对应的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
    if(cell != Nil) {
        UILabel *label = cell.textLabel;
        NSString *labelId = label.accessibilityIdentifier;

        if (labelId.length > 0) {
            NSString *key = [labelId stringByAppendingString:@".text"];
            NSString *localizedString = NSLocalizedStringFromTable(key, @"Main", @"");
            if (key != localizedString) {
                label.text = localizedString;
            }
        }
    }
    return cell;
}

【讨论】:

  • 因为我有两个故事板(iPhone 和 iPad),我用故事板派生替换了显式的“主”表:NSString *localizedString = NSLocalizedStringFromTable(key, [self.storyboard valueForKey:@"name"], nil);
【解决方案5】:

我必须将每个静态表格转换为自定义单元格。如果您将它们保留为“不同于自定义的样式”,您将失去本地化功能。 我附上了一张你必须改变它的图片。 这也意味着很多工作,你必须删除已经让它再次出现的每一根线,设置标签的约束等...... 基本上,不使用任何不同于自定义的样式,你没问题。

【讨论】: