mirror of
https://git.joinfirefish.org/firefish/firefish.git
synced 2024-05-19 00:51:11 +02:00
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:
commit
a399992d60
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -40,6 +40,7 @@ coverage
|
|||
|
||||
# misskey
|
||||
built
|
||||
build_version.txt
|
||||
db
|
||||
elasticsearch
|
||||
redis
|
||||
|
|
10
gulpfile.js
10
gulpfile.js
|
@ -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",
|
||||
);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -59,6 +59,7 @@ html
|
|||
|
||||
script.
|
||||
var VERSION = "#{version}";
|
||||
var BUILD_VERSION = "#{build_version}"
|
||||
var CLIENT_ENTRY = "#{clientEntry.file}";
|
||||
|
||||
script
|
||||
|
|
1
packages/client/@types/global.d.ts
vendored
1
packages/client/@types/global.d.ts
vendored
|
@ -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;
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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}`
|
||||
: "",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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_]),
|
||||
),
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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");
|
||||
})();
|
||||
|
|
Loading…
Reference in a new issue