You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何本地化含数值与时间单位变量且需处理复数的字符串?

多变量带复数的字符串本地化最佳方案

核心思路

同时处理数量复数变化和多语言结构差异时,建议把「数量+单位」的复数逻辑与「整体语句结构」的本地化拆分处理:用stringsdict专门搞定复数规则,再通过普通本地化字符串适配不同语言的语序差异。

步骤1:配置Localizable.stringsdict

这个文件用来定义每个时间单位的复数规则,自动适配不同语言的复数逻辑(比如英文区分单复数,中文无需区分)。

示例XML配置(直接在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>year_count</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@year@</string>
        <key>year</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>one</key>
            <string>%d year</string>
            <key>other</key>
            <string>%d years</string>
        </dict>
    </dict>

    <!-- 月份复数规则 -->
    <key>month_count</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@month@</string>
        <key>month</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>one</key>
            <string>%d month</string>
            <key>other</key>
            <string>%d months</string>
        </dict>
    </dict>

    <!-- 日期复数规则 -->
    <key>day_count</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@day@</string>
        <key>day</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>one</key>
            <string>%d day</string>
            <key>other</key>
            <string>%d days</string>
        </dict>
    </dict>
</dict>
</plist>

步骤2:配置各语言的Localizable.strings

用来定义整体语句的结构,让不同语言可以自由调整语序和格式:

英文(en.lproj/Localizable.strings):

"later_template" = "%@ later";

中文(zh-Hans.lproj/Localizable.strings):

"later_template" = "%@后";

步骤3:代码中实现本地化逻辑

先把Calendar.Component映射到对应的stringsdictkey,拿到处理好复数的「数量+单位」字符串,再代入到整体模板中:

let count: Int = ...
let unit: Calendar.Component = ...

// 映射时间单位到对应的stringsdict key
let unitKey: String
switch unit {
case .year:
    unitKey = "year_count"
case .month:
    unitKey = "month_count"
case .day:
    unitKey = "day_count"
default:
    unitKey = "" // 可根据需求补充其他单位的默认处理
}

// 获取处理复数后的「数量+单位」字符串
let countUnitString = String.localizedStringWithFormat(NSLocalizedString(unitKey, comment: ""), count)

// 拼接得到最终本地化字符串
let finalString = String.localizedStringWithFormat(NSLocalizedString("later_template", comment: "Template for time later"), countUnitString)

方案优势

  • 职责分离:stringsdict专注处理复数规则,普通本地化字符串适配语序,逻辑清晰易维护。
  • 扩展性强:新增时间单位(如小时、分钟)时,只需在stringsdict中添加对应规则,代码里补充case即可。
  • 适配多语言复数:自动兼容不同语言的复数规则(比如部分语言有3种以上复数形态)。

内容的提问来源于stack exchange,提问作者Li Fumin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:35:06