如何本地化主要由变量组成的字符串——像翻译一样高效和直观

问题描述

我有数百个动态字符串,即这些字符串中存在一个或多个在代码中动态生成的变量。例如,这是一个包含 中的任何内容的字符串,表示一个变量,其值在代码执行之前是未知的:

由于这些字符串将被本地化,理想情况下我会依赖一个 .strings 文件来存储它们。这是上面的例子,如果我要在那里定义它:

/*
    One condition throughout an hourly range
    e.g. <Mostly cloudy> with <temperatures> <rising> to <25°> by <2pm>.
    
    Parameters:
    1- weather
    2- measurement point (default=temperature)
    3- measurement trajectory (upwards or downwards)
    4- measurement value
    5- time above value is reached
 */
"hourSeries_const" = "%@ with %@ %@ to %@ by %@.";

感谢 https://stackoverflow.com/a/56445894/698971,我创建了一个字符串扩展,它返回本地化的字符串及其传入的参数:

/// Fetches a localised String Arguments
///
/// - Parameter arguments: parameters to be added in a string
/// - Returns: localized string
public func localized(with arguments: [CVararg]) -> String {
    return String(format: self.localized,locale: nil,arguments: arguments)
}

获取 UI 的最终字符串就像调用一样简单:

let a = "hourSeries_const".localized(with: ["Mostly cloudy","temperatures","rising","24°","2pm"])

但这并不完美,原因有几个。 .strings 文件中的字符串对读者不友好。注释对于理解每个变量代表什么至关重要。然后想象一种情况,需要重新排列变量顺序,以便字符串在语言中自然阅读。这需要以某种方式进行跟踪,然后我也必须干预代码以确保我传入参数的顺序相应地改变。

我想到的替代方案可能会部分解决这个问题(但有其自身的问题——稍后会详细介绍)是将字符串移动到代码中。例如,有一个函数

func hourSeries_const(weather:String,dataPoint:String,valueDirection:String,valueHighlight:String,highlightedValueTime:String) -> String {
  return "\(weather) with \(dataPoint) \(valueDirection) to \(valueHighlight) by \(highlightedValueTime)."
}

但要支持多种语言,我需要有一个 switch 以在不同语言之间进行选择。这并不理想,因为我计划将他们的语言文件发送给每个翻译人员,即它应该只包含他们语言的字符串。我可以通过添加一个调用所选语言函数的选择器函数解决

func hourSeries_const(...) -> String {
 switch language {
  case "en": return hourSeries_const_en(...)
  case "de": return hourSeries_const_de(...)
 }
}

这不是世界末日,但这确实意味着每次我添加一种新语言时,我都需要为这些函数中的每一个添加一个新案例,指向该语言对应的字符串函数

是否有一个选项既可以方便地依赖于 .strings 文件,又可以为翻译人员提供字符串中描述性变量名称的可读性?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...