feedback5 WAD: language packs are the first type of content packs — a language is a file in a language folder (public/i18n/<code>.json, optional data/i18n/<code>.json) or a pack folder (packs/<id>/pack.json); the server lists them live at /packs/index.json (server/packs.js), the menu shows every pack, strings fall back pack → base → declared fallback (English) → Chinese, broken placeholders are skipped, plurals follow Intl.PluralRules (English unchanged), English carries a _meta manifest like any pack; tools: i18n.mjs template / check <code>, packs.mjs list / index, build-i18n --lang ja|ko|zh-TW (the official JP / KR / TW clients); the release zip ships packs/ and a generated packs/index.json; golden unchanged

This commit is contained in:
sganggs committed 2026-10-07 02:38:22 +08:00
1 parent f1df0d359d
commit 25b2a87b26
22 files changed
+2222 -241

No files matched your search

+5 -4
View File
@@ -4,8 +4,8 @@
// * TRUST_PROXY ('auto' default: honour CF-Connecting-IP / X-Real-IP / X-Forwarded-For only from loopback/private
// peers such as a local cloudflared; '1' always; '0' never) → net.js trustProxy;
// * DEBUG → the console logger's debug level;
// * the served directories (public/, data/, shared/ of this repository unless the options name others), and which
// startServer() options are handed on to net.js Network and lobby.js Lobby.
// * the served directories (public/, data/, shared/ and the content packs' packs/ of this repository unless the
// options name others), and which startServer() options are handed on to net.js Network and lobby.js Lobby.
import path from 'node:path';
import { fileURLToPath } from 'node:url';
@@ -34,14 +34,15 @@ export function listenAddress(opts) {
}
/**
* The directories the static server reads.
* @param {{ publicDir?: string, dataDir?: string, sharedDir?: string }} opts
* The directories the static server reads (packsDir: the pack folders, server/packs.js).
* @param {{ publicDir?: string, dataDir?: string, sharedDir?: string, packsDir?: string }} opts
*/
export function serveDirs(opts) {
return {
publicDir: opts.publicDir || path.join(ROOT, 'public'),
dataDir: opts.dataDir || path.join(ROOT, 'data'),
sharedDir: opts.sharedDir || path.join(ROOT, 'shared'),
packsDir: opts.packsDir || path.join(ROOT, 'packs'),
};
}