Список стран, ISO и международные данные

При разработке сайтов с международной аудиторией надо не только иметь списки стран и языков, но и учитывать их взаимосвязи, форматы, временные зоны. Я уже не говорю про трудности перевода и силлогизмы которые могут быть неправильно истолкованы публикой (например blue ? голубой). Но для простоты условимся что настала эпоха тотального глобализма и можно запросто скачать такие универсальные списки в SQL-формате как..

Страны

В основном этим занимается стандарт ISO3166-1. Проблем с нормализацией таблицы стран несколько.

Во-первых это само определение независимого государства. Существует целый список единично, частично или полностью не признанных  мировым сообществом государств. Начиная с Израиля с Китаем до Косово и Палестины, Абхазии и Южной Осетии. Несомненно политику отображения той или иной страны на сайте зависит от клиента — будет он следовать признанию других стран согласно своему гражданству или же либерально будет показывать всё. Однако следует учитывать процессы в которых эта переменная будет учитываться, например отправка почты (billing address).

Во-вторых, как уже было замечено многими специалистами по useability, возникает вопрос useability — на каком языке стоит показывать страну? Соответсвенно переводить надо названия стран на некие языки (все или государственные?), либо использовать написание на коренном языке. Опять же — который брать если их несколько, как в Швейцарии или Индии? Наконец, к странам можно приписать множество параметров, которые могут характеризовать различные социологические, политические, исторические, финансовые и прочие.

Языки

Флаг и герб стран это символ государства, а не языка. Языков в мире более десяти тысяч и их все пытается классифицировать стандарт ISO 639-3, включающий и взаимосвязи и нынешнее состояние этноса. Я недавно работал с международным сайтом где было 24 страны и каждая страна должна была быть представлена на своём языке. Так вот сам сайт очень простой, но из-за обилия языков возникали постоянно проблемы что где должно показываться. Тут нужна система переводов и чёткое описание иерархии объектов — зависят баннеры от языка или нет, каталог продуктов, статьи и тп.

С точки зрения удобства, как в админке, так и на публичной части сайта, языки должны быть написаны без перевода (native) — «English, Русский, Eesti, Українська» и тд. Если языков более трёх-пяти, то надо делать select если места мало, а дизайн не сильно приспособлен как на Wikipedia. Иметь огромную таблицу всех языков мира может быть полезно только в случае если вы хотите позволить пользователю добавлять языки на сайт самому и при этом ограничить его существующими языками и кодами. Иначе это лишний груз.

Валюта

Почему валюту я выделяю в отдельные таблицы? Во-первых, логически это финансовая характеристика страны которая может достаточно быстро меняться по сравнению с остальными параметрами. Во-вторых к валютам часто приходится приделывать курсы валют, процент налога с оборота, систему оплаты и счетов (billing, invoicing). Наконец это отдельный ISO-4217 стандарт.

Даты и часовые пояса

С возникновением инфотехнологий, проблема дат наглядно ожидалась при Y2K, где чисто техническая ошибка хранения даты могла повлиять на чёрт-знает-какие критические гос.системы. Календарных систем в древности было масса, мне на ум приходит только наш Григорианский, но для исторической справки я порылся, для любопытства:

  • Юлианский календарь (4 г. н.э — 24 февраля 1582 г. н.э.), по нему в году — 365? дней (каждый четвёртый год — високосный). Простолюдинам число дней в месяце можно было легко запомнить по «горам» и «впадинам» на пальцах на кисти двух рук, считая слева направо. Тоесть хрящ (гора) означала январь — 31, впадина (февраль) — 28 или 29, март (31) и тд. Православная церковь до сих пор использует этот календарь.
  • Григорианский календарь заменил Юлианский, было пропущено 10 дней и для улучшения точности введено правило что каждый 100й год — невисокосный, но делящиеся на 400 всё-таки високосные. В среднем за эти 400 лет получается что год равен 365.2425 дней.
  • Длинный счёт календаря майя я немогу не упомянуть, поскольку он точней чем Григорианский, хотя нигде и не используется. В среднем точность года составляет 365.242036 дней и формируется группировкой дней в месяцы (уинал) по 20, а те в свою очередь дальше, получается цикл = 20 дней ? 18 уинал ? 20 тун ? 20 катун ? 13 бактун = 1872000 дней. Когда точно началось исчисление — неизвестно, но по существующей теории этот цикл «Пятого солнца» закончится 20 декабря 2012.
  • Персидский солнечный календарь cоставленный при участии Омар Хаяма. В отличие от Григорианского где ошибка составляет 1 день в 3000 лет, тут год в среднем состоит из 365,24242 дня, с ошибкой 1 день в 4500 лет. Возрождённый в статус официального Иранского календаря в 1925 году, вычислением високосного года явно занимался математик, потому что первый считается таковым если при делении года на 33 остаток составляет 1, 5, 9, 13, 17, 22, 26 или 30.

Существуют ещё и китайский, еврейский, французский календари, конвертировать которые конечно приятно для пользователя, но проблематично технически. В этом смысле я использую только Григорианский, но формат дат зависит от стран, несмотря на существующий ISO 8601.

Из шести комбинаций упорядочивания даты, в мире наиболее популярной стала логичная возрастающая, в странах могут незначительно различаться только разделители и число цифр. Только под США приходится подстраиваться. Не забывайте что для этого формата тоже нужны переводы — для датского например «DD.MM.????»

dd.mm.yyyy 13 января 2010 Little endian. Ирландия, Россия, Бельгия, Бразилия, Франция, Норвегия, Дания, Нидерланды
y-m-d 2010 январь 13 Big endian, ISO 8601. Канада, Германия, Япония, Китай, Венгрия
m-d-y сентябрь 8, 1380 Middle endian, США
y-d-m США (службы охраны природы)
m-y-d ?
d-y-m ?

Автомобильные номера

Валидация автомобильных номеров дело бесмысленное. В Эстонии например приняты несколько стандартов этих номеров и судя по списку они отличаются и цветом и формой и числом букв/цифр. При этом надо помнить что бывают и заграничные и заказные номера. Поэтому какую-нибудь автоматическую парковку или определение номеров по изображению делать очень проблематично.

Итого SQL-dump весит 16 мб, состоит из 4 таблиц:

  • iso_countries
  • iso_currency
  • iso_languages
  • iso_country_ip

Источники: