ver1.3.1
This commit is contained in:
parent
e9516278ef
commit
c11caf2c97
274
simple-translate/Settings.js
Normal file
274
simple-translate/Settings.js
Normal file
|
@ -0,0 +1,274 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
//初回起動時にオプションページを表示して設定を初期化
|
||||||
|
//Display option page at initial startup and initialize settings
|
||||||
|
/*
|
||||||
|
browser.runtime.onInstalled.addListener(function(){
|
||||||
|
browser.runtime.openOptionsPage();
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
function settingsObj() {};
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
//オプションページを書き換え,設定の初期化
|
||||||
|
//Rewrite option page, initialize setting
|
||||||
|
settingsObj.prototype.initOptionsPage = function () {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
labelSet();
|
||||||
|
getSettingsByHtml();
|
||||||
|
overRideSettingsByStorage().then(function () {
|
||||||
|
overRideHtml();
|
||||||
|
saveSettings();
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
};
|
||||||
|
//オプションページから設定を保存
|
||||||
|
//Save settings from options page
|
||||||
|
settingsObj.prototype.saveOptionsPage = function () {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
getSettingsByHtml();
|
||||||
|
saveSettings().then(function () {
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
};
|
||||||
|
//設定を初期化
|
||||||
|
//Initialize setting
|
||||||
|
settingsObj.prototype.init = function () {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
getSettings().then(function () {
|
||||||
|
resolve(Settings);
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//設定を返す
|
||||||
|
//return settings
|
||||||
|
settingsObj.prototype.get = function () {
|
||||||
|
return Settings;
|
||||||
|
};
|
||||||
|
//受け取ったオブジェクトを保存
|
||||||
|
//Save the received object
|
||||||
|
settingsObj.prototype.save = function (settings) {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
for (let i in settings) {
|
||||||
|
Settings[i] = settings[i];
|
||||||
|
}
|
||||||
|
saveSettings().then(function () {
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
};
|
||||||
|
//設定を削除
|
||||||
|
//Delete settings
|
||||||
|
settingsObj.prototype.clear = function (setting) {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
delete Settings[setting];
|
||||||
|
saveSettings().then(function () {
|
||||||
|
resolve();
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//全ての設定を削除
|
||||||
|
//Delete all settings
|
||||||
|
settingsObj.prototype.clearAll = function () {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
Settings = new settingsObj();
|
||||||
|
saveSettings().then(function () {
|
||||||
|
resolve();
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//let Settings = new settingsObj();
|
||||||
|
let Settings={};
|
||||||
|
//S = new settingsObj(); //外部から呼び出し Call from outside
|
||||||
|
|
||||||
|
//spanやoptionのid,buttonのclassに"Label"が含まれるときi18nから値を取得して書き換え
|
||||||
|
//When "label" is included in span and option id, button class Retrieve the value from i18n and rewrite it
|
||||||
|
function labelSet() {
|
||||||
|
|
||||||
|
//span idにLableが含まれていたら
|
||||||
|
let spans = document.getElementsByTagName("span");
|
||||||
|
for (let i in spans) {
|
||||||
|
if (spans[i].id == undefined || spans[i].id.indexOf("Label") == -1) continue;
|
||||||
|
let label = browser.i18n.getMessage(spans[i].id);
|
||||||
|
if (label == "") continue;
|
||||||
|
spans[i].innerHTML = label;
|
||||||
|
}
|
||||||
|
|
||||||
|
//button, submit, text classにLabelが含まれていたら
|
||||||
|
let inputs = document.getElementsByTagName("input");
|
||||||
|
for (let i in inputs) {
|
||||||
|
if (inputs[i].id == undefined || inputs[i].className.indexOf("Label") == -1) continue;
|
||||||
|
let label=browser.i18n.getMessage(inputs[i].className);
|
||||||
|
if(label=="")continue;
|
||||||
|
|
||||||
|
switch (inputs[i].type) {
|
||||||
|
case "button":
|
||||||
|
case "submit":
|
||||||
|
inputs[i].value = label;
|
||||||
|
break;
|
||||||
|
case "text":
|
||||||
|
inputs[i].placeholder=label;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//options idにLabelが含まれていたら
|
||||||
|
let options=document.getElementsByTagName("option");
|
||||||
|
for(let i in options){
|
||||||
|
if (options[i].id == undefined || options[i].id.indexOf("Label") == -1) continue;
|
||||||
|
let label=browser.i18n.getMessage(options[i].id);
|
||||||
|
if(label=="")continue;
|
||||||
|
|
||||||
|
options[i].innerHTML=label;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//storageからSettingsの項目を取得して存在しない物をSettingsに上書き
|
||||||
|
//Retrieve the Settings item from storage and overwrite Settings that do not exist
|
||||||
|
function overRideSettingsByStorage() {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
browser.storage.local.get("Settings", function (value) {
|
||||||
|
|
||||||
|
for (let i in Settings) {
|
||||||
|
if (value.Settings!=undefined && value.Settings[i] != undefined) {
|
||||||
|
Settings[i] = value.Settings[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let i in value.Settings) {
|
||||||
|
if (Settings[i] == undefined) Settings[i] = value.Settings[i];
|
||||||
|
}
|
||||||
|
resolve();
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//オプションページにSettingsを反映
|
||||||
|
//Reflect Settings on option page
|
||||||
|
function overRideHtml() {
|
||||||
|
let inputs = document.getElementsByTagName("input");
|
||||||
|
for (let i in inputs) {
|
||||||
|
if(inputs[i].id==undefined) continue;
|
||||||
|
if (inputs[i].className != undefined && inputs[i].className.indexOf("noSetting") != -1) continue;
|
||||||
|
|
||||||
|
switch (inputs[i].type) {
|
||||||
|
case "text":
|
||||||
|
case "number":
|
||||||
|
case "search":
|
||||||
|
case "tel":
|
||||||
|
case "url":
|
||||||
|
case "email":
|
||||||
|
case "password":
|
||||||
|
case "datetime":
|
||||||
|
case "month":
|
||||||
|
case "week":
|
||||||
|
case "time":
|
||||||
|
case "datetime-local":
|
||||||
|
case "range":
|
||||||
|
case "color":
|
||||||
|
inputs[i].value = Settings[inputs[i].id];
|
||||||
|
break;
|
||||||
|
case "checkbox":
|
||||||
|
inputs[i].checked = Settings[inputs[i].id];
|
||||||
|
break;
|
||||||
|
case "radio":
|
||||||
|
if (Settings[inputs[i].name] == inputs[i].value) {
|
||||||
|
inputs[i].checked = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let textareas=document.getElementsByTagName("textarea");
|
||||||
|
for(let i in textareas){
|
||||||
|
if(textareas[i].id==undefined) continue;
|
||||||
|
if (textareas[i].className != undefined && textareas[i].className.indexOf("noSetting") != -1) continue;
|
||||||
|
textareas[i].value=Settings[textareas[i].id];
|
||||||
|
}
|
||||||
|
|
||||||
|
let selects=document.getElementsByTagName("select");
|
||||||
|
for(let i in selects){
|
||||||
|
if(selects[i].id==undefined) continue;
|
||||||
|
if (selects[i].className != undefined && inputs[i].className.indexOf("noSetting") != -1) continue;
|
||||||
|
|
||||||
|
selects[i].value=Settings[selects[i].id];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//オプションページから設定の値を取得
|
||||||
|
//Get setting value from option page
|
||||||
|
function getSettingsByHtml() {
|
||||||
|
let inputs = document.getElementsByTagName("input");
|
||||||
|
|
||||||
|
for (let i in inputs) {
|
||||||
|
if(inputs[i].id==undefined) continue;
|
||||||
|
if (inputs[i].className != undefined && inputs[i].className.indexOf("noSetting") != -1) continue;
|
||||||
|
|
||||||
|
switch (inputs[i].type) {
|
||||||
|
case "text":
|
||||||
|
case "number":
|
||||||
|
case "search":
|
||||||
|
case "tel":
|
||||||
|
case "url":
|
||||||
|
case "email":
|
||||||
|
case "password":
|
||||||
|
case "datetime":
|
||||||
|
case "month":
|
||||||
|
case "week":
|
||||||
|
case "time":
|
||||||
|
case "datetime-local":
|
||||||
|
case "range":
|
||||||
|
case "color":
|
||||||
|
Settings[inputs[i].id] = inputs[i].value;
|
||||||
|
break;
|
||||||
|
case "checkbox":
|
||||||
|
Settings[inputs[i].id] = inputs[i].checked;
|
||||||
|
break;
|
||||||
|
case "radio":
|
||||||
|
if (inputs[i].checked == true) {
|
||||||
|
Settings[inputs[i].name] = inputs[i].value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let textareas=document.getElementsByTagName("textarea");
|
||||||
|
for(let i in textareas){
|
||||||
|
if(textareas[i].id==undefined) continue;
|
||||||
|
if (textareas[i].className != undefined && textareas[i].className.indexOf("noSetting") != -1) continue;
|
||||||
|
Settings[textareas[i].id]=textareas[i].value;
|
||||||
|
}
|
||||||
|
|
||||||
|
let selects=document.getElementsByTagName("select");
|
||||||
|
for(let i in selects){
|
||||||
|
if(selects[i].id==undefined) continue;
|
||||||
|
if (selects[i].className != undefined && selects[i].className.indexOf("noSetting") != -1) continue;
|
||||||
|
|
||||||
|
Settings[selects[i].id]=selects[i].value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//ストレージが変更されたらget
|
||||||
|
browser.storage.onChanged.addListener(getSettings);
|
||||||
|
function getSettings() {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
browser.storage.local.get("Settings", function (value) {
|
||||||
|
Settings = value.Settings;
|
||||||
|
resolve(Settings);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveSettings() {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
browser.storage.local.set({
|
||||||
|
'Settings': Settings
|
||||||
|
}).then(function () {
|
||||||
|
resolve(Settings);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}());
|
|
@ -11,7 +11,7 @@
|
||||||
"showLink":{
|
"showLink":{
|
||||||
"message": "Translate this page"
|
"message": "Translate this page"
|
||||||
},
|
},
|
||||||
"LangListLabel":{
|
"targetLangLabel":{
|
||||||
"message":"Target language"
|
"message":"Target language"
|
||||||
},
|
},
|
||||||
"langList":{
|
"langList":{
|
||||||
|
@ -40,5 +40,26 @@
|
||||||
},
|
},
|
||||||
"translateLinkMenu":{
|
"translateLinkMenu":{
|
||||||
"message": "Translate selected link"
|
"message": "Translate selected link"
|
||||||
|
},
|
||||||
|
"panelSizeLabel":{
|
||||||
|
"message": "Size of translation panel"
|
||||||
|
},
|
||||||
|
"buttonSizeLabel":{
|
||||||
|
"message": "Size of button"
|
||||||
|
},
|
||||||
|
"buttonPositionLabel":{
|
||||||
|
"message": "Display position of button"
|
||||||
|
},
|
||||||
|
"rightUpLabel":{
|
||||||
|
"message": "Upper right"
|
||||||
|
},
|
||||||
|
"rightDownLabel":{
|
||||||
|
"message": "Bottom right"
|
||||||
|
},
|
||||||
|
"fontSizeLabel":{
|
||||||
|
"message": "Font size"
|
||||||
|
},
|
||||||
|
"saveLabel":{
|
||||||
|
"message": "Save"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -11,7 +11,7 @@
|
||||||
"showLink":{
|
"showLink":{
|
||||||
"message": "このページを翻訳"
|
"message": "このページを翻訳"
|
||||||
},
|
},
|
||||||
"LangListLabel":{
|
"targetLangLabel":{
|
||||||
"message":"翻訳先の言語"
|
"message":"翻訳先の言語"
|
||||||
},
|
},
|
||||||
"langList":{
|
"langList":{
|
||||||
|
@ -40,5 +40,26 @@
|
||||||
},
|
},
|
||||||
"translateLinkMenu":{
|
"translateLinkMenu":{
|
||||||
"message": "選択したリンクを翻訳"
|
"message": "選択したリンクを翻訳"
|
||||||
|
},
|
||||||
|
"panelSizeLabel":{
|
||||||
|
"message": "翻訳パネルのサイズ"
|
||||||
|
},
|
||||||
|
"buttonSizeLabel":{
|
||||||
|
"message": "ボタンのサイズ"
|
||||||
|
},
|
||||||
|
"buttonPositionLabel":{
|
||||||
|
"message": "ボタンの表示位置"
|
||||||
|
},
|
||||||
|
"rightUpLabel":{
|
||||||
|
"message": "右上"
|
||||||
|
},
|
||||||
|
"rightDownLabel":{
|
||||||
|
"message": "右下"
|
||||||
|
},
|
||||||
|
"fontSizeLabel":{
|
||||||
|
"message": "フォントサイズ"
|
||||||
|
},
|
||||||
|
"saveLabel":{
|
||||||
|
"message": "保存"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,20 +1,26 @@
|
||||||
getSetting();
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
browser.storage.onChanged.addListener(getSetting)
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
//設定の読み出し
|
//初回起動時にオプションページを表示して設定を初期化
|
||||||
function getSetting() {
|
browser.runtime.onInstalled.addListener(function(){
|
||||||
browser.storage.local.get(["targetLang", "ifShowButton", "ifCheckLang", "ifShowMenu"], function (value) {
|
browser.runtime.openOptionsPage();
|
||||||
if (value.targetLang == undefined) initialSetting(); //初回起動時
|
|
||||||
targetLang = value.targetLang;
|
|
||||||
ifShowButton = value.ifShowButton;
|
|
||||||
ifCheckLang = value.ifCheckLang;
|
|
||||||
ifShowMenu = value.ifShowMenu;
|
|
||||||
if (ifShowMenu) menuCreate();
|
|
||||||
else menuRemove();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let S = new settingsObj()
|
||||||
|
browser.storage.onChanged.addListener(showMenu);
|
||||||
|
|
||||||
|
S.init().then(function(){
|
||||||
|
showMenu();
|
||||||
|
});
|
||||||
|
function showMenu(){
|
||||||
|
if(S.get().ifShowMenu){
|
||||||
|
menuRemove();
|
||||||
|
menuCreate();
|
||||||
|
}
|
||||||
|
else menuRemove();
|
||||||
}
|
}
|
||||||
|
|
||||||
//設定の初期化
|
|
||||||
function initialSetting() {
|
function initialSetting() {
|
||||||
switch (browser.i18n.getUILanguage()) { //一部の言語はブラウザの設定に合わせる
|
switch (browser.i18n.getUILanguage()) { //一部の言語はブラウザの設定に合わせる
|
||||||
case "ja":
|
case "ja":
|
||||||
|
@ -22,19 +28,13 @@ function initialSetting() {
|
||||||
case "zh-TW":
|
case "zh-TW":
|
||||||
case "ko":
|
case "ko":
|
||||||
targetLang = browser.i18n.getUILanguage();
|
targetLang = browser.i18n.getUILanguage();
|
||||||
|
secondTargetLang="en";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
targetLang = "en";
|
targetLang = "en";
|
||||||
|
secondTargetLang="ja";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
browser.storage.local.set({
|
|
||||||
'targetLang': targetLang,
|
|
||||||
'ifShowButton': true,
|
|
||||||
'ifCheckLang': true,
|
|
||||||
'ifShowMenu': true
|
|
||||||
}, function () {
|
|
||||||
getSetting();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//メニューを表示
|
//メニューを表示
|
||||||
|
@ -91,7 +91,7 @@ function translateTextMenu(info, tab) {
|
||||||
//ページ全体を翻訳
|
//ページ全体を翻訳
|
||||||
function translatePageMenu(info, tab) {
|
function translatePageMenu(info, tab) {
|
||||||
browser.tabs.create({
|
browser.tabs.create({
|
||||||
'url': "https://translate.google.co.jp/translate?hl=" + targetLang + "&sl=auto&u=" + encodeURIComponent(info.pageUrl),
|
'url': "https://translate.google.co.jp/translate?hl=" + S.get().targetLang + "&sl=auto&u=" + encodeURIComponent(info.pageUrl),
|
||||||
'active': true,
|
'active': true,
|
||||||
'index': tab.index + 1
|
'index': tab.index + 1
|
||||||
});
|
});
|
||||||
|
@ -100,7 +100,7 @@ function translatePageMenu(info, tab) {
|
||||||
//リンクを翻訳
|
//リンクを翻訳
|
||||||
function translateLinkMenu(info, tab) {
|
function translateLinkMenu(info, tab) {
|
||||||
browser.tabs.create({
|
browser.tabs.create({
|
||||||
'url': "https://translate.google.co.jp/translate?hl=" + targetLang + "&sl=auto&u=" + encodeURIComponent(info.linkUrl),
|
'url': "https://translate.google.co.jp/translate?hl=" + S.get().targetLang + "&sl=auto&u=" + encodeURIComponent(info.linkUrl),
|
||||||
'active': true,
|
'active': true,
|
||||||
'index': tab.index + 1
|
'index': tab.index + 1
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"version": "1.2.1",
|
"version": "1.3.1",
|
||||||
|
|
||||||
"name": "__MSG_extName__",
|
"name": "__MSG_extName__",
|
||||||
"description": "__MSG_extDescription__",
|
"description": "__MSG_extDescription__",
|
||||||
|
@ -12,7 +12,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"permissions": ["<all_urls>", "storage", "contextMenus"],
|
"permissions": ["<all_urls>", "storage", "contextMenus", "clipboardRead"],
|
||||||
|
|
||||||
"options_ui": {
|
"options_ui": {
|
||||||
"page": "options/options.html"
|
"page": "options/options.html"
|
||||||
|
@ -28,7 +28,7 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
"background": {
|
"background": {
|
||||||
"scripts": ["background.js"]
|
"scripts": ["Settings.js", "background.js"]
|
||||||
},
|
},
|
||||||
|
|
||||||
"browser_action": {
|
"browser_action": {
|
||||||
|
@ -49,7 +49,7 @@
|
||||||
{
|
{
|
||||||
"matches": ["http://*/*", "https://*/*", "<all_urls>"],
|
"matches": ["http://*/*", "https://*/*", "<all_urls>"],
|
||||||
"css": ["simple-translate.css"],
|
"css": ["simple-translate.css"],
|
||||||
"js": ["simple-translate.js"]
|
"js": ["Settings.js", "simple-translate.js"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,3 +4,23 @@ background-color: #d7d7db;
|
||||||
height: 1px;
|
height: 1px;
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
input[type="number"] {
|
||||||
|
-moz-appearance:textfield;
|
||||||
|
width: 50px;
|
||||||
|
}
|
||||||
|
#save{
|
||||||
|
width: auto;
|
||||||
|
height: 30px;
|
||||||
|
|
||||||
|
margin-left: ;
|
||||||
|
margin-right: auto;
|
||||||
|
|
||||||
|
|
||||||
|
color: #111;
|
||||||
|
border: 1px solid #bbb;
|
||||||
|
border-radius: 2px;
|
||||||
|
background-color: #fbfbfb;
|
||||||
|
}
|
||||||
|
#save:hover{
|
||||||
|
background: #f5f5f5;
|
||||||
|
}
|
||||||
|
|
|
@ -12,21 +12,21 @@
|
||||||
<select id="targetLang"></select></label>
|
<select id="targetLang"></select></label>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<label><input type="checkbox" name="ifShowButton" value="1">
|
<label><input type="checkbox" id="ifShowButton" checked=true>
|
||||||
<span id=ifShowButtonLabel>テキスト選択時にボタンを表示する</span></label>
|
<span id=ifShowButtonLabel>テキスト選択時にボタンを表示する</span></label>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<label><input type="checkbox" name="ifCheckLang" value="1">
|
<label><input type="checkbox" id=ifCheckLang checked=true>
|
||||||
<span id=ifCheckLangLabel>選択したテキストが翻訳先言語と同じ時はボタンを表示しない</span></label>
|
<span id=ifCheckLangLabel>選択したテキストが翻訳先言語と同じ時はボタンを表示しない</span></label>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<label><input type="checkbox" name="ifShowMenu" value="1">
|
<label><input type="checkbox" id=ifShowMenu checked=true>
|
||||||
<span id=ifShowMenuLabel>コンテキストメニューを表示する</span></label>
|
<span id=ifShowMenuLabel>コンテキストメニューを表示する</span></label>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
<p>
|
<p>
|
||||||
<label><input type="checkbox" name="ifChangeSecondLang" value="1">
|
<label><input type="checkbox" id=ifChangeSecondLang>
|
||||||
<span id=ifChangeSecondLangLabel>ツールバー翻訳パネルの入力テキストが翻訳先言語と同じ場合は第2言語に切り替える</span></label>
|
<span id=ifChangeSecondLangLabel>ツールバー翻訳パネルの入力テキストが翻訳先言語と同じ場合は第2言語に切り替える</span></label>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -35,7 +35,43 @@
|
||||||
<select id="secondTargetLang"></select></label>
|
<select id="secondTargetLang"></select></label>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<p>
|
||||||
|
<span id=panelSizeLabel>翻訳パネルのサイズ</span>
|
||||||
|
<label><span>W</span>
|
||||||
|
<input id=width type=number value=300 min=1 placeholder=300>
|
||||||
|
</label>
|
||||||
|
<label><span>H</span>
|
||||||
|
<input id=height type=number value=200 min=1 placeholder=200>
|
||||||
|
</label>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<label><span id=buttonSizeLabel>ボタンのサイズ</span>
|
||||||
|
<input id=buttonSize type=number value=22 min=1 placeholder=22>
|
||||||
|
</label>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<span id=buttonPositionLabel>ボタンの表示位置</span>
|
||||||
|
<label>
|
||||||
|
<input type=radio name=buttonPosition value=rightUp><span id=rightUpLabel>右上</span>
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<input type=radio name=buttonPosition value=rightDown checked><span id=rightDownLabel>右下</span>
|
||||||
|
</label>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<label><span id=fontSizeLabel>フォントサイズ</span>
|
||||||
|
<input id=fontSize type=number value=13 min=1 placeholder=13>
|
||||||
|
</label>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<input type=button id=save value=save class=saveLabel>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="../Settings.js"></script>
|
||||||
<script type="text/javascript" src="options.js"></script>
|
<script type="text/javascript" src="options.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|
|
@ -1,44 +1,17 @@
|
||||||
var targetLang = document.getElementById("targetLang");
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
var ifShowButton = document.getElementsByName("ifShowButton").item(0);
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
var ifCheckLang = document.getElementsByName("ifCheckLang").item(0);
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
var ifShowMenu = document.getElementsByName("ifShowMenu").item(0);
|
|
||||||
var ifChangeSecondLang = document.getElementsByName("ifChangeSecondLang").item(0);
|
let S = new settingsObj()
|
||||||
var secondTargetLang = document.getElementById("secondTargetLang");
|
let targetLang = document.getElementById("targetLang");
|
||||||
|
let secondTargetLang = document.getElementById("secondTargetLang");
|
||||||
|
|
||||||
targetLang.innerHTML=browser.i18n.getMessage("langList");
|
targetLang.innerHTML=browser.i18n.getMessage("langList");
|
||||||
secondTargetLang.innerHTML=browser.i18n.getMessage("langList");
|
secondTargetLang.innerHTML=browser.i18n.getMessage("langList");
|
||||||
|
|
||||||
document.getElementById("targetLangLabel").innerHTML=browser.i18n.getMessage("langListLabel");
|
S.initOptionsPage().then(function(){
|
||||||
document.getElementById("ifShowButtonLabel").innerHTML=browser.i18n.getMessage("ifShowButtonLabel");
|
document.getElementById("save").addEventListener('click', function(){
|
||||||
document.getElementById("ifCheckLangLabel").innerHTML=browser.i18n.getMessage("ifCheckLangLabel");
|
S.saveOptionsPage();
|
||||||
document.getElementById("ifShowMenuLabel").innerHTML=browser.i18n.getMessage("ifShowMenuLabel");
|
|
||||||
document.getElementById("ifChangeSecondLangLabel").innerHTML=browser.i18n.getMessage("ifChangeSecondLangLabel");
|
|
||||||
document.getElementById("secondTargetLangLabel").innerHTML=browser.i18n.getMessage("secondTargetLangLabel");
|
|
||||||
|
|
||||||
//設定を読み込んで反映
|
|
||||||
browser.storage.local.get(["targetLang", "ifShowButton", "ifCheckLang", "ifShowMenu", "ifChangeSecondLang", "secondTargetLang"], function (value) {
|
|
||||||
targetLang.value = value.targetLang;
|
|
||||||
ifShowButton.checked=value.ifShowButton;
|
|
||||||
ifCheckLang.checked=value.ifCheckLang;
|
|
||||||
ifShowMenu.checked=value.ifShowMenu;
|
|
||||||
ifChangeSecondLang.checked=value.ifChangeSecondLang;
|
|
||||||
secondTargetLang.value=value.secondTargetLang;
|
|
||||||
});
|
});
|
||||||
|
})
|
||||||
|
|
||||||
function save() {
|
|
||||||
browser.storage.local.set({
|
|
||||||
'targetLang': targetLang.value,
|
|
||||||
'ifShowButton': ifShowButton.checked,
|
|
||||||
'ifCheckLang': ifCheckLang.checked,
|
|
||||||
'ifShowMenu': ifShowMenu.checked,
|
|
||||||
'ifChangeSecondLang': ifChangeSecondLang.checked,
|
|
||||||
'secondTargetLang': secondTargetLang.value
|
|
||||||
}, function () {});
|
|
||||||
}
|
|
||||||
|
|
||||||
targetLang.addEventListener("change", save);
|
|
||||||
ifShowButton.addEventListener("change", save);
|
|
||||||
ifCheckLang.addEventListener("change", save);
|
|
||||||
ifShowMenu.addEventListener("change", save);
|
|
||||||
ifChangeSecondLang.addEventListener("change", save);
|
|
||||||
secondTargetLang.addEventListener("change", save);
|
|
|
@ -1,5 +1,5 @@
|
||||||
body {
|
body {
|
||||||
font-family: 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'Meiryo', 'メイリオ', 'Osaka', 'MS PGothic', 'arial', 'helvetica', 'sans-serif';
|
font-family: 'Sugoe UI','Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'Meiryo', 'メイリオ', 'Osaka', 'MS PGothic', 'arial', 'helvetica', 'sans-serif';
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
height: auto;
|
height: auto;
|
||||||
|
@ -20,9 +20,8 @@ hr {
|
||||||
p {}
|
p {}
|
||||||
|
|
||||||
textarea {
|
textarea {
|
||||||
font-family: 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'Meiryo', 'メイリオ', 'Osaka', 'MS PGothic', 'arial', 'helvetica', 'sans-serif';
|
font: inherit;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font-size: 13px;
|
|
||||||
resize: none;
|
resize: none;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
max-height: 250px;
|
max-height: 250px;
|
||||||
|
@ -42,6 +41,7 @@ textarea {
|
||||||
|
|
||||||
#target {
|
#target {
|
||||||
max-height: 250px;
|
max-height: 250px;
|
||||||
|
min-height: 20px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
@ -51,9 +51,8 @@ textarea {
|
||||||
}
|
}
|
||||||
|
|
||||||
#langList {
|
#langList {
|
||||||
font-family: 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'Meiryo', 'メイリオ', 'Osaka', 'MS PGothic', 'arial', 'helvetica', 'sans-serif';
|
font: inherit;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font-size: 13px;
|
|
||||||
float: right;
|
float: right;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
max-width: 140px;
|
max-width: 140px;
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<body>
|
<body>
|
||||||
<div id=main>
|
<div id=main>
|
||||||
<form>
|
<form>
|
||||||
<textarea id=textarea spellcheck=false></textarea>
|
<textarea id=textarea spellcheck=false contenteditable=true></textarea>
|
||||||
</form>
|
</form>
|
||||||
<hr>
|
<hr>
|
||||||
<div id=target>
|
<div id=target>
|
||||||
|
@ -20,6 +20,7 @@
|
||||||
<select id="langList"></select>
|
<select id="langList"></select>
|
||||||
<div id=link></div>
|
<div id=link></div>
|
||||||
|
|
||||||
|
<script src="../Settings.js"></script>
|
||||||
<script src="popup.js"></script>
|
<script src="popup.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,27 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
let S=new settingsObj();
|
||||||
|
//設定を読み出し
|
||||||
|
S.init().then(function(value){
|
||||||
|
defaultTargetLang = value.targetLang;
|
||||||
|
targetLang = value.targetLang;
|
||||||
|
secondTargetLang = value.secondTargetLang;
|
||||||
|
ifChangeSecondLang=value.ifChangeSecondLang;
|
||||||
|
langList.value = targetLang; //リスト初期値をセット
|
||||||
|
langList.addEventListener("change", changeLang);
|
||||||
|
|
||||||
|
document.body.style.fontSize=value.fontSize;
|
||||||
|
})
|
||||||
|
|
||||||
let target = document.getElementById("target");
|
let target = document.getElementById("target");
|
||||||
let langList = document.getElementById("langList");
|
let langList = document.getElementById("langList");
|
||||||
let textarea = document.getElementById("textarea");
|
let textarea = document.getElementById("textarea");
|
||||||
|
|
||||||
const initialText = browser.i18n.getMessage("initialTextArea");
|
|
||||||
langList.innerHTML = browser.i18n.getMessage("langList");
|
langList.innerHTML = browser.i18n.getMessage("langList");
|
||||||
textarea.innerText = initialText;
|
const initialText = browser.i18n.getMessage("initialTextArea");
|
||||||
|
textarea.placeholder= initialText;
|
||||||
|
|
||||||
let targetLang;
|
let targetLang;
|
||||||
let secondTargetLang;
|
let secondTargetLang;
|
||||||
|
@ -12,19 +29,11 @@ let defaultTargetLang;
|
||||||
let ifChangeSecondLang;
|
let ifChangeSecondLang;
|
||||||
let sourceWord = "";
|
let sourceWord = "";
|
||||||
|
|
||||||
browser.storage.onChanged.addListener(getTargetLang);
|
/*
|
||||||
getTargetLang(); //翻訳先言語初期化
|
//Firefoxの仕様上popup.htmlでfocusが効かないため使えない
|
||||||
//設定を読み出し
|
textarea.focus();
|
||||||
function getTargetLang() {
|
document.execCommand("paste");
|
||||||
browser.storage.local.get(["targetLang", "secondTargetLang","ifChangeSecondLang"], function (value) {
|
*/
|
||||||
defaultTargetLang = value.targetLang;
|
|
||||||
targetLang = value.targetLang;
|
|
||||||
secondTargetLang = value.secondTargetLang;
|
|
||||||
ifChangeSecondLang=value.ifChangeSecondLang;
|
|
||||||
langList.value = targetLang; //リスト初期値をセット
|
|
||||||
langList.addEventListener("change", changeLang);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
//翻訳先言語変更時に更新
|
//翻訳先言語変更時に更新
|
||||||
function changeLang() {
|
function changeLang() {
|
||||||
|
@ -73,7 +82,16 @@ function refleshSource() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
textarea.addEventListener("paste", resize)
|
||||||
|
|
||||||
textarea.addEventListener("keydown", resize);
|
textarea.addEventListener("keydown", resize);
|
||||||
|
|
||||||
|
textarea.addEventListener("keyup", function (event) {
|
||||||
|
//if (event.keyCode == 13) resize();
|
||||||
|
resize();
|
||||||
|
inputText();
|
||||||
|
});
|
||||||
|
|
||||||
//テキストボックスをリサイズ
|
//テキストボックスをリサイズ
|
||||||
function resize() {
|
function resize() {
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
|
@ -87,17 +105,9 @@ textarea.addEventListener("click", textAreaClick, {
|
||||||
});
|
});
|
||||||
//テキストエリアクリック時の処理
|
//テキストエリアクリック時の処理
|
||||||
function textAreaClick() {
|
function textAreaClick() {
|
||||||
if (textarea.value == initialText) {
|
|
||||||
textarea.value = "";
|
|
||||||
} else {
|
|
||||||
textarea.select();
|
textarea.select();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
textarea.addEventListener("keyup", function (event) {
|
|
||||||
if (event.keyCode == 13) resize();
|
|
||||||
inputText();
|
|
||||||
});
|
|
||||||
//文字入力時の処理
|
//文字入力時の処理
|
||||||
function inputText() {
|
function inputText() {
|
||||||
sourceWord = textarea.value;
|
sourceWord = textarea.value;
|
||||||
|
|
|
@ -2,8 +2,9 @@
|
||||||
all: initial;
|
all: initial;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08);
|
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08);
|
||||||
border-radius: 3px;
|
border-radius: 10%;
|
||||||
background-image: url("icons/16.png");
|
background-image: url("icons/512.png");
|
||||||
|
background-size:75%;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
height: 22px;
|
height: 22px;
|
||||||
|
@ -21,7 +22,6 @@
|
||||||
#simple-translate-panel {
|
#simple-translate-panel {
|
||||||
all: initial;
|
all: initial;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
/*opacity: 0;*/
|
|
||||||
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08);
|
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
min-height: 20px;
|
min-height: 20px;
|
||||||
|
@ -30,7 +30,6 @@
|
||||||
height: auto;
|
height: auto;
|
||||||
min-width: 10px;
|
min-width: 10px;
|
||||||
max-width: 300px;
|
max-width: 300px;
|
||||||
width:300px;/*消すかも*/
|
|
||||||
position: fixed;
|
position: fixed;
|
||||||
padding: 10px 18px;
|
padding: 10px 18px;
|
||||||
z-index: 2147483646;
|
z-index: 2147483646;
|
||||||
|
@ -42,14 +41,11 @@
|
||||||
|
|
||||||
#simple-translate-panel p {
|
#simple-translate-panel p {
|
||||||
all: initial;
|
all: initial;
|
||||||
font-size: 13px;
|
font-family: 'Sugoe UI','Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'Meiryo', 'メイリオ', 'Osaka', 'MS PGothic', 'arial', 'helvetica', 'sans-serif' !important;
|
||||||
font-family: 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', Meiryo, メイリオ, Osaka, 'MS PGothic', arial, helvetica, sans-serif;
|
|
||||||
text-align: left;
|
text-align: left;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
transition-duration: 200ms;
|
|
||||||
animation-name: simple-translate-fadein;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#simple-translate-panel p::-moz-selection {
|
#simple-translate-panel p::-moz-selection {
|
||||||
|
|
|
@ -1,26 +1,15 @@
|
||||||
document.body.insertAdjacentHTML("beforeend", "<div id='simple-translate-button'></div><div id='simple-translate-panel'><p>...</p></div><div id='simple-translate-popup'></div>"); //body末尾にボタン配置
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
document.body.insertAdjacentHTML("beforeend", "<div id='simple-translate-button'></div><div id='simple-translate-panel'><p>...</p></div>"); //body末尾にボタン配置
|
||||||
var button = document.getElementById("simple-translate-button");
|
var button = document.getElementById("simple-translate-button");
|
||||||
var panel = document.getElementById("simple-translate-panel");
|
var panel = document.getElementById("simple-translate-panel");
|
||||||
var popup = document.getElementById("simple-translate-popup");
|
|
||||||
var selectionWord;
|
var selectionWord;
|
||||||
var clickPosition;
|
var clickPosition;
|
||||||
|
|
||||||
var targetLang;
|
let S=new settingsObj();
|
||||||
var ifShowButton;
|
S.init();
|
||||||
var ifCheckLang;
|
|
||||||
|
|
||||||
|
|
||||||
getSetting();
|
|
||||||
browser.storage.onChanged.addListener(getSetting);
|
|
||||||
//設定を読み出し
|
|
||||||
function getSetting() {
|
|
||||||
browser.storage.local.get(["targetLang", "ifShowButton", "ifCheckLang"], function (value) {
|
|
||||||
targetLang = value.targetLang;
|
|
||||||
ifShowButton = value.ifShowButton;
|
|
||||||
ifCheckLang = value.ifCheckLang;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
window.addEventListener("mouseup", Select, false);
|
window.addEventListener("mouseup", Select, false);
|
||||||
//テキスト選択時の処理 ダブルクリックした時2回処理が走るのを何とかしたい
|
//テキスト選択時の処理 ダブルクリックした時2回処理が走るのを何とかしたい
|
||||||
function Select(e) {
|
function Select(e) {
|
||||||
|
@ -29,7 +18,7 @@ function Select(e) {
|
||||||
selectionWord = String(window.getSelection());
|
selectionWord = String(window.getSelection());
|
||||||
if ((selectionWord.length !== 0) && (e.button == 0) && (e.target.id !== "simple-translate-panel") && (e.target.parentElement.id !== "simple-translate-panel")) { //選択範囲が存在かつ左クリックかつパネル以外のとき
|
if ((selectionWord.length !== 0) && (e.button == 0) && (e.target.id !== "simple-translate-panel") && (e.target.parentElement.id !== "simple-translate-panel")) { //選択範囲が存在かつ左クリックかつパネル以外のとき
|
||||||
clickPosition=e;
|
clickPosition=e;
|
||||||
if (ifShowButton) {//ボタンを表示
|
if (S.get().ifShowButton) {//ボタンを表示
|
||||||
checkLang().then(function (results) {
|
checkLang().then(function (results) {
|
||||||
if (results) popupButton(e);
|
if (results) popupButton(e);
|
||||||
});
|
});
|
||||||
|
@ -41,12 +30,12 @@ function Select(e) {
|
||||||
//選択テキストの言語をチェックして返す
|
//選択テキストの言語をチェックして返す
|
||||||
function checkLang() {
|
function checkLang() {
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
if(ifCheckLang){ //設定がオンなら
|
if(S.get().ifCheckLang){ //設定がオンなら
|
||||||
getRequest(selectionWord.substr(0, 100)) //先頭100文字を抽出して言語を取得
|
getRequest(selectionWord.substr(0, 100)) //先頭100文字を抽出して言語を取得
|
||||||
.then(function (results) {
|
.then(function (results) {
|
||||||
let lang = results.response[2];
|
let lang = results.response[2];
|
||||||
let percentage = results.response[6];
|
let percentage = results.response[6];
|
||||||
resolve(lang != targetLang && percentage > 0); //真偽値を返す
|
resolve(lang != S.get().targetLang && percentage > 0); //真偽値を返す
|
||||||
});
|
});
|
||||||
}else { //設定がオフならtrueを返す
|
}else { //設定がオフならtrueを返す
|
||||||
resolve(true);
|
resolve(true);
|
||||||
|
@ -56,12 +45,18 @@ function checkLang() {
|
||||||
|
|
||||||
//ボタンを表示
|
//ボタンを表示
|
||||||
function popupButton(e) {
|
function popupButton(e) {
|
||||||
if (ifShowButton) {
|
let position;
|
||||||
|
let buttonSize=S.get().buttonSize;
|
||||||
|
|
||||||
|
if(S.get().buttonPosition=="rightUp") position=(-1*buttonSize)-10;
|
||||||
|
else if(S.get().buttonPosition=="rightDown") position=10;
|
||||||
|
|
||||||
button.style.left = e.clientX + 10 + 'px';
|
button.style.left = e.clientX + 10 + 'px';
|
||||||
button.style.top = e.clientY + 5 + 'px';
|
button.style.top = e.clientY + position + 'px';
|
||||||
|
button.style.width=S.get().buttonSize+"px";
|
||||||
|
button.style.height=S.get().buttonSize+"px";
|
||||||
button.style.display = 'block';
|
button.style.display = 'block';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
button.addEventListener("click", function (e) {
|
button.addEventListener("click", function (e) {
|
||||||
translate();
|
translate();
|
||||||
showPanel(e);
|
showPanel(e);
|
||||||
|
@ -85,7 +80,7 @@ function getRequest(word) {
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
let xhr = new XMLHttpRequest();
|
let xhr = new XMLHttpRequest();
|
||||||
xhr.responseType = 'json';
|
xhr.responseType = 'json';
|
||||||
let url = "https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=" + targetLang + "&dt=t&q=" + encodeURIComponent(word);
|
let url = "https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=" + S.get().targetLang + "&dt=t&q=" + encodeURIComponent(word);
|
||||||
xhr.open("GET", url);
|
xhr.open("GET", url);
|
||||||
xhr.send();
|
xhr.send();
|
||||||
xhr.onload = function () {
|
xhr.onload = function () {
|
||||||
|
@ -129,7 +124,7 @@ function hidePanel(e) {
|
||||||
//パネルがウィンドウ外にはみ出る時に位置を調整
|
//パネルがウィンドウ外にはみ出る時に位置を調整
|
||||||
function panelPosition(e) {
|
function panelPosition(e) {
|
||||||
var p = new Object();
|
var p = new Object();
|
||||||
panel.style.width = '300px';
|
panel.style.width = S.get().width+'px';//300px
|
||||||
var panelHeight = panel.clientHeight;
|
var panelHeight = panel.clientHeight;
|
||||||
var panelWidth = parseInt(window.getComputedStyle(panel.getElementsByTagName("p")[0], null).width);
|
var panelWidth = parseInt(window.getComputedStyle(panel.getElementsByTagName("p")[0], null).width);
|
||||||
//一旦パネルの横幅を300にしてpの横幅を取得
|
//一旦パネルの横幅を300にしてpの横幅を取得
|
||||||
|
@ -137,16 +132,20 @@ function panelPosition(e) {
|
||||||
if (e.clientX + panelWidth > window.innerWidth - 80) {
|
if (e.clientX + panelWidth > window.innerWidth - 80) {
|
||||||
p.x = window.innerWidth - panelWidth - 80;
|
p.x = window.innerWidth - panelWidth - 80;
|
||||||
} else {
|
} else {
|
||||||
p.x = e.clientX + 10;
|
p.x = e.clientX;
|
||||||
}
|
}
|
||||||
if (e.clientY + panelHeight > window.innerHeight - 30) {
|
if (e.clientY + panelHeight > window.innerHeight - 30) {
|
||||||
p.y = window.innerHeight - panelHeight - 30;
|
p.y = window.innerHeight - panelHeight - 30;
|
||||||
} else {
|
} else {
|
||||||
p.y = e.clientY + 10;
|
p.y = e.clientY;
|
||||||
}
|
}
|
||||||
panel.style.width = 'auto'; //panelWidth + 'px';
|
panel.style.width = 'auto'; //panelWidth + 'px';
|
||||||
panel.style.top = p.y + 'px';
|
panel.style.top = p.y + 'px';
|
||||||
panel.style.left = p.x + 'px';
|
panel.style.left = p.x + 'px';
|
||||||
|
|
||||||
|
panel.style.maxWidth=S.get().width+"px";
|
||||||
|
panel.style.maxHeight=S.get().height+"px";
|
||||||
|
panel.getElementsByTagName("p")[0].style.fontSize=S.get().fontSize+"px";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
simple-translate/web-ext-artifacts/simple_translate-1.3.0.zip
Normal file
BIN
simple-translate/web-ext-artifacts/simple_translate-1.3.0.zip
Normal file
Binary file not shown.
BIN
simple-translate/web-ext-artifacts/simple_translate-1.3.1.zip
Normal file
BIN
simple-translate/web-ext-artifacts/simple_translate-1.3.1.zip
Normal file
Binary file not shown.
Loading…
Reference in a new issue