Esto es MUY ¡buena pregunta!
Como observa en la etiqueta language-agnostic, lo importante no es el lenguaje de programación. Es el conjunto de datos que realmente necesitas aquí. No conozco ningún depósito para tales cosas. Los datos do aún no contienen esto. Aquí hay una tabla simple de secuencias para varios códigos twosᴏ de dos letras, más algunos extras para secuencias asiáticas, escritos en Perl. Este tipo de cosas podría ser la base de un módulo.
Requiere un manejo un tanto cuidadoso, ya que no se puede marcar ciegamente el primer grafema en cada elemento sin tener en cuenta la configuración regional si se desea un conjunto "en mayúsculas". Eso es por el problema de Turkic I. Instalaría métodos que extraen las secuencias y las detectaría si pidieran algo en las lenguas túrquicas.
use utf8;
use strict;
use warnings;
our %Alphabet = (
en => [qw(a b c d e f g h i j k l m n o p q r s t u v w x y z)],
br => [qw(a b ch c'h d e f g h i j k l m n o p r s t u v w y z)],
cy => [qw(a b c ch d dd e f ff g ng h i l ll m n o p ph r rh s t th u w y)],
ga => [qw(a á b c d e é f g h i í l m n o ó p r s t u ú)],
gd => [qw(a b c d e f g h i l m n o p r s t u)],
la => [qw(a b c d e f g h i k l m n o p q r s t v x y z)],
it => [qw(a b c d e f g h i k l m n o p q r s t u v z)],
es => [qw(a b c d e f g h i j k l m n ñ o p q r s t u v w x y z)],
es__traditional =>
[qw(a b c ch d e f g h i j k l ll m n ñ o p q r s t u v w x y z)],
eu => [qw(a b c ch d e f g h i j k l ll m n ñ o p q r s t ts tx tz u v w x y z)],
rm => [qw(a b c d e f g h i j l m n o p q r s t u v x z)],
ro => [qw(a ă â b c d e f g h i î j k l m n o p q r s ș t ț u v w x y z)],
oc => [qw(a b c d e f g h i j l m n o p q r s t u v x z)],
sw => [qw(a b c d e f g h i j k l m n o p q r s t u v w x y z å ä ö)],
no => [qw(a b c d e f g h i j k l m n o p q r s t u v w x y z æ ø å)],
is => [qw(a á b d ð e é f g h i í j k l m n o ó p r s t u ú v x y ý þ æ ö)],
cz => [qw(a á b c č d ď e é ě f g h ch i í j k l m n ň o ó p q r ř s š t ť u ú ů v w x y ý z ž)],
sk => [qw(a á ä b c č d ď dz dž e é f g h ch i í j k l ĺ ľ m n ň o ó ô p q r ŕ s š t ť u ú v w x y ý z ž)],
sl => [qw(a b c č d e f g h i j k l m n o p r s š t u v z ž)],
pl => [qw(a ą b c ć d e ę f g h i j k l ł m n ń o ó p r s ś t u w y z ź ż)],
lt => [qw(a ą b c č d e ę ė f g h i į y j k l m n o p r s š t u ų ū v z ž)],
lv => [qw(a ā b c č d e ē f g ģ h i ī j k ķ l ļ m n ņ o p r s š t u ū v z ž)],
et => [qw(a b d e f g h i j k l m n o p r s š z ž t u v õ ä ö ü)],
et__full =>
[qw(A B C D E F G H I J K L M N O P Q R S Š Z Ž T U V W Õ Ä Ö Ü X Y)],
et__simple => [qw(a b d e g h i j k l m n o p r s t u v õ ä ö ü)],
hu => [qw(a á b c cS d dz dzs e é f g gy H i í j k l ly M n ny O ó ö ő p q r s sz t ty u ú ü ű v w x y z zs)],
hu__traditional =>
[qw(a á b c cs d dz dzs e é f g gy h i í j k l ly m n ny o ó ö ő p r s sz t ty u ú ü ű v z zs)],
tr => [qw(a b c ç d e f g ğ h ı i j k l m n o ö p r s ş t u ü v y z)],
az => [qw([a b c ç d e ə f g ğ h x ı i j k q l m n o ö p r s ş t u ü v y z)],
az_1918_1939 =>
[qw(a в c ç d e ə f g ƣ h i ь j k q l m n o ɵ p r s ş t u v x y z ƶ)],
az_1939_1958 =>
[qw(а б в г ғ д е ё ә ж з и й к қ л м н о ө п р с т у ү ф х h ц ч ҷ ш щ ъ ы ь э ю я ')],
az_1958_1991 =>
[qw(а б в г ғ д e ә ж з и ы ј к ҝ л м н о ө п р с т у ү ф х һ ч ҹ ш ')],
az_1991_1992 =>
[qw(a ä b c ç d e f g ğ h x ı i j k q l m n o ö p r s ş t u ü v y z)],
he => [qw(α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω)],
ru => [qw(а б в г д е ж з и к л м н о п р с т у ф х ц ч ш щ ы э ю я)],
uk => [qw(а б в г ґ д е є ж з и і ї й к л м н о п р с т у ф х ц ч ш щ ь ю я)],
mk => [qw(а б в г д ѓ е ж з ѕ и ј/к л љ м н њ о п р с т ќ/у ф х ц ч џ ш)],
"HIRAGANA AIUEO" =>
[qw(あ い う え お か き く け こ さ し す せ そ た ち つ て と な に ぬ ね の は ひ ふ へ ほ ま み む め も や ゆ よ ら り る れ ろ わ を ん)],
"KATAKANA AIUEO" =>
[qw(ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン)],
"HALFWIDTH KATAKANA AIUEO" =>
[qw(ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン)],
"KATAKANA IROHA" =>
[qw(イ ロ ハ ニ ホ ヘ ト チ リ ヌ ル ヲ ワ カ ヨ タ レ ソ ツ ネ ナ ラ ム ウ ヰ ノ オ ク ヤ マ ケ フ コ エ テ ア サ キ ユ メ ミ シ ヱ ヒ モ セ ス)],
"HIRAGANA IROHA" =>
[qw(い ろ は に ほ へ と ち り ぬ る を わ か よ た れ そ つ ね な ら む う ゐ の お く や ま け ふ こ え て あ さ き ゆ め み し ゑ ひ も せ す)],
"HALFWIDTH KATAKANA IROHA" =>
[qw(イ ロ ハ ニ ホ ヘ ト チ リ ヌ ル ヲ ワ カ ヨ タ レ ソ ツ ネ ナ ラ ム ウ ノ オ ク ヤ マ ケ フ コ エ テ ア サ キ ユ メ ミ シ ヒ モ セ ス)],
"HANGUL CHOSUNG" =>
[qw(ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ)],
"HANGUL GANADA" =>
[qw(가 나 다 라 마 바 사 아 자 차 카 타 파 하)],
"CHINESE ZODIAC 10" =>
[qw(甲 乙 丙 丁 戊 己 庚 辛 壬 癸)],
"CHINESE ZODIAC 12" =>
[qw(子 丑 寅 卯 辰 巳 午 未 申 酉 戍 亥)],
"ZODIAC" => [qw(♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ )],
);
for my $a (\%Alphabet) {
$$a{da} = $$a{no};
$$a{fi} = $$a{no};
$$a{de} = $$a{en};
$$a{fr} = $$a{en};
$$a{pt} = $$a{en};
}
1;
Sin embargo, eso debería ser suficiente para empezar.
FYI: puede beneficiarse de este Área 51 [propuesta I18N y L10N] (http://area51.stackexchange.com/proposals/12416/i18n-l10n). – McDowell