产品出海的技术难点不在“翻译”,而在多语言、多时区、多币种、多合规体系的同时运转。很多团队把出海理解为“加个 i18n 就完事”,上线后才发现:货币算错、时区混乱、支付通道不通、用户数据跨境违规。本文从工程角度给出可落地的架构与代码。
出海产品的国际化应分四层,逐层解耦:
层级 | 职责 | 关键点 |
|---|---|---|
文本层 | 多语言文案 | i18n、复数、性别 |
格式层 | 日期/数字/货币 | 时区、locale |
业务层 | 定价、支付、税务 | 多币种、税率 |
合规层 | 数据、隐私、内容 | GDPR、本地化 |
任何一层硬编码,都会在新增市场时付出代价。
以 Python 的 Babel 为例:
from babel import Locale
from babel.support import Translations
translations = Translations.load("locales", ["zh_CN", "en_US"])
def t(key: str, locale: str, **kwargs) -> str:
tr = translations.load("locales", [locale])
return tr.ugettext(key) % kwargs
# 复数处理:英文 1 item / 2 items,中文无复数变化
def plural(count: int, locale: str) -> str:
loc = Locale.parse(locale)
form = loc.plural_form(count)
return t(f"items.{form}", locale, n=count)关键:不要用字符串拼接处理复数。 不同语言的复数规则从 1 种到 6 种不等,必须依赖 CLDR 规则。
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
def store_time(dt: datetime) -> datetime:
"""所有时间以 UTC 存储"""
return dt.astimezone(timezone.utc)
def display_time(dt: datetime, tz_name: str) -> str:
"""按用户时区展示"""
local = dt.astimezone(ZoneInfo(tz_name))
return local.strftime("%Y-%m-%d %H:%M %Z")
# 示例
utc_now = store_time(datetime.now(timezone.utc))
print(display_time(utc_now, "Asia/Shanghai")) # 2026-10-16 20:00 CST
print(display_time(utc_now, "America/New_York")) # 2026-10-16 08:00 EDT底线:数据库存 UTC,前端按用户时区渲染,禁止存本地时间。
from decimal import Decimal, ROUND_HALF_UP
def convert(amount: Decimal, rate: Decimal) -> Decimal:
return (amount * rate).quantize(
Decimal("0.01"), rounding=ROUND_HALF_UP
)
price_usd = Decimal("19.99")
rate_cny = Decimal("7.24")
print(convert(price_usd, rate_cny)) # 144.73浮点数会导致 0.1 + 0.2 != 0.3,货币计算必须用 Decimal。
from dataclasses import dataclass
@dataclass
class Market:
code: str
currency: str
locale: str
payment_methods: list
MARKETS = {
"US": Market("US", "USD", "en_US", ["stripe", "paypal"]),
"JP": Market("JP", "JPY", "ja_JP", ["stripe", "konbini"]),
"DE": Market("DE", "EUR", "de_DE", ["stripe", "sepa"]),
"BR": Market("BR", "BRL", "pt_BR", ["stripe", "pix"]),
}
def route_payment(market_code: str, amount: Decimal):
market = MARKETS[market_code]
# 按市场选择支付通道,本地优先
gateway = pick_gateway(market.payment_methods, amount)
return gateway.charge(amount, market.currency)定价不要简单汇率换算,要按市场购买力定价(PPP),否则会出现“美国用户觉得便宜,印度用户觉得贵”。
GDPR 要求:用户有权访问、更正、删除个人数据。系统必须支持数据导出和删除:
def handle_gdpr_request(user_id: str, request_type: str):
if request_type == "export":
data = collect_user_data(user_id)
return {"format": "json", "data": data}
if request_type == "delete":
anonymize_user(user_id) # 匿名化而非物理删除
return {"status": "deleted"}
raise ValueError("unsupported request")数据本地化:欧盟用户数据存欧盟节点,俄罗斯要求数据存境内。架构上需支持按用户区域路由到不同数据库:
def get_db(region: str):
return {
"EU": eu_db_pool,
"US": us_db_pool,
"APAC": apac_db_pool,
}[region]
def user_db(user):
return get_db(user.data_region)产品出海的工程链路:文本 i18n → 格式本地化 → 多币种支付 → 数据合规。四层解耦,逐层可替换。模型和翻译工具能提升效率,但底线是工程规范:UTC 存储、Decimal 计算、区域路由、合规流程。把这四件事做好,出海才能从“能访问”变成“能运营”。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。