juanparati/iso-codes

一个PHP库,提供国家、货币和语言的ISO代码。

5.1 2024-04-08 10:46 UTC

This package is auto-updated.

Last update: 2024-09-08 11:52:03 UTC


README

这是什么?

这是一个PHP库,提供地理/地缘政治信息的结构化ISO代码列表。

此库提供以下ISO和代码

此库提供国家、货币和语言的本地化名称。库允许创建自定义/新的区域。

不需要RDMS(如MySQL或SQLite)即可使用此库。所有数据都保存在单独的文件中,这些文件按需加载和链接,以保持较低的内存占用。

免责声明

此库数据基于全球组织认可的国际标准,作者不对翻译和地缘政治数据的表示负责。

如果您认为此库数据不符合项目所需的地缘政治观点,请随时注册自定义数据集

Composer

composer require juanparati/iso-codes

Laravel

此库与Laravel 8.x+兼容,但也可以作为一个独立的库使用。

外观注册

'aliases' => [
    ...
    'ISOCodes' => \Juanparati\ISOCodes\Facades\ISOCodesFacade::class,
    ...
]

配置

发布配置文件(仅在需要自定义数据集或区域时才需要)

artisan vendor:publish --provider="Juanparati\ISOCodes\Providers\ISOCodesProvider"

用法

结果列表以集合的形式返回。

国家模型示例

获取所有国家代码的数组

(new ISOCodes)->countries()->toArray();

返回类似以下内容

[
...
    "AL"=> [
        "alpha2" => "ES",
        "alpha3" => "ESP",
        "numeric" => "724",
        "tld" => ".es",
        "currencies" => [
          "EUR",
        ],
        "languages" => [
          "ES",
          "CA",
          "GL",
          "EU",
        ],
        "continents" => [
          "EU",
        ],
        "capital" => "Madrid",
        "flag" => "🇪🇸",
        "phone_code" => "34",
        "eu_member" => true,
        "name" => "Spain",
        "timezones" => [
            "Europe/Madrid",
            "Africa/Ceuta",
            "Atlantic/Canary",
        ]
    ]
...
];

检索所有国家作为一个集合

(new ISOCodes)
    ->countries()
    ->all();

检索一个特定的国家

(new ISOCodes)
    ->countries()
    ->firstWhere('alpha2', 'ES');

或者使用快捷方式

(new ISOCodes)
    ->countries()
    ->findByAlpha2('ES');

检索所有位于欧洲的国家

(new ISOCodes)
    ->countries()
    ->whereContinent('EU');

检索仅位于欧洲的国家

(new ISOCodes)
    ->countries()
    ->whereContinent('EU', true);

检索位于欧洲和亚洲的国家

(new ISOCodes)
    ->countries()
    ->whereContinent(['EU', 'AS'], true);

检索位于欧洲或亚洲的国家

(new ISOCodes)
    ->countries()
    ->whereContinent(['EU', 'AS']);

检索以欧元为唯一货币的按数字代码降序排列的所有国家

(new ISOCodes)
    ->countries()
    ->all()
    ->where('currencies', ['EUR'])
    ->sortByDesc('numeric');

或者

(new ISOCodes)
    ->countries()
    ->whereCurrency('EUR', true)
    ->sortByDesc('numeric');

检索至少以欧元为货币的所有国家

(new ISOCodes)
    ->countries()
    ->whereCurrency('EUR');

创建包含国家名称的列表(用于生成列表框选项)

(new ISOCodes)
    ->countries()
    ->map(fn ($iso) => [
        'label' => $iso->name . ' (' . $iso->alpha2 . ')',
        'value' => $iso->alpha2
    ])
    ->sortBy('label')
    ->values();

检索其中一种官方语言为葡萄牙语的国家列表

(new ISOCodes)
    ->countries()
    ->whereLanguage('PT');
  • 请注意,每个国家的最常使用语言应始终在列表中居首。

语言模型示例

按语言分组列表

(new ISOCodes)->languages()->toArray();

返回类似以下内容

[
...
    "CA" => [
        "code" => "CA",
        "name" => "Catalan",
        "countries" => [
            [
                "alpha2"     => "AD",
                "alpha3"     => "AND",
                "numeric"    => "020",
                "tld"        => ".ad",
                "currencies" => [ …1],
                "languages"  => [ …1],
                "continents" => [ …1],
                "name"       => "Andorra",
                "timezones"  => [
                    "Europe/Andorra"
                ]
            ],
            ...
        ],
        "currencies" => [
            "EUR",
        ],
        "continents" => [
            "EU",
        ],
    ]
...
];

大陆模型示例

按大陆分组列表

示例

(new ISOCodes)->continents()->toArray();

货币模型示例

按货币分组获取列表。

示例

