Skip to content

Commit 477cc62

Browse files
committed
Add language check to save/load format (v3)
1 parent 38d8ab5 commit 477cc62

3 files changed

Lines changed: 22 additions & 6 deletions

File tree

src/App.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,8 +482,11 @@ function App() {
482482

483483
output += "/* --- BEGIN Metadata --- */\n";
484484
output += "/* --- BEGIN Save Format Version --- */\n";
485-
output += "-- 2\n";
485+
output += "-- 3\n";
486486
output += "/* --- END Save Format Version --- */\n";
487+
output += "/* --- BEGIN Save Language --- */\n";
488+
output += `-- ${lang}\n`;
489+
output += "/* --- END Save Language --- */\n";
487490
output += "/* --- END Metadata --- */\n";
488491

489492
output += "/* --- BEGIN Validation --- */\n";

src/ImportDialog.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,11 @@ const ImportDialog = forwardRef<ImportDialogHandle, ImportDialogProps>(
164164
{t("howToImport")}
165165
</DialogDescription>
166166
</DialogHeader>
167+
{importedData && importedData.language !== lang && (
168+
<p className="text-sm text-yellow-600 dark:text-yellow-400 mt-1">
169+
{t("languageMismatchWarning", { fileLang: importedData.language })}
170+
</p>
171+
)}
167172
<div className="flex gap-3 mt-2">
168173
<Button onClick={handleOverwrite} variant="destructive">
169174
{t("overwriteAll")}

src/mergeUtils.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export interface ParsedSaveData {
66
writtenQuestionIds: number[];
77
correctQuestionIds: number[];
88
views: View[];
9+
language: string;
910
}
1011

1112
export interface MergeConflict {
@@ -33,6 +34,13 @@ function normalize(s: string): string {
3334
}
3435

3536
export function parseImportFile(data: string): ParsedSaveData {
37+
// v3+: structured metadata block; v2 fallback: comment in header
38+
const structuredLangMatch = data.match(
39+
/\/\*\s--- BEGIN Save Language --- \*\/\n--\s(\w+)\n\/\*\s--- END Save Language --- \*\//
40+
);
41+
const commentLangMatch = data.match(/^-- Language: (\w+)$/m);
42+
const language = structuredLangMatch ? structuredLangMatch[1] : (commentLangMatch ? commentLangMatch[1] : "sv");
43+
3644
const rawQueriesMatch = data.match(
3745
/\/\*\s--- BEGIN Raw Queries --- \*\/\n\/\*\n([\s\S]*?)\n\*\/\n\/\*\s--- END Raw Queries --- \*\//
3846
);
@@ -70,11 +78,11 @@ export function parseImportFile(data: string): ParsedSaveData {
7078
}
7179
}
7280

73-
return { rawQueries, correctQueries, writtenQuestionIds, correctQuestionIds, views };
81+
return { rawQueries, correctQueries, writtenQuestionIds, correctQuestionIds, views, language };
7482
}
7583

76-
export function getLocalData(langPrefix?: string): ParsedSaveData {
77-
const pfx = langPrefix ? `${langPrefix}:` : "";
84+
export function getLocalData(langPrefix: string = "sv"): ParsedSaveData {
85+
const pfx = `${langPrefix}:`;
7886
const writtenQuestionIds: number[] = JSON.parse(
7987
localStorage.getItem(`${pfx}writtenQuestions`) || "[]"
8088
);
@@ -96,7 +104,7 @@ export function getLocalData(langPrefix?: string): ParsedSaveData {
96104

97105
const views: View[] = JSON.parse(localStorage.getItem(`${pfx}views`) || "[]");
98106

99-
return { rawQueries, correctQueries, writtenQuestionIds, correctQuestionIds, views };
107+
return { rawQueries, correctQueries, writtenQuestionIds, correctQuestionIds, views, language: langPrefix };
100108
}
101109

102110
export function detectConflicts(
@@ -273,5 +281,5 @@ export function buildMergedData(
273281
new Set([...local.correctQuestionIds, ...imported.correctQuestionIds])
274282
).filter((id) => String(id) in correctQueries);
275283

276-
return { rawQueries, correctQueries, writtenQuestionIds, correctQuestionIds, views };
284+
return { rawQueries, correctQueries, writtenQuestionIds, correctQuestionIds, views, language: local.language };
277285
}

0 commit comments

Comments
 (0)