app/template/default/Block/translater_to_KANA.twig line 1

Open in your IDE?
  1. <!-- Wanakana の読み込み(CDN版) -->
  2. <script src="https://unpkg.com/wanakana"></script>
  3. <script>
  4. // 母音が続かない単独の子音に対して、デフォルトの母音を補完する関数
  5. function insertDefaultVowels(input) {
  6.   const vowels = 'aiueo'; // 小文字で統一
  7.   // 子音が単独の場合の変換テーブル
  8.   const defaultVowelMap = {
  9.     b: 'bu',  // ブ
  10.     c: 'ku',  // ク
  11.     d: 'do',  // ド
  12.     f: 'fu',  // フ
  13.     g: 'gu',  // グ
  14.     h: 'hu',  // フ(「hu」としておくと wanakana では「フ」になる)
  15.     j: 'ju',  // ジュ
  16.     k: 'ku',  // ク
  17.     l: 'ru',  // ル(l は r 音に置換)
  18.     m: 'mu',  // ム
  19.     n: 'n',   // 単独の n は通常「ン」になる(特殊なケースもあるので注意)
  20.     p: 'pu',  // プ
  21.     q: 'ku',  // q は通常「ku」とする
  22.     r: 'ru',  // ル
  23.     s: 'su',  // ス
  24.     t: 'to',  // ト ※「tsu」にするかは検討次第
  25.     v: 'vu',  // ヴ
  26.     w: 'wu',  // ウ
  27.     x: 'ku',  // x は「ku」とする(場合により「クス」とするかも)
  28.     y: 'yu',  // ユ
  29.     z: 'zu'   // ズ
  30.   };
  31.   let output = '';
  32.   // 入力文字列を1文字ずつチェック
  33.   for (let i = 0; i < input.length; i++) {
  34.     const char = input[i];
  35.     // アルファベットのみを対象にする
  36.     if (/[a-zA-Z]/.test(char)) {
  37.       const lowerChar = char.toLowerCase();
  38.       if (defaultVowelMap.hasOwnProperty(lowerChar)) {
  39.         const nextChar = input[i + 1];
  40.         // 次の文字が存在し、かつ母音であればそのまま出力
  41.         if (nextChar && vowels.indexOf(nextChar.toLowerCase()) !== -1) {
  42.           output += char;
  43.           continue;
  44.         } else {
  45.           // 母音が続かない場合、変換テーブルの値を補完して出力
  46.           output += defaultVowelMap[lowerChar];
  47.           continue;
  48.         }
  49.       }
  50.     }
  51.     // 上記に該当しない場合はそのまま出力
  52.     output += char;
  53.   }
  54.   return output;
  55. }
  56. document.addEventListener('DOMContentLoaded', function() {
  57.   // 入力フィールドと反映先フィールドのセレクタを定義
  58.   const mappings = [
  59.     { source: "input#nonmember_name_name01", target: "input#nonmember_kana_kana01" },
  60.     { source: "input#nonmember_name_name02", target: "input#nonmember_kana_kana02" },
  61.     { source: "input#entry_name_name01",     target: "input#entry_kana_kana01" },
  62.     { source: "input#entry_name_name02",     target: "input#entry_kana_kana02" },
  63.     { source: "input#contact_name_name01",   target: "input#contact_kana_kana01" },
  64.     { source: "input#contact_name_name02",   target: "input#contact_kana_kana02" }
  65.   ];
  66.   mappings.forEach(function(mapping) {
  67.     const nameInput = document.querySelector(mapping.source);
  68.     const kanaInput = document.querySelector(mapping.target);
  69.     if (nameInput && kanaInput) {
  70.       nameInput.addEventListener('input', function() {
  71.         const inputValue = nameInput.value;
  72.         // 入力がローマ字(アルファベットとスペースのみ)の場合のみ処理
  73.         if (/^[A-Za-z\s]+$/.test(inputValue)) {
  74.           // まず、母音が不足している場合にデフォルトの母音を補完する
  75.           const processedInput = insertDefaultVowels(inputValue);
  76.           // 補完後の文字列を Wanakana でカタカナに変換
  77.           const katakana = wanakana.toKatakana(processedInput);
  78.           kanaInput.value = katakana;
  79.         } else {
  80.           // ローマ字以外が含まれている場合は、必要に応じて処理(ここでは空にしています)
  81.           kanaInput.value = '';
  82.         }
  83.       });
  84.     }
  85.   });
  86. });
  87. </script>