Ios 如何定位主要由变量组成的字符串–;作为开发人员高效且直观地作为翻译人员

Ios 如何定位主要由变量组成的字符串–;作为开发人员高效且直观地作为翻译人员,ios,swift,string,localization,nslocalizedstring,Ios,Swift,String,Localization,Nslocalizedstring,我有数百个动态字符串,也就是说,这些字符串中存在一个或多个变量,这些变量是在代码中动态生成的。例如,这是一个字符串,其中包含表示在执行代码之前其值未知的变量的任何内容: 顺便 由于这些字符串将被本地化,理想情况下,我将依赖.strings文件来存储它们。如果我要在这里定义它,下面是上面的示例: /* One condition throughout an hourly range e.g. <Mostly cloudy> with <temperatures&g

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

顺便

由于这些字符串将被本地化,理想情况下,我将依赖.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 %@.";
获取UI的最终字符串非常简单,只需调用:

let a = "hourSeries_const".localized(with: ["Mostly cloudy","temperatures","rising","24°","2pm"])
但这并不完美,原因有二。.strings文件中的字符串对读者不友好。注释对于理解每个变量所代表的内容至关重要。然后想象一种情况,在这种情况下,需要重新排列变量顺序,以便字符串在语言中自然读取。这需要以某种方式进行跟踪,然后我还必须干预代码,以确保我传入参数的顺序相应地改变

我想到的另一种方法可能部分解决了这个问题(但也有它自己的问题——稍后将详细介绍),就是将字符串移动到代码中。例如,有一个func:

func hourSeries_const(weather:String, dataPoint:String, valueDirection:String, valueHighlight:String, highlightedValueTime:String) -> String {
  return "\(weather) with \(dataPoint) \(valueDirection) to \(valueHighlight) by \(highlightedValueTime)."
}
但是由于要支持多种语言,我需要一个
开关
来选择不同的语言。这并不理想,因为我计划将每个翻译人员的语言文件发送给他们使用,也就是说,它应该只包含他们语言的字符串。我可以通过添加一个调用所选语言函数的选择器函数来解决这个问题:

func hourSeries_const(...) -> String {
 switch language {
  case "en": return hourSeries_const_en(...)
  case "de": return hourSeries_const_de(...)
 }
}
这并不是世界末日,但它确实意味着每次我添加一种新语言时,我都需要为这些函数中的每一个添加一个新的案例,指向该语言对应的字符串函数

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

多亏了的软件包提供了我想要的东西(我相信基本上是按照Larme在上面的评论中建议的那样)

由于上述原因,我得到了我想要的东西。字符串在Localizable.Strings中定义如下:

"hourSeries_const" = "{weather} with {point} {direction} to {value} by {time}.";
并以如下代码传递到UI:

"hourSeries_const".localized(with: ["weather":"Mostly cloudy","point":"temperatures","direction":"rising","value":"24°","time":"2pm"])

有关顺序,请参见仅适用于
“hourSeries_const”=“%@with%@%@到%@by%@.”,而不是<代码>“\(天气)与\(数据点)\(值方向)到\(值突出显示)的\(高亮显示值时间)。”
。您可能对SwiftGen感兴趣您也可以使用占位符:
“hourSeries_const”=[[Weather]]和[[Time]]][[Temperature]]
并替换它们。这意味着可能需要一个解析器。请注意,按照SwiftGen的工作方式,您可以使用自己的模具模板来执行此操作(但这意味着您可以使用一些工作)。您应该使用以下%@表示字符串%d表示整数,我认为%f表示浮点。搜索这些,你就会找到答案。根据您使用的库,例如Localize_Swift,您将执行类似于此标签的操作。Text=“%@”。localizedFormat(将替换@的变量)感谢大家的建议。Larme,我下面的解决方案基本上就是你提出的(除非我误解了)。
"hourSeries_const" = "{weather} with {point} {direction} to {value} by {time}.";
"hourSeries_const".localized(with: ["weather":"Mostly cloudy","point":"temperatures","direction":"rising","value":"24°","time":"2pm"])