juanparati / iso-codes
一个PHP库,提供国家、货币和语言的ISO代码。
Requires
- php: >=8.1
- ext-ctype: *
- illuminate/support: ^8.34.0|^9.0|^10.0|^11.0
Requires (Dev)
- phpunit/phpunit: >=9.5
README
这是什么?
这是一个PHP库,提供地理/地缘政治信息的结构化ISO代码列表。
此库提供以下ISO和代码
- ISO 3166-2(地理代码)
- ISO 3166-3(地理代码)
- 国家代码(地缘政治代码)
- TLDs(区域顶级域名)
- ISO 4217(货币代码)
- ISO 639-1(语言代码)
- 国际拨打电话代码
- Olson时区
- Unicode旗帜
- 欧盟成员国
此库提供国家、货币和语言的本地化名称。库允许创建自定义/新的区域。
不需要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。