ブログとしてはシャボテン公園旅行記の途中なのですが、いろいろな植物にコメントを付けていく上で、「学名」の読み方についてちょっと思うことがあったので、閑話休題として、ラテン語→カタカナの読み方・発音の変換プログラムを取り急ぎ書いてみました。
・・・
さて、
例えばサボテンの「大福丸」の学名は「Mammillaria perbella」と書きますが、この属名である「Mammillaria」ってなんて読む(カタカナで書く)のが正解でしょうか。
よく本などで目にするように「マミラリア」でしょうか。「マンミッラリア」でしょうか。「マムミルラリア」でしょうか。
実は、これ全部正解のようです。なぜならルールが特にないからです(この読み方ルールの議論は昔からずっとあるようですが)。ぶっちゃけ相手に伝わればいいわけです。
・・・
学名は、基本的に「ラテン語」でありますので、読み方をあえて書くのであればラテン語の発音をそのままカタカナにするのが、とりあえずのところ良いように思います(なお、”良いように思う”というのは私の意見であって、例えば英語圏の人からすれば、そのスペルから英語っぽく発音するのが良かろう、となるとは思います。実際に英語圏で学名をラテン語発音しても、通じないことが多いようです)。
というわけで、ラテン語とはどう読むのかということなのですが、ラテン語の読み方は、基本的に(80%ぐらい)ローマ字読みでOKなのですが、ちょっとだけ違うルールがあります。例えば
・・・などなど。まだまだあります(本ページ最下部の参考WEBページ参照)。
さらにここに、ラテン語が読まれる地方や時代単位で「古典式読み方」、「教会式読み方」、「英米式読み方」、「ドイツ式読み方」などいろいろな読み方がありややこしくなっていきます。ちなみに「Mammillaria」はラテン語の「古典式読み方」で読むと「マムミルラリア(マムミルラーリア)」となるようです。たぶん。
ということで、今回はこのラテン語の読み方のルールを”なんとなく”プログラムにして見ました。
プログラムについて
プログラムは、既存のローマ字変換プログラムを基に、ラテン語読みのルールを追加でいれています。javascriptで書いています。既存のローマ字変換プログラムはこちらです→【JavaScript】ローマ字をひらがなに変換する処理を書いた様。
機能としては、ラテン語を入力としてラテン語の読み方を出力とします。出力は「古典式読み方」「慣用読み1」「慣用読み2」の3種類です。
古典式読み方はその名の通りなのですが、「慣用読み1」と「慣用読み2」に関しては、私の主観で「古典読みは確かに正しいのだろうけど、実際問題として学名的にはこんな感じで発音される場合が多そう!」というスーパー独自俺ルールを古典式読み方にプラスして入れています。例えば
・・・などなどです。実際はもっとあります(ソースコード参照)。
ソースコードは、このページを右クリックして「ページのソースを表示」で見てください(例えばchromeの場合)。なお、コード自体は、WEBページを調べながら私が行き当りばったりで追加していったのでプログラムとしては全く最適化されていません。
また、実行結果の利用は自己責任で!
ラテン語-カタカナ変換プログラム(javascript)
使い方は:「ラテン語(学名)」という欄にラテン語の文字列(学名とか)を入力して、「変換するボタン」を押すだけ。
というけで、好きなラテン語とか学名とか入力して試してみてください。
| ラテン語 (学名) |
|
|---|---|
| ↓ | |
| 古典読み: | |
| 慣用読み1: | |
| 慣用読み2: |
// 0:古典 1:少し慣用 2:多め慣用 document.getElementById("translate").onclick = function () { if (document.getElementById("gakumei").value.length < 1500) { document.getElementById("answer0").innerHTML = modosu(h2k(r2h(document.getElementById("gakumei").value, 0))); document.getElementById("answer1").innerHTML = modosu(h2k(r2h(document.getElementById("gakumei").value, 1))); document.getElementById("answer2").innerHTML = modosu(h2k(r2h(document.getElementById("gakumei").value, 2))); } else { alert("文字は1500文字以内にしてください"); } }; const ryaku = { 'var': 'var', 'subv': 'subv', 'cv': 'cv', 'f': 'f', 'v': 'v', 'subsp': 'subsp', 'ssp': 'ssp', 'spp': 'spp', 'sp': 'sp', 'syn': 'syn', 'aff': 'aff', 'ct': 'ct', } // 略語を戻す function modosu(input) { for (word in ryaku) { regword = new RegExp(ryaku[word] + '\\.', 'g'); if (input.match(regword)) { input = input.replace(regword, word + "."); } } regword = new RegExp('^X ', 'g'); if (input.match(regword)) { input = input.replace(regword, 'X '); } return input; } function r2h(input, type) { input = input.toLowerCase(); // 【0,1,2】ピリオド略語 for (word in ryaku) { regword = new RegExp(word + '\\.', 'g'); if (input.match(regword)) { input = input.replace(regword, ryaku[word] + "."); } } // 【0,1,2】交配X regword = new RegExp('^x ', 'g'); if (input.match(regword)) { input = input.replace(regword, 'X '); } // 「y」は【1】[i]で置き換えて発音【2】子音の場合以外は「i」で発音 if (type == 1) { words = ['y']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i], 'g'); input = input.replace(regword, 'i'); } } else if (type == 2) { words = ['y']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i] + '(?!a|i|u|e|o)', 'g'); input = input.replace(regword, function (match) { return 'i' + match.slice(1); }); } } // 「mb」と「np」は【0,1,2】最初のmは[ン]と発音 words = ['mb', 'np']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i], 'g'); if (input.match(regword)) { input = input.replace(regword, function (match) { return 'ん' + match.slice(1); }); input = input.replace(regword, 'んb'); } } // 「sb」と「tb」は【0,1,2】「sp」と「tp」とする words = ['sb', 'tb']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i], 'g'); if (input.match(regword)) { input = input.replace(regword, function (match) { return match.slice(0, 1) + 'p'; }); } } // 「bs」と「bt」は【0,1,2】「ps」と「pt」とする words = ['bs', 'bt']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i], 'g'); if (input.match(regword)) { input = input.replace(regword, function (match) { return 'p' + match.slice(1); }); } } // 「ll」「rr」の重なりは【0】全部発音【1,2】は「l」「r」で合体 words = ['ll', 'rr']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i], 'g'); if (input.match(regword)) { if (type == "1" || type == "2") { input = input.replace(regword, function (match) { return match.slice(0, 1); }); } else { input = input.replace(regword, function (match) { return match.slice(0, 1) + 'u' + match.slice(1); }); } } } // 「ss」の重なりは【0】 全部発音【1,2】は「ッ」で合体 words = ['ss', 'tt']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i], 'g'); if (input.match(regword)) { if (type == "1" || type == "2") { input = input.replace(regword, function (match) { return match; }); } else { input = input.replace(regword, function (match) { return match.slice(0, 1) + 'u' + match.slice(1); }); } } } // 「mm」=【0】ムm、【1】ンm、【2】m words = ['mm', 'nn']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i], 'g'); if (input.match(regword)) { if (type == "1") { input = input.replace(regword, function (match) { return "ン" + match.slice(0, 1); }); } else if (type == "2") { input = input.replace(regword, function (match) { return match.slice(0, 1); }); } else { input = input.replace(regword, function (match) { return match.slice(0, 1) + 'u' + match.slice(1); }); } } } // dsi=【2】ジ if (type == "2") { words = ['dsi']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i], 'g'); if (input.match(regword)) { input = input.replace(regword, 'ジ'); } } words = ['cactus']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i], 'g'); if (input.match(regword)) { input = input.replace(regword, 'カクタス'); } } } // c,p,r,d,tで子音のあとに母音、y、重なり、hが来ない【0,1,2】= +u words = ['c', 'p', 'r']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i] + '(?!a|i|u|e|o|y|h|' + words[i] + ')', 'g'); if (input.match(regword)) { input = input.replace(regword, words[i] + 'u'); } } // c,p,r,d,t以外で子音のあとに母音、y、重なりが来ない【0,1,2】= +u words = ['b', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'q', 's', 'v', 'w', 'x', 'z']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i] + '(?!a|i|u|e|o|y|' + words[i] + ')', 'g'); if (input.match(regword)) { input = input.replace(regword, words[i] + 'u'); } } // dで子音のあとに母音、y、重なりおよび重なりが来ない【0】= +o 【1,2】= +u // tで子音のあとに母音、y、重なり、hおよび重なりが来ない【0】= +o 【1,2】= +u if (type == 1 || type == 2) { words = ['d']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i] + '(?!a|i|u|e|o|y|' + words[i] + ')', 'g'); if (input.match(regword)) { input = input.replace(regword, words[i] + 'o'); } } } else { words = ['d']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i] + '(?!a|i|u|e|o|y|' + words[i] + ')', 'g'); if (input.match(regword)) { input = input.replace(regword, words[i] + 'u'); } } } if (type == 1 || type == 2) { words = ['t']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i] + '(?!a|i|u|e|o|y|h|' + words[i] + ')', 'g'); if (input.match(regword)) { input = input.replace(regword, words[i] + 'o'); } } } else { words = ['t']; for (let i = 0; i < words.length; ++i) { regword = new RegExp(words[i] + '(?!a|i|u|e|o|y|h|' + words[i] + ')', 'g'); if (input.match(regword)) { input = input.replace(regword, words[i] + 'u'); } } } // jの前後が母音【0,1】「i」+「j」にして発音。※mojor = マイヨル words = ['j']; for (let i = 0; i < words.length; ++i) { regword = new RegExp('(a|i|u|e|o)' + words[i] + '(a|i|u|e|o)', 'g'); if (input.match(regword)) { if (type == "0" || type == "1") { input = input.replace(regword, function (match) { return match.slice(0, 1) + 'i' + match.slice(1); }); } } } let romaji_hira = { ' ': ' ', '!': '!', '"': '”', '#': '#', $: '$', '%': '%', '&': '&', '\'': '’', '(': '(', ')': ')', '*': '*', '+': '+', ',': '、', '-': 'ー', '.': '。', '/': '・', ':': ':', ';': ';', '<': '<', '=': '=', '>': '>', '?': '?', '@': '@', '[': '「', '\\': '¥', ']': '」', '^': '^', _: '_', '`': '‘', '{': '{', '|': '|', '}': '}', '~': '~', 0: '0', 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', a: 'あ', b: { a: 'ば', e: 'べ', i: 'び', o: 'ぼ', u: 'ぶ', y: { a: 'びゃ', e: 'びぇ', i: 'びぃ', o: 'びょ', u: 'びゅ' } }, c: { a: 'か', e: 'せ', h: { a: 'ちゃ', e: 'ちぇ', i: 'ち', o: 'ちょ', u: 'ちゅ' }, i: 'し', o: 'こ', u: 'く', y: { a: 'ちゃ', e: 'ちぇ', i: 'ちぃ', o: 'ちょ', u: 'ちゅ' } }, d: { a: 'だ', e: 'で', h: { a: 'でゃ', e: 'でぇ', i: 'でぃ', o: 'でょ', u: 'でゅ' }, i: 'ぢ', o: 'ど', u: 'づ', w: { a: 'どぁ', e: 'どぇ', i: 'どぃ', o: 'どぉ', u: 'どぅ' }, y: { a: 'ぢゃ', e: 'ぢぇ', i: 'ぢぃ', o: 'ぢょ', u: 'ぢゅ' } }, e: 'え', f: { a: 'ふぁ', e: 'ふぇ', i: 'ふぃ', o: 'ふぉ', u: 'ふ', w: { a: 'ふぁ', e: 'ふぇ', i: 'ふぃ', o: 'ふぉ', u: 'ふぅ' }, y: { a: 'ふゃ', e: 'ふぇ', i: 'ふぃ', o: 'ふょ', u: 'ふゅ' } }, g: { a: 'が', e: 'げ', i: 'ぎ', o: 'ご', u: 'ぐ', w: { a: 'ぐぁ', e: 'ぐぇ', i: 'ぐぃ', o: 'ぐぉ', u: 'ぐぅ' }, y: { a: 'ぎゃ', e: 'ぎぇ', i: 'ぎぃ', o: 'ぎょ', u: 'ぎゅ' } }, h: { a: 'は', e: 'へ', i: 'ひ', o: 'ほ', u: 'ふ', y: { a: 'ひゃ', e: 'ひぇ', i: 'ひぃ', o: 'ひょ', u: 'ひゅ' } }, i: 'い', j: { a: 'じゃ', e: 'じぇ', i: 'じ', o: 'じょ', u: 'じゅ', y: { a: 'じゃ', e: 'じぇ', i: 'じぃ', o: 'じょ', u: 'じゅ' } }, k: { a: 'か', e: 'け', i: 'き', o: 'こ', u: 'く', w: { a: 'くぁ' }, y: { a: 'きゃ', e: 'きぇ', i: 'きぃ', o: 'きょ', u: 'きゅ' } }, l: { a: 'ぁ', e: 'ぇ', i: 'ぃ', k: { a: 'ヵ', e: 'ヶ' }, o: 'ぉ', t: { s: { u: 'っ' }, u: 'っ' }, u: 'ぅ', w: { a: 'ゎ' }, y: { a: 'ゃ', e: 'ぇ', i: 'ぃ', o: 'ょ', u: 'ゅ' } }, m: { a: 'ま', e: 'め', i: 'み', o: 'も', u: 'む', y: { a: 'みゃ', e: 'みぇ', i: 'みぃ', o: 'みょ', u: 'みゅ' } }, n: { a: 'な', e: 'ね', i: 'に', n: 'ん', o: 'の', u: 'ぬ', y: { a: 'にゃ', e: 'にぇ', i: 'にぃ', o: 'にょ', u: 'にゅ' } }, o: 'お', p: { a: 'ぱ', e: 'ぺ', i: 'ぴ', o: 'ぽ', u: 'ぷ', y: { a: 'ぴゃ', e: 'ぴぇ', i: 'ぴぃ', o: 'ぴょ', u: 'ぴゅ' } }, q: { a: 'くぁ', e: 'くぇ', i: 'くぃ', o: 'くぉ', u: 'く', w: { a: 'くぁ', e: 'くぇ', i: 'くぃ', o: 'くぉ', u: 'くぅ' }, y: { a: 'くゃ', e: 'くぇ', i: 'くぃ', o: 'くょ', u: 'くゅ' } }, r: { a: 'ら', e: 'れ', i: 'り', o: 'ろ', u: 'る', y: { a: 'りゃ', e: 'りぇ', i: 'りぃ', o: 'りょ', u: 'りゅ' } }, s: { a: 'さ', e: 'せ', h: { a: 'しゃ', e: 'しぇ', i: 'し', o: 'しょ', u: 'しゅ' }, i: 'し', o: 'そ', u: 'す', w: { a: 'すぁ', e: 'すぇ', i: 'すぃ', o: 'すぉ', u: 'すぅ' }, y: { a: 'しゃ', e: 'しぇ', i: 'しぃ', o: 'しょ', u: 'しゅ' } }, t: { a: 'た', e: 'て', h: { a: 'てゃ', e: 'てぇ', i: 'てぃ', o: 'てょ', u: 'てゅ' }, i: 'ち', o: 'と', s: { a: 'つぁ', e: 'つぇ', i: 'つぃ', o: 'つぉ', u: 'つ' }, u: 'つ', w: { a: 'とぁ', e: 'とぇ', i: 'とぃ', o: 'とぉ', u: 'とぅ' }, y: { a: 'ちゃ', e: 'ちぇ', i: 'ちぃ', o: 'ちょ', u: 'ちゅ' } }, u: 'う', v: { a: 'ゔぁ', e: 'ゔぇ', i: 'ゔぃ', o: 'ゔぉ', u: 'ゔ', y: { a: 'ゔゃ', e: 'ゔぇ', i: 'ゔぃ', o: 'ゔょ', u: 'ゔゅ' } }, w: { a: 'わ', e: 'うぇ', h: { a: 'うぁ', e: 'うぇ', i: 'うぃ', o: 'うぉ', u: 'う' }, i: 'うぃ', o: 'を', u: 'う', y: { e: 'ゑ', i: 'ゐ' }, }, x: { a: 'ぁ', e: 'ぇ', i: 'ぃ', k: { a: 'ヵ', e: 'ヶ' }, n: 'ん', o: 'ぉ', t: { s: { u: 'っ' }, u: 'っ' }, u: 'ぅ', w: { a: 'ゎ' }, y: { a: 'ゃ', e: 'ぇ', i: 'ぃ', o: 'ょ', u: 'ゅ' } }, y: { a: 'や', e: 'いぇ', i: 'い', o: 'よ', u: 'ゆ' }, z: { a: 'ざ', e: 'ぜ', i: 'じ', o: 'ぞ', u: 'ず', y: { a: 'じゃ', e: 'じぇ', i: 'じぃ', o: 'じょ', u: 'じゅ' } } };
romaji_hira[' '] = ' '; romaji_hira['.'] = '.';
if (type == 0) { romaji_hira.a = 'ア'; romaji_hira.e = 'エ'; romaji_hira.i = 'イ'; romaji_hira.o = 'オ'; romaji_hira.u = 'ウ'; romaji_hira.y = 'ユ'; romaji_hira.b = { a: 'バ', e: 'ベ', i: 'ビ', o: 'ボ', u: 'ブ', y: 'ビュ' }; romaji_hira.c = { a: 'カ', e: 'ケ', i: 'キ', o: 'コ', u: 'ク', y: 'キュ' }; romaji_hira.c.h = romaji_hira.c; romaji_hira.d = { a: 'ダ', e: 'デ', i: 'ディ', o: 'ド', u: 'ドゥ', y: 'デュ' }; romaji_hira.f = { a: 'ファ', e: 'フェ', i: 'フィ', o: 'フォ', u: 'フ', y: 'フュ' }; romaji_hira.g = { a: 'ガ', e: 'ゲ', i: 'ギ', o: 'ゴ', u: 'グ', y: 'ギュ' }; romaji_hira.h = { a: 'ハ', e: 'ヘ', i: 'ヒ', o: 'ホ', u: 'フ', y: 'ヒュ' }; romaji_hira.j = { a: 'ヤ', e: 'イェ', i: 'イ', o: 'ヨ', u: 'ユ', y: 'イュ' }; romaji_hira.l = { a: 'ラ', e: 'レ', i: 'リ', o: 'ロ', u: 'ル', y: 'リュ' }; romaji_hira.k = { a: 'カ', e: 'ケ', i: 'キ', o: 'コ', u: 'ク', y: 'キュ' }; romaji_hira.m = { a: 'マ', e: 'メ', i: 'ミ', o: 'モ', u: 'ム', y: 'ミュ' }; romaji_hira.n = { a: 'ナ', e: 'ネ', i: 'ニ', o: 'ノ', u: 'ヌ', y: 'ニュ' }; romaji_hira.p = { a: 'パ', e: 'ペ', i: 'ピ', o: 'ポ', u: 'プ', y: 'ピュ' }; romaji_hira.p.h = romaji_hira.p; romaji_hira.q.u = { a: 'クワ', e: 'クウェ', i: 'クウィ', o: 'クゥォ', u: 'クウゥ', y: 'クウュ' }; romaji_hira.r = { a: 'ラ', e: 'レ', i: 'リ', o: 'ロ', u: 'ル', y: 'ルュ' }; romaji_hira.r.h = romaji_hira.r; romaji_hira.s = { a: 'スァ', e: 'スェ', i: 'スィ', o: 'スォ', u: 'ス', y: 'シュ' }; romaji_hira.t = { a: 'タ', e: 'テ', i: 'ティ', o: 'ト', u: 'トゥ', y: 'テュ' }; romaji_hira.t.h = romaji_hira.t; romaji_hira.v = { a: 'ワ', e: 'ウェ', i: 'ウィ', o: 'ウォ', u: 'ウゥ', y: 'ウュ' }; romaji_hira.x = { a: 'クサァ', e: 'クスェ', i: 'クスィ', o: 'クスォ', u: 'クス', y: 'クシュ' }; romaji_hira.z = { a: 'ザ', e: 'ゼ', i: 'ズィ', o: 'ズォ', u: 'ズ', y: 'ズュ' }; }
if (type == 1) { romaji_hira.c = { a: 'カ', e: 'ケ', i: 'キ', o: 'コ', u: 'ク' }; romaji_hira.l = { a: 'ラ', e: 'レ', i: 'リ', o: 'ロ', u: 'ル' }; romaji_hira.j = { a: 'ヤ', e: 'エ', i: 'イ', o: 'ヨ', u: 'ユ' }; romaji_hira.v = { a: 'ワ', e: 'ウェ', i: 'ウィ', o: 'ヲ', u: 'ウ' }; romaji_hira.x = { a: 'クサ', e: 'クセ', i: 'クシ', o: 'クソ', u: 'クス' }; romaji_hira.x.y = { a: 'クシャ', e: 'クシェ', i: 'クシィ', o: 'クシォ', u: 'クシュ' }; romaji_hira.t.i = 'ティ'; romaji_hira.d.i = 'ディ';
romaji_hira.c.h = romaji_hira.c; romaji_hira.p.h = romaji_hira.f; romaji_hira.r.h = romaji_hira.r; romaji_hira.t.h = romaji_hira.t; }
if (type == 2) { romaji_hira.c = { a: 'カ', e: 'ケ', i: 'キ', o: 'コ', u: 'ク' }; romaji_hira.l = { a: 'ラ', e: 'レ', i: 'リ', o: 'ロ', u: 'ル' }; romaji_hira.v = { a: 'バ', e: 'ベ', i: 'ビ', o: 'ボ', u: 'ブ' }; romaji_hira.x = { a: 'クサ', e: 'クセ', i: 'クシ', o: 'クソ', u: 'クス' }; romaji_hira.x.y = { a: 'クシャ', e: 'クシェ', i: 'クシィ', o: 'クシォ', u: 'クシュ' }; romaji_hira.d.i = 'ディ';
romaji_hira.c.h = romaji_hira.c; romaji_hira.p.h = romaji_hira.f; romaji_hira.r.h = romaji_hira.r; romaji_hira.t.h = romaji_hira.t; romaji_hira.c.y = { a: 'キア', e: 'キエ', i: 'キイ', o: 'キオ', u: 'キウ' }; romaji_hira.l.y = { a: 'リア', e: 'リエ', i: 'リイ', o: 'リオ', u: 'リウ' }; romaji_hira.c.h.y = { a: 'キア', e: 'キエ', i: 'キイ', o: 'キオ', u: 'キウ' }; }
console.log(romaji_hira);
let result = ''; // 変換結果の出力文字列 let state = romaji_hira; // 解析の状態 let pending = ''; // 変換保留中の文字 let dual = false; // 同じ文字が連続して入力されたか let offset = 0; // 入力文字列内での位置 const size = input.length; while (offset < size) { const char = input[offset]; // 現在の解析状態で一致する文字が存在する場合 if (char in state) { const value = state[char]; // 変換確定 if (typeof value === 'string') { if (dual) { result += 'っ'; dual = false; } result += value; pending = ''; state = romaji_hira; } // 変換途中 else { state = value; pending = char; } offset += 1; continue; } // 現在の解析状態で一致する文字が存在しない場合 // 連続する同じ文字に続けて入力された文字の場合 if (dual) { result += pending + pending; pending = ''; state = romaji_hira; dual = false; continue; } // 直前の文字との厳密等価判定 switch (pending) { case char: dual = true; state = romaji_hira; continue; case 'n': result += 'ん'; pending = ''; state = romaji_hira; continue; case '': result += char; offset += 1; continue; } // 該当なし result += pending; pending = ''; state = romaji_hira; continue; } // 末尾の未確定な入力 if (dual) { pending += pending; } return result + pending; }; function h2k(word) { return word = word.replace(/[ぁ-ん]/g, function (s) { return String.fromCharCode(s.charCodeAt(0) + 0x60); }); }
結果
ということで実際に結果を見てみましょう!
まずは適当にサボテンの属名の学名から変換してみます。
| 属名 | 古典読み | 慣用読み1 | 慣用読み2 |
| AYLOSTERA | アユロステラ | アイロステラ | アイロステラ |
| CORYPHANTHA | コルュパンタ | コリファンタ | コリファンタ |
| ECHINOCACTUS | エキノカクトゥス | エキノカクツス | エキノカクタス |
| ECHINOCEREUS | エキノケレウス | エキノケレウス | エキノケレウス |
| EPIPHYLLUM | エピピュルルム | エピフィルム | エピフィルム |
| ERIOSYCE | エリオシュケ | エリオシケ | エリオシケ |
| EULYCHNIA | エウリュクニア | エウリクニア | エウリクニア |
| GYMNOCALYCIUM | ギュムノカリュキウム | ギムノカリキウム | ギムノカリキウム |
| LEUCHTENBERGIA | レウクテンベルギア | レウクテンベルギア | レウクテンベルギア |
| LOPHOPHORA | ロポポラ | ロフォフォラ | ロフォフォラ |
| MAMMILLARIA | マムミルラリア | マンミラリア | マミラリア |
| OPUNTIA | オプンティア | オプンティア | オプンチア |
| PFEIFFERA | プフェイッフェラ | プフェイッフェラ | プフェイッフェラ |
| RHIPSALIS | リプスァリス | リプサリス | リプサリス |
| VATRICANIA | ワトゥリカニア | ワトリカニア | バトリカニア |
| YAVIA | ユアウィア | イアウィア | ヤビア |
うん。なかなかいい感じなような気がします。
↓ページに、このプログラムで変換したサボテン科の全属全種全シノニム(たぶん)の学名の読み方(慣用読み2)をまとめました。ページは文字数が多く重いので注意です。

