Merge branch 'fix/i18n-load' into 'develop'

Draft: fix: new locale items may be undefined until users do a force-reload

Co-authored-by: Lhcfl <Lhcfl@outlook.com>

See merge request firefish/firefish!10775
This commit is contained in:
Linca 2024-05-05 19:14:11 +00:00
commit a399992d60
12 changed files with 86 additions and 29 deletions

1
.gitignore vendored
View file

@ -40,6 +40,7 @@ coverage
# misskey
built
build_version.txt
db
elasticsearch
redis

View file

@ -29,14 +29,20 @@ gulp.task("copy:client:fonts", () =>
);
gulp.task("copy:client:locales", async (cb) => {
try {
fs.rmSync("./built/_client_dist_/locales/", { recursive: true });
} catch (_e) {};
fs.mkdirSync("./built/_client_dist_/locales", { recursive: true });
const buildVersion = fs.readFileSync("./build_version.txt").toString();
const { default: locales } = await import("./locales/index.mjs");
const v = { _version_: meta.version };
const v = { _version_: buildVersion };
for (const [lang, locale] of Object.entries(locales)) {
fs.writeFileSync(
`./built/_client_dist_/locales/${lang}.${meta.version}.json`,
`./built/_client_dist_/locales/${lang}.${buildVersion}.json`,
JSON.stringify({ ...locale, ...v }),
"utf-8",
);

View file

@ -23,35 +23,58 @@
};
//#region Detect language & fetch translations
const v = localStorage.getItem("v") || VERSION;
let supportedLangs = [];
try {
supportedLangs = SUPPORTED_LANGS;
} catch {
console.warn("LANGS not found");
}
let lang = localStorage.getItem("lang");
if (lang == null || !supportedLangs.includes(lang)) {
if (supportedLangs.includes(navigator.language)) {
lang = navigator.language;
} else {
lang = supportedLangs.find((x) => x.split("-")[0] === navigator.language);
const v = localStorage.getItem("v") || VERSION;
const build_v = localStorage.getItem("build_version");
// Fallback
if (lang == null) lang = "en-US";
function hasErrParsing(x) {
try {
JSON.parse(x);
} catch (err) {
return true;
}
return false;
}
const res = await fetch(`/assets/locales/${lang}.${v}.json`);
if (res.status === 200) {
localStorage.setItem("lang", lang);
localStorage.setItem("locale", await res.text());
localStorage.setItem("localeVersion", v);
} else {
await checkUpdate();
renderError("LOCALE_FETCH");
return;
if (
build_v !== BUILD_VERSION ||
lang == null ||
localStorage.getItem("locale") == null ||
hasErrParsing(localStorage.getItem("locale"))
) {
// Firefish updated, update locales
localStorage.setItem("build_version", BUILD_VERSION);
let supportedLangs = [];
try {
supportedLangs = SUPPORTED_LANGS;
} catch {
console.warn("LANGS not found");
}
if (lang == null || !supportedLangs.includes(lang)) {
if (supportedLangs.includes(navigator.language)) {
lang = navigator.language;
} else {
lang = supportedLangs.find(
(x) => x.split("-")[0] === navigator.language,
);
// Fallback
if (lang == null) lang = "en-US";
}
}
const res = await fetch(`/assets/locales/${lang}.${BUILD_VERSION}.json`);
if (res.status === 200) {
localStorage.setItem("lang", lang);
localStorage.setItem("locale", await res.text());
localStorage.setItem("localeVersion", v);
} else {
await checkUpdate();
renderError("LOCALE_FETCH");
return;
}
}
//#endregion
@ -306,7 +329,7 @@
const meta = await res.json();
if (meta.version != v) {
if (meta.version !== v) {
localStorage.setItem("v", meta.version);
refresh();
}

View file

@ -94,6 +94,9 @@ app.use(
extension: "pug",
options: {
version: config.version,
build_version: readFileSync(
`${_dirname}/../../../../../build_version.txt`,
).toString(),
getClientEntry: () =>
process.env.NODE_ENV === "production"
? config.clientEntry

View file

@ -59,6 +59,7 @@ html
script.
var VERSION = "#{version}";
var BUILD_VERSION = "#{build_version}"
var CLIENT_ENTRY = "#{clientEntry.file}";
script

View file

@ -3,6 +3,7 @@ type FIXME = any;
declare const _LANGS_: string[][];
declare const _VERSION_: string;
declare const _BUILD_VERSION_: string;
declare const _ENV_: string;
declare const _DEV_: boolean;
declare const _PERF_PREFIX_: string;

View file

@ -14,6 +14,7 @@ export const lang = localStorage.getItem("lang");
export const langs = _LANGS_;
export const locale = JSON.parse(localStorage.getItem("locale") || "en-US");
export const version: string = _VERSION_;
export const build_version: string = _BUILD_VERSION_;
export const instanceName = siteName === "Firefish" ? host : siteName;
export const ui = localStorage.getItem("ui");
export const debug = localStorage.getItem("debug") === "true";

View file

@ -10,7 +10,7 @@ import { isLiteralValue } from "./expr";
import { HpmlError, HpmlScope } from ".";
import type { Fn, PageVar, envVarsDef } from ".";
import * as os from "@/os";
import { version } from "@/config";
import { build_version, version } from "@/config";
/**
* Hpml evaluator
@ -75,6 +75,7 @@ export class Hpml {
this.envVars = {
AI: "kawaii",
VERSION: version,
BUILD_VERSION: build_version,
URL: this.page
? `${opts.url}/@${this.page.user.username}/pages/${this.page.name}`
: "",

View file

@ -80,6 +80,7 @@ export const envVarsDef: Record<string, Type> = {
AI: "string",
URL: "string",
VERSION: "string",
BUILD_VERSION: "string",
LOGIN: "boolean",
NAME: "string",
USERNAME: "string",

View file

@ -22,11 +22,16 @@ const extensions = [
".vue",
];
const buildVersion = fs.readFileSync("../../build_version.txt").toString();
export default defineConfig(({ command, mode }) => {
fs.mkdirSync(`${__dirname}/../../built`, { recursive: true });
fs.writeFileSync(
`${__dirname}/../../built/meta.json`,
JSON.stringify({ version: meta.version }),
JSON.stringify({
version: meta.version,
build_version: buildVersion,
}),
"utf-8",
);
@ -55,6 +60,7 @@ export default defineConfig(({ command, mode }) => {
define: {
_VERSION_: JSON.stringify(meta.version),
_BUILD_VERSION_: JSON.stringify(buildVersion),
_LANGS_: JSON.stringify(
Object.entries(locales).map(([k, v]) => [k, v._lang_]),
),

View file

@ -2,10 +2,15 @@ import fs from "node:fs";
import path, { join } from "node:path";
import { fileURLToPath } from "node:url";
import { execa } from "execa";
import meta from "../package.json" assert { type: "json" };
(async () => {
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const buildVersion = `${meta.version}.build-${Number(new Date)}`;
fs.writeFileSync("./build_version.txt", buildVersion);
await execa(
"pnpm", [
"--recursive",

View file

@ -1,10 +1,16 @@
import fs from "node:fs";
import path, { join } from "node:path";
import { fileURLToPath } from "node:url";
import { execa } from "execa";
import meta from "../package.json" assert { type: "json" };
(async () => {
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const buildVersion = `${meta.version}.debug-${Number(new Date)}`;
fs.writeFileSync("./build_version.txt", buildVersion);
await execa(
"pnpm", [
"--recursive",
@ -32,4 +38,6 @@ import { execa } from "execa";
stdio: "inherit",
}
);
fs.copyFileSync("packages/backend-rs/index.js", "packages/backend-rs/built/index.js");
})();