diff --git a/packages/backend/migration/1695348946091-normalize-locales.js b/packages/backend/migration/1695348946091-normalize-locales.js new file mode 100644 index 0000000000..3fc656372b --- /dev/null +++ b/packages/backend/migration/1695348946091-normalize-locales.js @@ -0,0 +1,22 @@ +export class NormalizeLocales1695348946091 { + name = "NormalizeLocales1695348946091"; + + async up(queryRunner) { + await queryRunner + .query(`SELECT "id", "lang" FROM "note" WHERE "lang" IS NOT NULL`) + .then((notes) => + Promise.all( + notes.map((note) => { + return queryRunner.query( + 'UPDATE "note" SET "lang" = $1 WHERE "id" = $2', + [note.lang.trim().split("-")[0].split("@")[0], note.id], + ); + }), + ), + ); + } + + async down(queryRunner) { + // The original locales are not stored, so migrating back is not possible. + } +} diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index 5c8807c29d..fa01046f2d 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -314,11 +314,11 @@ export async function createNote( text = note.source.content; if (note.contentMap != null) { const key = Object.keys(note.contentMap)[0]; - lang = Object.keys(langmap).includes(key) ? key : null; + lang = Object.keys(langmap).includes(key) ? key.trim().split("-")[0].split("@")[0] : null; } } else if (note.contentMap != null) { const entry = Object.entries(note.contentMap)[0]; - lang = Object.keys(langmap).includes(entry[0]) ? entry[0] : null; + lang = Object.keys(langmap).includes(entry[0]) ? entry[0].trim().split("-")[0].split("@")[0] : null; text = htmlToMfm(entry[1], note.tag); } else if (typeof note.content === "string") { text = htmlToMfm(note.content, note.tag); @@ -584,11 +584,11 @@ export async function updateNote(value: string | IObject, resolver?: Resolver) { text = post.source.content; if (post.contentMap != null) { const key = Object.keys(post.contentMap)[0]; - lang = Object.keys(langmap).includes(key) ? key : null; + lang = Object.keys(langmap).includes(key) ? key.trim().split("-")[0].split("@")[0] : null; } } else if (post.contentMap != null) { const entry = Object.entries(post.contentMap)[0]; - lang = Object.keys(langmap).includes(entry[0]) ? entry[0] : null; + lang = Object.keys(langmap).includes(entry[0]) ? entry[0].trim().split("-")[0].split("@")[0] : null; text = htmlToMfm(entry[1], post.tag); } else if (typeof post.content === "string") { text = htmlToMfm(post.content, post.tag); diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts index 9e58021c2f..8d825cf61c 100644 --- a/packages/backend/src/server/api/endpoints/notes/edit.ts +++ b/packages/backend/src/server/api/endpoints/notes/edit.ts @@ -379,8 +379,8 @@ export default define(meta, paramDef, async (ps, user) => { } if (ps.lang) { - ps.lang = ps.lang.trim(); if (!Object.keys(langmap).includes(ps.lang.trim())) throw new Error("invalid param"); + ps.lang = ps.lang.trim().split("-")[0].split("@")[0]; } else if (ps.text) { ps.lang = detectLanguage(ps.text); } else { diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index 80ea6255ea..080925048c 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -280,8 +280,8 @@ export default async ( } if (data.lang) { - data.lang = data.lang.trim(); if (!Object.keys(langmap).includes(data.lang.trim())) throw new Error("invalid param"); + data.lang = data.lang.trim().split("-")[0].split("@")[0]; } else if (data.text) { data.lang = detectLanguage(data.text); } else {