我是Swift和iOS编程的新手,我在Swift中遇到了一个关于带有占位符和多元支持的动态字符串的问题
例如,如果您有一个多语言应用程序,并且不想硬编码字符串和标签和消息等...
我可以在Android中轻松地使用以下代码在不同文件夹中的XML文件中执行此操作,其中android设备将根据当前区域设置查找字符串:
<string name="name">You have %2$d new messages.</string>
<plurals name="name">
<item quantity="one">You have a new message.</item>
<item quantity="other">You have %2$d new messages.</item>
</plurals>
Run Code Online (Sandbox Code Playgroud)
借助上述XML和以下Java:
res.getString(R.string.name, mailCount)
res.getQuantityString(R.plurals.name, mailCount, mailCount)
Run Code Online (Sandbox Code Playgroud)
这项工作是在Android中完成的,我正在寻找与Swift(iOS)相对应的解决方案
Aam*_*irR 11
1:安装项目Localizations,如截图所示项目有英语和俄语.
2:创建一个名为的空属性列表文件Localizable.stringsdict并粘贴以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NumberOfMessages</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@value@</string>
<key>value</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>You have a new message.</string>
<key>other</key>
<string>You have %d new messages.</string>
</dict>
</dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
3:为每种语言本地化以上文件,请参见截图,该文件已本地化为英语和俄语语言:
用法:
String(format: NSLocalizedString("NumberOfMessages", comment: ""), 1)
Run Code Online (Sandbox Code Playgroud)
输出:您有一条新消息.
String(format: NSLocalizedString("NumberOfMessages", comment: ""), 2)
Run Code Online (Sandbox Code Playgroud)
输出:您有2条新消息.
复数规则:在XML代码,通知<key>one</key>和<key>other</key>,在这里你可以使用zero,one,two,few,many,other取决于语言和您的要求.
有关语言特定复数规则的更多信息,请使用以下链接:http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html
在某些语言中,复数的作用方式与英语不同。某些语言不表示复数(例如日语),而其他语言则根据数量而定(例如俄语)。
为了使事情变得容易一些,iOS对不同的复数类型进行了如下分类:
- 零。用于表示0数量。
- 一。用于表示正好为1的数量。
- 二。用于表示正好为2的数量。
- 很少 用于表示大于2的少量,但这取决于语言。
- 许多。用于指示大量数字,但这也取决于语言。
其他。用于表示上述类别未涵盖的每个数字。
并非所有语言都需要指定所有类别,因为所有类别的工作方式都不同。乍一看,英语似乎要求规则为零,一和多。但是,英语的复数规则将用一个或另一个来指定,因为除1以外的所有数字均被同等对待。
若要指定复数规则,您需要使用字符串字典(Localizable.stringsdict)而不是常规的Localizable.strings文件。实际上,您需要仍然存在.strings文件,以使.stringsdict工作,即使它为空。
在Xcode中,创建一个新的Plist文件,并将其命名为Localizable.stringsdict。填充后,Plist中的原始数据将如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>number_of_days</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@value@</string>
<key>value</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%d day remaining</string>
<key>other</key>
<string>%d days remaining</string>
</dict>
</dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
这是如何在代码中引用复数:
let format = NSLocalizedString("number_of_days", comment: "")
let message = String.localizedStringWithFormat(format, numDays)
Run Code Online (Sandbox Code Playgroud)
再次感谢昆汀
| 归档时间: |
|
| 查看次数: |
5120 次 |
| 最近记录: |