・・・
次は、検証のためにラテン語の歌を変換してみます。有名な「アヴェ・マリア」です。wikipediaから歌詞を抜粋。
Ave Maria, gratia plena,
Dominus tecum,
benedicta tu in mulieribus,
et benedictus fructus ventris tui Jesus.
Sancta Maria mater Dei,
ora pro nobis peccatoribus,
nunc, et in hora mortis nostrae.
Amen.
そんでこれを、このプログラムで読み方変換(古典読み)↓
アウェ マリア、 グラティア プレナ、
ドミヌス テクム、
ベネディクタ トゥ イン ムリエリブス、
エトゥ ベネディクトゥス フルクトゥス ウェントゥリス トゥイ イェスス.
スァンクタ マリア マテル デイ、
オラ プロ ノビス ペッカトリブス、
ヌンク、 エトゥ イン ホラ モルティス ノストゥラエ.
アメン.
そんで、実際にラテン語で歌っているのを聞いてみると(Ave Maria in Latin - YouTube (こんな歌でしたっけ???))、、、うん。ほぼ正解かと思います。
というわけで、ラテン語・読み方(発音)変換プログラムでした!
ちなみに変換された多肉植物の学名はそのうちIMEとかPCやスマホの辞書に組み込みたいと思います。
【参考WEBページ】



