服务器提供的字符串的iOS本地化

时间:2018-11-05 15:41:37

标签: ios localization

我需要弄清楚从远程源接收的文本(例如API驱动的服务器提供的文本)中,在iOS 中显示本地化UI文本的标准/最佳做法是什么。 iOS的静态文本本地化不是问题,我们已经有了一个管理该问题的系统。

在我看来,正确和最好的办法是让翻译后的文本由服务器发送并在应用程序上显示为已接收,但是以这种方式进行操作存在一些顾虑,例如应用程序的语言环境/当前语言可能与服务器上的当前设置不同。这表示在电话当前设置和服务器设置之间方言或语言可能不匹配的可能性。此外,我们正在考虑让服务器执行此操作会破坏任何S.O.L.I.D。设计原则。

因此,涉及两种可能性。服务器要么提供翻译的文本,要么由应用提供。

我们可能会向服务器提供一个参数,以指示设备设置为哪个语言环境(即“ en-us”)。我想这将作为HTTP请求标头参数发送。

还建议移动应用程序为其自身提供类似的功能。这将涉及维护某种类型的数据存储(tbd),以便将显示字符串提供给外观并返回已转换的字符串。即:func translate(uiText: String) -> String。在内部,它可以确定用户的语言环境,并将其用作选择正确翻译文本所需的查询的一部分。再次,必须确定其实现方式,但这不是我希望找到解决方案的问题。

总而言之,我真正需要的是了解翻译服务器提供的文本以显示给用户的标准做法,并且那里是否有旨在满足此要求的框架(假设解决方案应存在于移动应用中)?

在我看来,这是服务器最好提供的功能。另外请注意,我们有一个Android应用程序,需要进行类似的增强。

1 个答案:

答案 0 :(得分:0)

我想我已经找到了解决这个问题的方法,但是除非得到一些能加强我所学知识的反馈,否则我不想将其标记为可接受的答案。

我所做的大部分研究使我了解了适用于Web开发的方法,这很相似,因为它仍在开发中,但与移动设备截然不同。 Mobile是经过编译的,这使得在哪里进行表示逻辑的平衡的优缺点有所不同。

一些消息来源说它属于它来自的服务器。一些消息人士说,客户应该这样做。 (我将在最后发布参考。)

我在同事之间进行了关于该主题的讨论,在这里我找到了我认为将是最好的解决方案。 (欢迎发表评论和批评。)

我将把服务器通过API提供的数据称为“服务器”。

对于服务器提供的要在UI中显示的每个字符串,我需要某种方式在iOS应用中静态定义这些字符串。理想情况下,我认为每个显示字符串都可以使用一个枚举。我可以在枚举的定义中用NSLocalizedString包装每个字符串。将枚举设置为String类型,然后从服务器接收的字符串中初始化枚举的实例。枚举将返回NSLocalizedString。 iOS本地化系统应导出所有这些本地化的字符串,我将收到翻译,然后它们将存在于各个.strings文件中。

EG:

enum Emotion: String {
  case happy = "Happy"
  case sad = "Sad"
  case angry = "Angry"
  case joy = "Joy"
  case amused = "Amused"
  case bored = "Bored"
  case undefined = ""

  func translation() -> String {
      switch self {
      case .happy:
          return NSLocalizedString("Happy", comment: "Happy")
      case .sad:
          return NSLocalizedString("Sad", comment: "Sad")
      case .angry:
          return NSLocalizedString("Angry", comment: "Angry")
      case .joy:
          return NSLocalizedString("Joy", comment: "Joy")
      case .amused:
          return NSLocalizedString("Amused", comment: "Amused")
      case .bored:
          return NSLocalizedString("Bored", comment: "Bored")
      default:
          return "--"
      }
    }
  }

实施:

    let thisCameFromTheServer: String? = "Happy"
    let emo = Emotion(rawValue: thisCameFromTheServer ?? "") ?? .undefined

参考