(new ISOCodes)->currencies()->toArray();

CurrencyNumber 模型示例

按货币编号分组获取列表。

示例

(new ISOCodes)->currencyNumbers()->toArray();

属性访问

每个记录数组成员都可以使用数组和对象语法进行访问。

示例

$spain = (new ISOCodes)
    ->countries()
    ->findByAlpha2('ES');

$spain->name;    // Spain
$spain['name'];  // Spain

$spain->toArray();  // Get record as array
$spain->toJson();   // Get record as Json

每个记录都是可序列化的,这使得它非常适合存储到缓存中。

使用货币编号而不是货币代码。

方法 setCurrencyAsNumber 指定货币代码是否以数字形式返回。

示例

(new ISOCodes)
    ->countries()
    ->setCurrencyAsNumber(true)
    ->all();

节点解析

方法 setResolution 修改相关节点的结构。

可用的节点包括

  • 货币
  • 语言
  • 大陆

可用的节点格式包括

  • NODE_AS_CODE: 返回代码值(默认解析方式)
  • NODE_AS_NAME: 返回翻译后的值(例如:'DA' 返回 'Danish')
  • NODE_AS_ALL: 返回代码和翻译后的值(例如:['DA' => 'Danish']
  • NODE_AS_NONE: 不包含相关值。

示例

(new ISOCodes)
    ->countries()
    ->setResolution('currencies', \Juanparati\ISOCodes\Enums\NodeResolution::NODE_AS_ALL)
    ->setResolution('languages', \Juanparati\ISOCodes\Enums\NodeResolution::NODE_AS_ALL)
    ->setResolution('continents', \Juanparati\ISOCodes\Enums\NodeResolution::NODE_AS_ALL)
    ->findByAlpha2('PT')
    ->toArray();

返回以下内容

[
    "alpha2"     => "PT",
    "alpha3"     => "PRT",
    "numeric"    => "620",
    "tld"        => ".pt",
    "currencies" => [
        "EUR" => "Euro",
    ],
    "languages"  => [
        "Portuguese",
    ],
    "name"       => "Portugal",
    "capital"    => "Lisboa",
    "flag"       => "🇵🇹",
    "phone_code" => "351",
    "eu_member"  => true,
    "timezones"  => [
        "Europe/Lisbon",
        "Atlantic/Azores",
        "Atlantic/Madeira",
    ],
]

而不是

[
    "alpha2"     => "PT",
    "alpha3"     => "PRT",
    "numeric"    => "620",
    "tld"        => ".pt",
    "currencies" => [
        "EUR",
    ],
    "languages"  => [
        "PT",
    ],
    "continents" => [
        "EU",
    ],
    "name"       => "Portugal",
    "capital"    => "Lisboa",
    "flag"       => "🇵🇹",
    "phone_code" => "351",
    "eu_member"  => true,
    "timezones"  => [
        "Europe/Lisbon",
        "Atlantic/Azores",
        "Atlantic/Madeira",
    ],
]

节点解析与其他模型(如 "货币"、"语言" 等)一起工作。

节点解析和不可变性

当解析改变时,在下一个模型调用中它将恢复到之前的状态。

示例

$iso = new ISOCodes();

echo $iso->countries()
    ->setResolution('currencies', \Juanparati\ISOCodes\Enums\NodeResolution::NODE_AS_ALL)
    ->findByAlpha2('PT')
    ->currencies[0];  // Returns "Euro"

echo $iso->countries()
    ->findByAlpha2('PT')
    ->currencies[0];  // Returns "EUR"

为了使解析保持持久,可以将解析值传递给构造函数。例如

$iso = new ISOCodes(new ISOCodes(defaultResolutions: [
            'currencies' =>  \Juanparati\ISOCodes\Enums\NodeResolution::NODE_AS_NAME
        ]);

主要语言和时间区域

  • 列表中首先显示最多人说的语言。
  • 列表中首先显示国家首都的时间区域。

自定义数据集和区域设置

在 ISOCodes 实例化期间,可以注册自定义数据集和区域设置。

示例

new ISOCodes(['countries' => MyCountryTranslation::class])

参见以下示例中的 国家名称

可宏化的模型

模型是可宏化的,因此可以注入自定义方法。

示例

\Juanparati\ISOCodes\Models\CountryModel::macro('allEUMembers', function () {
    return $this->where('eu_member', true)->all();
});

(new ISOCodes)->countries()->allEUMembers()->count();   // 27

客户端中的旗帜表示

由于政治原因,某些操作系统和浏览器可能无法表示 Unicode 旗帜。我建议使用类似 country-flag-emoji-polyfill 的库,以在客户端提供旗帜的图形表示。

贡献

请随意为此库添加新的区域设置,并发送给我 pull request。