実現したいこと
- ページ内のボタンなどで言語切り替え
- 選択された言語に従ったJSファイルが読み込まれる
- デフォルトでは日本語のファイルたちを読み込んでおく
- 英語を選択されたら,読み込んでいた日本語ファイルたちの読み込みをやめて英語の方だけを読み込む
- リロードをしたとき,ブロックが適切に復元される
前提
Blocklyというツールを用いてビジュアルプログラミングを作成しています.
https://developers.google.com/blockly?hl=ja
ユーザの使う言語によって扱うブロックを変更させたいので,適切にポップアップ ボタンなどによる言語切り替えを可能にしたいです.
現状では,ポップアップによる言語の切り替え自体はできているのですが,ポップアップのボタンを押すまで読み込みが行われない仕様のため,リロードを行うとブロックが正しく復元されません.
現状,ボタンでjp,enを切り替えてもブロックが復元されない問題は解消できたのですが,なぜかjpを押してもブロックの言語が英語のままになってしまいます.
該当のソースコード
質問での文字数制限に引っかかってしまうため,詳しくは
リポジトリをご参照いただけると幸いです.
index.html
script.js
が該当するファイルとなります.
html:index.html
1<!DOCTYPE html> 2<html lang="ja"> 3 4 5 <head> 6 <title>PMusic</title> 7 <script src="https://cdn.jsdelivr.net/npm/blockly@1.0.0/blockly_compressed.min.js"></script> 8 <script src="https://cdn.jsdelivr.net/npm/blockly@1.0.0/blocks_compressed.min.js"></script> 9 <script src="https://cdn.jsdelivr.net/npm/blockly@1.0.0/msg/js/en.min.js"></script> 10 <script src="https://cdn.jsdelivr.net/npm/blockly@1.0.0/javascript_compressed.min.js"></script> 11 <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script> 12 <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script> 13 <script src="node_modules/@blockly/field-slider/dist/index.js"></script> 14 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script> 15 16 <div class="jp"> 17 <script src="CodeBlocks/Japanese/blocks/js/play_block.js"></script> 18 <script src="CodeBlocks/Japanese/generators/play.js"></script> 19 <script src="CodeBlocks/Japanese/blocks/js/play_block2.js"></script> 20 <script src="CodeBlocks/Japanese/generators/play2.js"></script> 21 <script src="CodeBlocks/Japanese/blocks/js/gauss_block.js"></script> 22 <script src="CodeBlocks/Japanese/generators/gauss.js"></script> 23 <script src="CodeBlocks/Japanese/blocks/js/gauss_block2.js"></script> 24 <script src="CodeBlocks/Japanese/generators/gauss2.js"></script> 25 <script src="CodeBlocks/Japanese/blocks/js/weibul_block.js"></script> 26 <script src="CodeBlocks/Japanese/generators/weibul.js"></script> 27 <script src="CodeBlocks/Japanese/blocks/js/weibul_block2.js"></script> 28 <script src="CodeBlocks/Japanese/generators/weibul2.js"></script> 29 <script src="CodeBlocks/Japanese/blocks/js/randwalk_block1.js"></script> 30 <script src="CodeBlocks/Japanese/generators/randwalk1.js"></script> 31 <script src="CodeBlocks/Japanese/blocks/js/randwalk_block.js"></script> 32 <script src="CodeBlocks/Japanese/generators/randwalk.js"></script> 33 </div> 34 35 <div class="en"> 36 <script src="CodeBlocks/English/blocks/js/play_block.js"></script> 37 <script src="CodeBlocks/English/generators/play.js"></script> 38 <script src="CodeBlocks/English/blocks/js/play_block2.js"></script> 39 <script src="CodeBlocks/English/generators/play2.js"></script> 40 <script src="CodeBlocks/English/blocks/js/gauss_block.js"></script> 41 <script src="CodeBlocks/English/generators/gauss.js"></script> 42 <script src="CodeBlocks/English/blocks/js/gauss_block2.js"></script> 43 <script src="CodeBlocks/English/generators/gauss2.js"></script> 44 <script src="CodeBlocks/English/blocks/js/weibul_block.js"></script> 45 <script src="CodeBlocks/English/generators/weibul.js"></script> 46 <script src="CodeBlocks/English/blocks/js/weibul_block2.js"></script> 47 <script src="CodeBlocks/English/generators/weibul2.js"></script> 48 <script src="CodeBlocks/English/blocks/js/randwalk_block1.js"></script> 49 <script src="CodeBlocks/English/generators/randwalk1.js"></script> 50 <script src="CodeBlocks/English/blocks/js/randwalk_block.js"></script> 51 <script src="CodeBlocks/English/generators/randwalk.js"></script> 52 </div> 53 </head> 54 55 <body> 56 57 <script> 58 window.addEventListener('load', function () { 59 const body = document.querySelector('body'); 60 const languagePopup = document.getElementById('languagePopup'); 61 body.classList.add('open_popup'); 62 // ポップアップ内のクリックイベント伝播を防ぐ 63 languagePopup.querySelector('.onetime_popup').addEventListener('click', function (e) { 64 e.stopPropagation(); 65 console.log('Popup clicked'); 66 }); 67 }, false); 68 </script> 69 70 <div id="content" style="display:flex;"> 71 <div> 72 <!-- 2タブ構成 --> 73 <div class="tab-wrap"> 74 <input id="TAB-01" type="radio" name="TAB" class="tab-switch" checked="checked" /><label class="tab-label" for="TAB-01">block result</label> 75 <div class="tab-content"> 76 <!-- コード反映欄 --> 77 <div id="code" style="width: 700px; padding: 5px; border: 2px solid black;"><pre/></div> 78 </div> 79 <input id="TAB-02" type="radio" name="TAB" class="tab-switch" /><label class="tab-label" for="TAB-02">write script</label> 80 <div class="tab-content"> 81 <!-- スクリプト記述欄 --> 82 <div id="codeEditor" class="tabcontent"> 83 <textarea id="codeInput" style="width: 100%;"></textarea> 84 </div> 85 </div> 86 </div> 87 88 <div class="jp"> 89 <button class="btn_code" id="Save" onclick="saveBlocks();">保存</button> <button class="btn_code" id="Load" onclick="loadBlocks();">呼出し</button> 90 </div> 91 <div class="en"> 92 <button class="btn_code" id="SaveEN" onclick="saveBlocks();">Save</button> <button class="btn_code" id="LoadEN" onclick="loadBlocks();">Load</button> 93 </div> 94 <div class="p-main"> 95 <div class="p-main__para"> 96 <p class="jp">日本語</p> 97 <p class="en">English</p> 98 <p> 99 <div class="l-lang"> 100 <a data-siteview="jp" class="l-lang__jp" href="./index.html">jp</a> 101 <a data-siteview="en" class="l-lang__en" href="./index.html">en</a> 102 </div> 103 </p> 104 </div> 105 </div> 106 </div>
JavaScript:script.js
1$(function(){ 2 // クッキーをセットする 3 function setSiteviewCookie() { 4 $('.l-lang a').bind('click', function() { //言語切り替えボタンを押下したときに発火 5 $.cookie('siteview', $(this).data('siteview'), { path: '/' }); //siteviewという名前でcookieに値をセット 6 }); 7 } 8 setSiteviewCookie(); 9 10 // 日本語 or 英語を選んだ場合の処理 11 if($.cookie('siteview') == 'en') { 12 //英語が選択されている場合(coockieの値にenが設定されている時) 13 $('.en').css('display', 'block'); //英語を表示 14 $('.jp').css('display', 'none'); //日本語を非表示 15 $('.l-lang .l-lang__en').addClass('is-active'); //言語切り替えボタンにクラスを振る処理 16 $('.l-lang .l-lang__jp').removeClass('is-active'); 17 } else { 18 //日本語が選択されている場合 19 $('.jp').css('display', 'block'); //日本語を表示 20 $('.en').css('display', 'none'); //英語を非表示 21 $('.l-lang .l-lang__jp').addClass('is-active'); 22 $('.l-lang .l-lang__en').removeClass('is-active'); 23 } 24})
試したこと
以下のようにして,先に日本語で読み込んでおいて見ようとしましたが,ブロックをおいてもスクリプトが生成されなくなってしまいだめでした
手法変更のため,関係ない記述です.
JavaScript
1var KEY = 'BlocklyStorage'; 2var workspace; 3 4window.onload = function() { 5 setLanguage('ja'); 6 console.log("onLoad"); 7 initializeBlockly(); 8}; 9 10function initializeBlockly() { 11 workspace = Blockly.inject('blocklyDiv', { 12 toolbox: document.getElementById('toolbox'), 13 trashcan: true 14 }); 15 16 // ここからBlockly関連の処理を続ける 17 window.setTimeout(function () { 18 console.log("setTimeout"); 19 if ('localStorage' in window && window.localStorage[KEY]) { 20 restoreBlocks(); 21 } else { 22 var startBlocksText = document.getElementById('startBlocks').outerHTML; 23 var xml = Blockly.Xml.textToDom(startBlocksText); 24 Blockly.Xml.domToWorkspace(xml, workspace); 25 myUpdateFunction(); 26 } 27 }, 0); 28}
追記
<div class="en"
でブロックのJSファイルを読み込むというのが,Englishを選択した時に読み込むという意図で書いたのですが,想定通りには機能せず,日本語ファイルよりも後ろで読み込んでいるからどちらの言語を押しても英語のブロックが表示されているようです.(data-siteview="ja"
のようにしてしているので当然と言えば当然のようではありますが)
ここをコメントアウトして日本語用のJSファイルだけを読み込んだら,どちらの言語を押しても日本語のブロックが表示されていたので.

回答1件
あなたの回答
tips
プレビュー