diff --git a/packages/xl-docx-exporter/src/docx/__snapshots__/noLocale/styles.xml b/packages/xl-docx-exporter/src/docx/__snapshots__/noLocale/styles.xml
new file mode 100644
index 0000000000..4c2e627de4
--- /dev/null
+++ b/packages/xl-docx-exporter/src/docx/__snapshots__/noLocale/styles.xml
@@ -0,0 +1,984 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/xl-docx-exporter/src/docx/__snapshots__/withLocale/styles.xml b/packages/xl-docx-exporter/src/docx/__snapshots__/withLocale/styles.xml
new file mode 100644
index 0000000000..45edc06326
--- /dev/null
+++ b/packages/xl-docx-exporter/src/docx/__snapshots__/withLocale/styles.xml
@@ -0,0 +1,985 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/xl-docx-exporter/src/docx/docxExporter.test.ts b/packages/xl-docx-exporter/src/docx/docxExporter.test.ts
index 4b2014931f..382521b6bb 100644
--- a/packages/xl-docx-exporter/src/docx/docxExporter.test.ts
+++ b/packages/xl-docx-exporter/src/docx/docxExporter.test.ts
@@ -217,6 +217,53 @@ describe("exporter", () => {
).toMatchFileSnapshot("__snapshots__/withMultiColumn/styles.xml");
},
);
+
+ async function exportAndGetStylesEntries(
+ locale?: string,
+ ) {
+ const exporter = new DOCXExporter(
+ BlockNoteSchema.create({
+ blockSpecs: {
+ ...defaultBlockSpecs,
+ pageBreak: createPageBreakBlockSpec(),
+ },
+ }),
+ docxDefaultSchemaMappings,
+ );
+ const doc = await exporter.toDocxJsDocument(testDocument, {
+ sectionOptions: {},
+ documentOptions: {},
+ ...(locale && { locale }),
+ });
+
+ const blob = await Packer.toBlob(doc);
+ const zip = new ZipReader(new BlobReader(blob));
+ return zip.getEntries();
+ }
+
+ it(
+ "should export a document without w:lang when no locale is provided",
+ { timeout: 10000 },
+ async () => {
+ const entries = await exportAndGetStylesEntries();
+
+ await expect(
+ prettify(await getZIPEntryContent(entries, "word/styles.xml")),
+ ).toMatchFileSnapshot("__snapshots__/noLocale/styles.xml");
+ },
+ );
+
+ it(
+ "should export a document with w:lang when locale is provided",
+ { timeout: 10000 },
+ async () => {
+ const entries = await exportAndGetStylesEntries("fr-FR");
+
+ await expect(
+ prettify(await getZIPEntryContent(entries, "word/styles.xml")),
+ ).toMatchFileSnapshot("__snapshots__/withLocale/styles.xml");
+ },
+ );
});
function prettify(sourceXml: string) {
diff --git a/packages/xl-docx-exporter/src/docx/docxExporter.ts b/packages/xl-docx-exporter/src/docx/docxExporter.ts
index 3c03c0937c..2467cebe1d 100644
--- a/packages/xl-docx-exporter/src/docx/docxExporter.ts
+++ b/packages/xl-docx-exporter/src/docx/docxExporter.ts
@@ -193,14 +193,19 @@ export class DOCXExporter<
let externalStyles = (await import("./template/word/styles.xml?raw"))
.default;
- // Replace the default language in styles.xml with the provided locale.
- // If not provided, default to en-US.
- const resolvedLocale = (locale && locale.trim()) || "en-US";
-
- externalStyles = externalStyles.replace(
- /(]*\bw:val=")([^"]+)("[^>]*\/>)/g,
- `$1${resolvedLocale}$3`,
- );
+ // Replace the language in styles.xml with the provided locale, or remove
+ // the w:lang element entirely if no locale is provided (per ECMA-376
+ // §17.3.2.20: omitting w:lang lets the application auto-detect language).
+ const trimmedLocale = locale?.trim();
+ if (trimmedLocale) {
+ externalStyles = externalStyles.replace(
+ /(]*\bw:val=")([^"]+)("[^>]*\/>)/g,
+ (_match, prefix, _oldVal, suffix) =>
+ `${prefix}${trimmedLocale}${suffix}`,
+ );
+ } else {
+ externalStyles = externalStyles.replace(/\s*]*\/>/g, "");
+ }
const bullets = ["•"]; //, "◦", "▪"]; (these don't look great, just use solid bullet for now)
return {
@@ -251,7 +256,7 @@ export class DOCXExporter<
}
/**
- * Convert a document (array of Blocks to a Blob representing a .docx file)
+ * Converts blocks to a .docx Blob with optional locale support.
*/
public async toBlob(
blocks: Block[],
@@ -260,7 +265,7 @@ export class DOCXExporter<
documentOptions: DocumentOptions;
/**
* The document locale in OOXML format (e.g. en-US, fr-FR, de-DE).
- * If omitted, defaults to en-US.
+ * If omitted, no language is set and the consuming application will use its own default.
*/
locale?: string;
} = {
@@ -285,7 +290,7 @@ export class DOCXExporter<
}
/**
- * Convert a document (array of Blocks to a docxjs Document)
+ * Converts blocks to a docxjs Document with optional locale support.
*/
public async toDocxJsDocument(
blocks: Block[],
@@ -294,7 +299,7 @@ export class DOCXExporter<
documentOptions: DocumentOptions;
/**
* The document locale in OOXML format (e.g. en-US, fr-FR, de-DE).
- * If omitted, defaults to en-US.
+ * If omitted, no language is set and the consuming application will use its own default.
*/
locale?: string;
} = {