aboutsummaryrefslogtreecommitdiffstats
path: root/create.js
blob: a5b1036da31e2d64838d3573bde4e19b72071b5e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
//@ts-check

import Translate from './Translate.js'
import { debounce } from './index.js'

/**
 * Create The menubar
 * @returns {HTMLMenuElement}
 */
export function createMenu() {
	const header = document.createElement('header')
	document.body.append(header)

	const menu = document.createElement('menu')
	header.append(menu)
	menu.role = 'menubar'
	return menu
}
/**
 * @param {HTMLMenuElement} menu
 * @param {Translate} translate
 * @returns {Promise<{source: HTMLSelectElement, target: HTMLSelectElement}>}
 */
export async function createDropDown(menu, translate) {
	const source = createSourceElement(menu)
	const target = createTargetElement(menu)

	const langlist = await translate.languages()

	langlist.forEach((element) => {
		addSelectionOpt(source, element.code, element.name)
		addSelectionOpt(target, element.code, element.name)
	})

	const { language } = await translate.settings()
	source.value = language.source.code
	target.value = language.target.code

	const setup = async () => {
		const langList = await translate.languages()
		const src = source.value
		const targetList = langList.find(obj => obj.code === src)?.targets ?? []
		Array.from(target.options).forEach(element => {
			element.disabled = !targetList.includes(element.value)
		})
	}

	source.addEventListener("change", setup)
	setup()
	return { source, target }
}
/**
 * @param {HTMLSelectElement} source
 * @param {string} value
 * @param {string} text
 */
function addSelectionOpt(source, value, text = value) {
	const opt = document.createElement("option")
	opt.textContent = text
	opt.value = value
	source.add(opt)
}

/**
 * Create the translator boxes
 * @param {Translate} translate
 * @param {HTMLSelectElement} sourceSelect
 * @param {HTMLSelectElement} targetSelect
 */
export async function createEditorWidget(translate, sourceSelect, targetSelect) {
	const input = document.createElement('pre')
	document.body.appendChild(input)
	input.id = 'editor'
	input.contentEditable = "true"

	const output = document.createElement('pre')
	document.body.appendChild(output)
	output.id = 'output'

	const translateHandler = debounce(async () => {
		output.textContent = await translate.translate(
			input.textContent ?? "",
			sourceSelect.value,
			targetSelect.value
		)
	}, (await translate.settings()).frontendTimeout)

	sourceSelect.addEventListener("change", translateHandler)
	targetSelect.addEventListener("change", translateHandler)
	input.addEventListener("input", translateHandler)

	const sourceLang = () => input.lang = sourceSelect.value
	sourceLang()
	sourceSelect.addEventListener("change", sourceLang)

	const targetLang = () => output.lang = targetSelect.value
	targetLang()
	sourceSelect.addEventListener("change", targetLang)
}
/**
 * @param {HTMLMenuElement} menu
 * @returns {HTMLSelectElement}
 */
function createTargetElement(menu) {
	const menuItem = createMenuItem(menu)
	const { label, select } = createLabeledSelect('target', 'Translate Into: ')
	menuItem.append(label, select)
	return select
}
/**
 * @param {HTMLMenuElement} menu
 */
function createSourceElement(menu) {
	const menuItem = createMenuItem(menu)
	const { label, select } = createLabeledSelect('source', 'TranslateFrom: ')
	menuItem.append(label, select)
	addSelectionOpt(select, "auto", "Auto Detectiom")
	return select
}
/**
 * @param {string} id
 * @param {string} label
 * @returns {{label: HTMLLabelElement, select: HTMLSelectElement}}
 */
function createLabeledSelect(id, label) {
	const labelElement = document.createElement('label')
	labelElement.htmlFor = id
	labelElement.textContent = label
	const select = document.createElement('select')
	select.id = id
	return { label: labelElement, select }
}
/**
 * @param {HTMLMenuElement} menu The menubar
 * @returns {HTMLLIElement}
 */
function createMenuItem(menu) {
	const menuItem = document.createElement('li')
	menu.append(menuItem)
	menuItem.role = 'menuitem'
	return menuItem
}