horde/nls 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

horde/nls

Composer 安装命令:

composer require horde/nls

包简介

Native language support library

README 文档

README

A library for handling language data, country codes, timezones, TLD lookups and IP-to-country resolution.

Installation

composer require horde/nls

Optional dependencies

# For reverse-DNS hostname lookups
composer require mikepultz/netdns2

# For MaxMind GeoIP2/GeoLite2 database lookups
composer require geoip2/geoip2

Usage

Basic usage (injectable service)

use Horde\Nls\Nls;

$nls = new Nls();

// Country lookup
$nls->countries()->get('DE');          // 'Germany'
$nls->countries()->all();              // ['AD' => 'Andorra', 'AE' => 'United Arab Emirates', ...]
$nls->countries()->translated();       // Localized names, sorted by locale

// Language lookup
$nls->languages()->get('fr');          // 'French'

// Timezones
$nls->getTimezones();                  // ['Africa/Abidjan' => 'Africa/Abidjan', ...]

// Charset validation
$nls->checkCharset('UTF-8');           // true
$nls->checkCharset('NOT-REAL');        // false

Data classes as arrays

All data classes implement IteratorAggregate, ArrayAccess, and Countable:

$countries = new \Horde\Nls\Countries();

foreach ($countries as $code => $name) {
    echo "$code: $name\n";
}

echo $countries['US'];     // 'United States'
echo count($countries);    // 249
isset($countries['XX']);   // false

Translation (explicit)

Translation is never applied implicitly. Call translated() when you need localized output:

$countries = new \Horde\Nls\Countries();

$countries->all();         // English names (default)
$countries->translated();  // Localized via gettext, sorted by locale

Country lookup from hostname/IP

use Horde\Nls\Nls;
use Horde\Nls\Dns\NativeResolver;
use Horde\Nls\Geoip\Geoip2Driver;

$nls = new Nls(
    resolver: new NativeResolver(),
    geoip: new Geoip2Driver('/path/to/GeoLite2-Country.mmdb'),
);

$result = $nls->getCountryByHost('example.de');
// ['code' => 'de', 'name' => 'Germany']

$result = $nls->getCountryByHost('8.8.8.8');
// ['code' => 'us', 'name' => 'United States'] (via GeoIP)

Legacy code resolution

Retired ISO-3166 codes and old country names are handled by LegacyCodes:

$legacy = new \Horde\Nls\LegacyCodes();

$legacy->resolve('AN');                    // 'BQ' (Netherlands Antilles → Bonaire)
$legacy->resolve('YU');                    // 'RS' (Yugoslavia → Serbia)
$legacy->resolveName('Czech Republic');    // 'CZ'
$legacy->resolveName('Swaziland');         // 'SZ'

GeoIP drivers

use Horde\Nls\Geoip\Geoip2Driver;
use Horde\Nls\Geoip\LegacyDatDriver;
use Horde\Nls\Geoip\NullDriver;

// MaxMind GeoIP2 (recommended)
$geoip = new Geoip2Driver('/path/to/GeoLite2-Country.mmdb');

// Legacy .dat format
$geoip = new LegacyDatDriver('/path/to/GeoIP.dat');

// No GeoIP (default)
$geoip = new NullDriver();

DNS resolvers

use Horde\Nls\Dns\NullResolver;
use Horde\Nls\Dns\NativeResolver;
use Horde\Nls\Dns\NetDns2Resolver;

// No reverse DNS (default)
$resolver = new NullResolver();

// PHP built-in gethostbyaddr
$resolver = new NativeResolver();

// NetDNS2 library
$resolver = new NetDns2Resolver($netdns2Instance);

Architecture

src/
├── Nls.php                          # Main injectable service
├── Translation.php                  # Horde\Translation integration
├── Countries.php                    # ISO-3166 country data
├── Languages.php                    # ISO-639-1 language data
├── Tld.php                          # TLD → country mapping
├── Alpha3.php                       # Alpha-2 → Alpha-3 codes
├── Carsigns.php                     # License plate prefixes
├── LegacyCodes.php                  # Retired code resolution
├── Coordinates/
│   ├── CoordinatesInterface.php     # Provider contract
│   └── StaticCoordinates.php        # Bundled city data
├── Dns/
│   ├── ResolverInterface.php        # Reverse DNS contract
│   ├── NullResolver.php
│   ├── NativeResolver.php
│   └── NetDns2Resolver.php
├── Geoip/
│   ├── GeoipInterface.php           # IP→country contract
│   ├── Geoip2Driver.php             # MaxMind GeoIP2/GeoLite2
│   ├── LegacyDatDriver.php          # MaxMind legacy .dat
│   └── NullDriver.php
└── DataRegeneration/
    └── IanaTldUpdater.php           # IANA TLD list updater

Upgrading from Horde_Nls

See doc/UPGRADING.md for a complete migration guide from the legacy Horde_Nls static API to the new injectable Horde\Nls\Nls service.

Requirements

  • PHP 8.1+
  • ext-mbstring
  • horde/translation ^3

License

LGPL-2.1-only. See LICENSE for details.

horde/nls 适用场景与选型建议

horde/nls 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 4.01k 次下载、GitHub Stars 达 1, 最近一次更新时间为 2023 年 10 月 26 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「language」 「country」 「tld」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 horde/nls 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 horde/nls 我们能提供哪些服务?
定制开发 / 二次开发

基于 horde/nls 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 4.01k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 1
  • 点击次数: 9
  • 依赖项目数: 15
  • 推荐数: 2

GitHub 信息

  • Stars: 1
  • Watchers: 5
  • Forks: 4
  • 开发语言: PHP

其他信息

  • 授权协议: LGPL-2.1-only
  • 更新时间: 2023-10-26