Ответ 1
Обратите внимание, что наилучшая практика интернационализации, особенно в проектировании баз данных, не зависит от весенних данных.
Специально для мультиязычности в схемах баз данных я разработал что-то еще в 2010 году, которое пытается соответствовать имеющимся стандартам, таким как ISO 639, для представления языков - например, хорошо известные короткие имена для языков, таких как en, de, es, fr,.. там стандартизированы.
В случае, если это кому-то интересно, я также использовал ISO 3166 для кодов стран, а также ISO 4217 для кодов валют.
Поскольку на картинке написано более тысячи слов, это часть скриншота моей базы данных (которую я называю EarthDB - и когда-нибудь она станет OpenSource):
Как вы можете просто увидеть, таблица языков использует код ISO 639-3 в качестве первичного ключа (для этого вам не нужно целое число, потому что использование iso-кода намного более интуитивно понятно при посещении других таблиц) и имеет еще несколько вещей, соответствующих ISO639 для полноты.
Затем таблица language_names содержит имена всех языков, написанных (надеюсь) на всех языках, так что вы можете просто получить все названия языков, написанные на их собственном языке или просто на английском, немецком и т.д.
Понятие о том, как использовать эту базу в более общем плане, можно было бы увидеть, если взглянуть на страны и их названия стран (написанные на всех видах языков). То же самое относится и к валютам, их валютам и другим вещам, для которых вам может потребоваться интернационализация.
Таким образом, концепция всегда состоит в том, чтобы иметь таблицу для ваших базовых данных, которая имеет только независимые от языка значения. Помимо этих базовых данных у вас есть таблица для зависимого от языка текста, который действует как таблица M: N между вашей базовой таблицей и таблицей языков.
Таким образом, у вас есть ссылочная целостность для вашей базы интернационализации по стандартам ISO ;-)
И, наконец, код SQL для создания таблиц languages и language_names:
create table LANGUAGES
(
LANG_ISO639_3 char(3) not null comment 'ISO639 Part 3',
LAN_LANG_ISO639_3 char(3) comment 'ISO639 Part 3',
LANG_ISO639_2T char(3) comment 'ISO 639 Part 2 terminology',
LANG_ISO639_2B char(3) comment 'ISO 639 Part 2 bibliographic',
LANG_ISO639_1 char(2) comment 'ISO 639 Part 1',
LANG_SCOPE char(1) not null comment 'Scope of denotation:
Individual languages
Macrolanguages
Special situations
Collections of languages
Dialects
Reserved for local use
http://www.sil.org/iso639-3/scope.asp
',
LANG_TYPE char(1) not null comment 'Type of language:
Living languages
Extinct languages
Ancient languages
Historic languages
Constructed languages
http://www.sil.org/iso639-3/types.asp',
primary key (LANG_ISO639_3)
);
alter table LANGUAGES comment 'ISO 639 table http://www.sil.org/iso639-3/codes';
create table LANGUAGE_NAMES
(
LANG_ISO639_3 char(3) not null comment 'ISO639 Part 3',
LAN_LANG_ISO639_3 char(3) not null comment 'ISO639 Part 3',
LNAMES_NAME national varchar(64) not null comment 'Language name',
LNAMES_INAME national varchar(64) comment 'Inverted language name',
primary key (LANG_ISO639_3, LAN_LANG_ISO639_3)
);
alter table LANGUAGE_NAMES comment 'ISO 639 language names written in given language.';