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

PHP如何实现英文国家名转本地化国家名称及国名转国家码

PHP 英文国家名称转对应本地化国名实现方案

核心思路

你已经实现了「国家代码+目标语言标识获取本地化国名」的逻辑,缺的「英文国名转ISO国家代码」环节不需要手动维护映射数组,直接复用PHP intl 扩展内置的CLDR(通用区域数据仓库)官方数据集即可——这个扩展本身就内置了全球所有国家/地区的多语言名称、代码对应关系,数据和你正在使用的locale_get_display_region函数完全同源,不会出现匹配偏差。

前置依赖

  • 环境必须安装并启用intl扩展,该扩展从PHP 5.3版本开始默认提供,绝大多数生产环境都已预装。

实现逻辑

  • 加载intl内置的英文区域资源包,遍历生成「标准化英文国名 => 两位ISO国家代码」的映射表,映射生成完全自动,不需要手动录入任何国名数据。
  • 对输入的英文国名做标准化处理(去空格、统一大写),匹配拿到对应国家代码。
  • 传入国家代码和目标语言标识,调用locale_get_display_region拿到最终的本地化国名。

可直接复用的代码示例

<?php
function getLocalizedCountryName(string $englishCountryName, string $targetLocale): string
{
    // 加载intl内置的英文区域数据集,无外部依赖
    $enRegionData = new ResourceBundle('en', 'ICUDATA-region', false);
    $enNameToCodeMap = [];

    // 遍历生成英文国名到国家代码的映射
    foreach ($enRegionData as $code => $name) {
        // 仅保留两位大写的标准ISO国家代码项,过滤其他区域数据
        if (strlen($code) === 2 && ctype_upper($code)) {
            // 名称统一转大写,兼容输入大小写差异
            $normalizedName = strtoupper(trim($name));
            $enNameToCodeMap[$normalizedName] = $code;
        }
    }

    // 标准化输入内容做匹配
    $normalizedInput = strtoupper(trim($englishCountryName));
    if (!isset($enNameToCodeMap[$normalizedInput])) {
        throw new InvalidArgumentException(sprintf('无法识别的英文国家名称:%s', $englishCountryName));
    }

    // 复用已有逻辑返回目标语言国名
    return locale_get_display_region('-' . $enNameToCodeMap[$normalizedInput], $targetLocale);
}

// 示例:法语环境转换JAPAN
echo getLocalizedCountryName('JAPAN', 'fr'); // 输出:Japon
// 其他测试用例
echo getLocalizedCountryName('Germany', 'zh_CN'); // 输出:德国
echo getLocalizedCountryName('United States', 'ja'); // 输出:アメリカ合衆国

注意事项

该方案的所有国名、代码映射数据完全来自intl扩展内置的官方CLDR数据集,后续国名变更、新增只需要随PHP版本升级intl扩展即可,全程不需要维护自定义的国名映射数组,维护成本为0。

内容的提问来源于stack exchange,提问作者8ctopus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:48:16