Fat*_*tih 5 php mysql internationalization laravel laravel-5
如果您将国家/地区代码存储在数据库中但找不到“这是正确的方法”,我正在寻找“最佳实践”。我想存储 2 个字符的国家/地区代码以及国家/地区电话代码(例如,德国是“DE”和“+49”)。
其实我的计划如下:创建一张表countries和一张表country_codes。像这样的东西:
TABLE: countries
id INT(11)
code CHAR(2)
TABLE: country_codes
id INT(11)
country_id INT(11) FORGEIGN KEY (countries -> id)
phone_code VARHAR(6)
Run Code Online (Sandbox Code Playgroud)
我想我需要拆分它们,因为有些国家/地区的电话代码不止一个。这样一个国家可以有多个电话代码。
但对于我的问题:这是做到这一点的“最佳实践”吗?如果我想在“所有”国家/地区推出我的应用程序,或者如果我想以多种语言翻译应用程序(在这种情况下,我还想将countries表格用于不同的语言。
如果您想在不需要重新编码的情况下以任何语言翻译您的应用程序,并且您还需要应用程序中所有国家/地区的列表,那么您有什么方法可以做这样的事情?
如果这很重要:我打算为这个应用程序使用 laravel。
ISO 3166-1-alpha-2将国家/地区代码标准化为两个字母,因此以这种方式存储它们是可行的。在表中包含国家/地区名称通常很有帮助,因此用户可以选择正确的国家/地区,而无需知道所有代码。
电话号码的标准化程度要低得多。ITU 提供了用于表示实际电话号码(电话术语中称为“目录号码”)的建议 E.164 。国家/地区代码定义为一到三位数字。北美(包括美国、加拿大和许多加勒比国家)都是北美编号计划的一部分,并共享国家/地区代码1。
目录号通常以 + 开头并用点分隔。因此,例如,发布的纽约市查号服务号码是(或者当他们仍然有这样的服务时) +1.212.555.1212。如果您从欧洲某个地方拨打该号码,您会看到+并替换为您当地的国际前缀。在 NANP 中,多个国籍具有相同的国家代码。
但是,英国很奇怪。从国外打来的电话是+44.exchange.number。但从国内拨打长途则是(0) exchange.number。
我的观点是:如果您尝试在软件中使用国家/地区代码组成目录号码,则很难做到正确。您最好要求用户提供带有国际前缀的电话号码。
您绝对不应该将 E.164 国家/地区代码与 ISO 3166 两字母国家/地区代码联系起来,将它们作为不同的列放在表的同一行上。您需要两个单独的表才能面向未来。标准化组织各不相同,各司其职,因此您的数据模型应该反映这一点。
阅读本文: 程序员对电话号码的误解。
> id int(11) Auto Increment (Just an ID (primary key))
> iso char(2) (2-letters ISO code)
> name varchar(80) (normalized name (all uppercase))
> nicename varchar(80) (Nicely formatted name)
> iso3 char(3) NULL (3-letters ISO code)
> numcode smallint(6) NULL (numeric ISO code)
> phonecode int(5) (phone code like '1' for USA, without '+')
Run Code Online (Sandbox Code Playgroud)
应该已经足够了。您获取用户的电话号码,删除开头的零,删除所有非数字字符,从数据库添加国家/地区代码,然后就可以开始了!
例子:
1) 用户输入 (045) 111-22-33,德国
2)您将其转换为451112233
3)从DB添加德国代码(49)。您将得到 49451112233。如果您愿意,请添加“+”。
4) 现在您可以使用 Twilio 或任何其他服务拨打电话或发送短信。
如果您想“轻松”将网站翻译成其他语言,请将所有文本存储在数据库中,并根据用户的语言偏好提取正确的版本。