☰
PokeAPI 多语言数据实战:14 种语言的宝可梦名称与描述该如何取
2026/10/15 3:44:24 网站建设 项目流程

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那次)。典型用法是三步走:

  1. 干跑预览:python3 Resources/scripts/data/new_language/apply_new_language.py --config Resources/scripts/data/new_language/es_419.json
  2. 落盘写入:在上一命令后追加--write
  3. 校验: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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询