问题描述
我有数百个动态字符串,即这些字符串中存在一个或多个在代码中动态生成的变量。例如,这是一个包含 中的任何内容的字符串,表示一个变量,其值在代码执行之前是未知的:
由于这些字符串将被本地化,理想情况下我会依赖一个 .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)
}
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 (将#修改为@)