PokeAPI 多语言数据实战:14 种语言的宝可梦名称与描述该如何取
【免费下载链接】pokeapiThe Pokémon API项目地址: https://gitcode.com/GitHub_Trending/po/pokeapi
如果你的 App 要同时服务中文、德语、日语用户,Pokémon 的名称、属名、特性描述这些文本就不能写死成一份——这就是 PokeAPI 多语言数据(i18n)要解决的问题。🌍 PokeAPI 把所有实体文本都按语言拆开存成独立行,一次就能取回 14 种语言的本地化内容,从 data/v2/csv/ 目录下的 CSV 到 GraphQL 查询都能用上。
语言模型:languages.csv 与 language_names.csv 怎么分工
PokeAPI 的语言体系由两个文件构成,理解它们的分工是后面一切操作的基础:
- data/v2/csv/languages.csv:语言主表,定义每种语言的
id、iso639、iso3166和identifier,并有official列标记是否为官方语言。 - data/v2/csv/language_names.csv:每种语言"自己的名字"在各语言下的本地化写法,每行一个
(language_id, local_language_id)组合。
以languages.csv为例,14 行数据覆盖全部支持的语言:
id,iso639,iso3166,identifier,official,order 1,ja,jp,ja-hrkt,1,1 4,zh,tw,zh-hant,1,5 12,zh,cn,zh-hans,1,6 9,en,us,en,1,7需要注意:id才是全局唯一标识,同一个iso639代码可能出现多次(日语拆成假名版ja-hrkt、罗马字版ja-roma和标准版ja三种,中文也分繁体zh-hant和简体zh-hans)。language_names.csv里一行4,9,Traditional chinese表示的是"中文(language_id=4)在英语(local_language_id=9)里的叫法",即按语言维度做嵌套本地化。
多语言名称数据文件速览
宝可梦的本地化文本分散在几张表里,它们的共同规律是:用local_language_id外键关联到语言,同一个实体每语言占一行。最常用的几张:
| 文件 | 本地化内容 |
|---|---|
| pokemon_species_names.csv | 种族的本地化名称 + 属名(genus) |
| ability_names.csv | 特性的本地化名称 |
| pokemon_species_flavor_text.csv | 种族图鉴描述 |
| ability_flavor_text.csv | 特性效果描述 |
以 1 号宝可梦 Bulbasaur 为例,pokemon_species_names.csv里按语言逐行列出:
pokemon_species_id,local_language_id,name,genus 1,4,妙蛙種子,種子寶可夢 1,9,Bulbasaur,Seed Pokémon 1,12,妙蛙种子,种子宝可梦local_language_id=4对应繁体中文、9对应英语、12对应简体中文,取值与languages.csv的id一一对应。
按语言取数:用语言 id 做查询条件
拿到数据模型后,取数思路很简单:先确定目标语言的id,再拿它当过滤条件。无论走 REST 还是 GraphQL,模式都一样——把language_id/local_language_id当作一等查询参数,而不是事后在代码里再翻译一遍。
比如想取某只宝可梦的德语名称,就过滤local_language_id = 6(de);想同时拿到中、日、英三版名称,就分别过滤12、1、9后合并结果。
GraphQL 进阶:按德语名称做模糊搜索
REST 之外,PokeAPI 提供 Supabase 风格的 GraphQL 接口,配置在 graphql/v1beta/ 与 graphql/v1beta2/ 两个版本目录下。多语言场景下它比 REST 灵活得多——可以直接在关联表上做正则过滤。
仓库自带的示例 searchForPokemonInGerman.gql 展示了这个能力:找出德语名称匹配Ento.*的宝可梦(结果应为 Psyduck 和 Golduck):
query searchForPokemonInGerman { pokemonspecies( where: { pokemonspeciesnames: { language: { name: { _eq: "de" } } name: { _regex: "Ento.*" } } } ) { id pokemonspeciesnames( where: { language: { name: { _eq: "de" } } } ) { name } } }注意这里的语言过滤走的是language.name(即languages.csv的identifier,如"de"),而非数字 id,写查询时更直观。同类示例还能在 graphql/v1beta2/examples/ 里找到,比如item_translations.gql演示了物品名多语言翻译的取法。
数据侧参考:新增一种语言的流水线
如果你想了解这些多语言 CSV 是怎么来的,可以看 Resources/scripts/data/new_language/ 目录下的工具链:apply_new_language.py负责从已有语言"抄一份"翻译行作为新语言的初始内容,validate_new_language.py负责校验结果,配置示例是es_419.json(新增拉美西班牙语es-419那次)。典型用法是三步走:
- 干跑预览:
python3 Resources/scripts/data/new_language/apply_new_language.py --config Resources/scripts/data/new_language/es_419.json - 落盘写入:在上一命令后追加
--write - 校验:
python3 Resources/scripts/data/new_language/validate_new_language.py --config Resources/scripts/data/new_language/es_419.json
配置文件里用source_language_id指定从哪个语言复制翻译行,target_language指定要 upsert 到languages.csv的新语言行,这套机制保证了每种语言的数据结构完全对齐。
落地建议与注意事项
- 缓存要按语言 id 分开做:名称与描述类数据变化频率低,建议以
(实体 id, local_language_id)为键缓存,避免每次请求都重查关联表。 - 准备好回退链:部分语言并非官方语言(见
languages.csv的official列,如捷克语cs),个别实体的翻译可能缺失,查询不到时回退到英语(en)是稳妥策略。 - 用 id 做关联,用 identifier 做展示:
languages.csv的id是数据层的稳定外键,identifier(如zh-hans)更适合直接给用户看。
🚀 克隆仓库(git clone https://gitcode.com/GitHub_Trending/po/pokeapi)后从 data/v2/csv/languages.csv 入手,对照上文的文件清单挑一张表跑通查询,你的多语言 Pokémon 应用就可以开工了。
【免费下载链接】pokeapiThe Pokémon API项目地址: https://gitcode.com/GitHub_Trending/po/pokeapi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考