ref: 86a1bffad7063d1f51dfe44c2126bbdf8b7fe5c8
dir: /translation.js/
import messages1 from "scratch-l10n/locales/blocks-msgs.js"
import messages2 from "scratch-l10n/locales/editor-msgs.js"
import {isRtl} from "scratch-l10n/src/supported-locales.js"
export let locale
for (let name of navigator.languages) {
if (locale) break
name = name.toLowerCase()
for (let name1 in messages1) {
if (locale) break
let parts = name1.split("-")
while (parts.length > 0) {
if (parts.join("-") === name) {
locale = name1
break
}
parts.pop()
}
}
}
locale ??= "en"
document.documentElement.lang = locale
if (isRtl(locale)) document.dir = "rtl"
else document.dir = "ltr"
let messages = {...messages1[locale], ...messages2[locale]}
let messages0 = [...Object.entries(messages1.en), ...Object.entries(messages2.en)]
export function getName(stage, type, ...args)
{
if (locale === "en") return
if (type.shape === "slot" && type.dynamic) return
if (type.category === "custom" && !type.hat) return
let symbol = Symbol()
let name0 = args
if (type.shape !== "slot") {
args = args.map(arg => ({[symbol]: arg}))
name0 = stage.scratch.getName(type, ...args) ?? type.name?.(...args)
if (!name0) return
}
let category = type.category ?? "extensions"
if (type.category === "events") category = "event"
if (type.category === "variables") category = "data"
if (type.category === "lists") category = "data"
name0 = name0.map(part =>
{
if (typeof part === "string") return part
if (part instanceof Node) return part
if (part[symbol]) return part
if (!part.options) return part
let options = part.options.map(option =>
{
let label = option.label
for (let [key, name] of messages0) {
if (!["extensions", "custom"].includes(category)) {
if (!key.startsWith(category.toUpperCase() + "_")) continue
}
if (name === label) {
label = messages[key]
break
}
}
return {...option, label}
})
return {...part, options}
})
let icon
if (name0[0] instanceof Element && name0[0].querySelector("svg")) icon = name0.shift()
let regex = new RegExp("^" + name0.map((n, i) => typeof n !== "string" ? `(?<i${i}>%[0-9]+|\\[[a-zA-Z_]+\\]+)`: RegExp.escape(n)).join("\\s*") + "$", "u")
for (let [key, name] of messages0) {
if (!["extensions", "custom"].includes(category)) {
if (!key.startsWith(category.toUpperCase() + "_")) continue
}
if (key === "CONTROL_STOP" && !name.includes("%1")) name += " %1"
let match = name.match(regex)
if (!match) continue
let message = messages[key]
if (key === "CONTROL_STOP" && !message.includes("%1")) message += " %1"
let parts = message.split(/(%[0-9]+|\[[a-zA-Z_]+\]+)/g)
return [...icon ? [icon] : [], ...parts.map(part =>
{
if (!part.match(/^%[0-9]+|\[[a-zA-Z_]+\]+$/)) return part.replace(/\s+/, " ").trim()
for (let [i, part1] of Object.entries(match.groups)) {
if (part === part1) {
let part2 = name0[i.slice(1)]
return part2[symbol] ?? part2
}
}
})]
}
}
export function getMessage(name, fn = m => m)
{
let message = messages[name] ?? messages1.en[name] ?? messages2.en[name]
if (message) return fn(message)
}