Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1682 commits
Select commit Hold shift + click to select a range
d4dbc99
New translations scripting-tom-interfaces.md (Chinese Simplified)
DBojsen Jun 20, 2026
a675d46
New translations scripting-ui-helpers.md (Chinese Simplified)
DBojsen Jun 20, 2026
63adf5b
New translations scripting-use-selected-object.md (Chinese Simplified)
DBojsen Jun 20, 2026
8834290
New translations scripting-work-with-annotations.md (Chinese Simplified)
DBojsen Jun 20, 2026
ddc2f77
New translations scripting-work-with-dependencies.md (Chinese Simplif…
DBojsen Jun 20, 2026
e8ccfab
New translations scripting-work-with-expressions.md (Chinese Simplified)
DBojsen Jun 20, 2026
8ea5f5e
New translations 3_26_1.md (Chinese Simplified)
DBojsen Jun 20, 2026
ac20b09
New translations databricks-refresh-empty-catalog.md (Chinese Simplif…
DBojsen Jun 20, 2026
3549791
New translations te-cli-commands.md (Chinese Simplified)
DBojsen Jun 20, 2026
4131fdb
New translations te-cli-config.md (Chinese Simplified)
DBojsen Jun 20, 2026
b1fb9d5
New translations te-cli-limitations.md (Chinese Simplified)
DBojsen Jun 20, 2026
dca3425
New translations te-cli-skill.md (Chinese Simplified)
DBojsen Jun 20, 2026
1a7e2c7
New translations te-cli-preview-notice.md (Chinese Simplified)
DBojsen Jun 20, 2026
bf94c45
New translations te-cli-auth.md (Chinese Simplified)
DBojsen Jun 20, 2026
3fd408c
New translations bpa.md (Chinese Simplified)
DBojsen Jun 21, 2026
60efc0b
New translations creating-and-testing-dax.md (Chinese Simplified)
DBojsen Jun 21, 2026
3c83800
New translations command-line-options.md (Chinese Simplified)
DBojsen Jun 21, 2026
cb32f11
New translations useful-script-snippets.md (Chinese Simplified)
DBojsen Jun 21, 2026
96668c2
New translations csharp-scripts.md (Spanish)
DBojsen Jun 21, 2026
30b4c74
New translations csharp-scripts.md (Chinese Simplified)
DBojsen Jun 21, 2026
727372a
New translations pivot-grid.md (Spanish)
DBojsen Jun 21, 2026
e1c833f
New translations data-refresh-view.md (Chinese Simplified)
DBojsen Jun 21, 2026
c0be1b7
New translations user-interface.md (Chinese Simplified)
DBojsen Jun 21, 2026
b77ffda
New translations getting-started-te2.md (Spanish)
DBojsen Jun 21, 2026
70497db
New translations bpa.md (Chinese Simplified)
DBojsen Jun 21, 2026
f4447d5
New translations creating-and-testing-dax.md (Chinese Simplified)
DBojsen Jun 21, 2026
e633d41
New translations cs-scripts-and-macros.md (Chinese Simplified)
DBojsen Jun 21, 2026
2544b0d
New translations dax-script-introduction.md (Chinese Simplified)
DBojsen Jun 21, 2026
b7e8d70
New translations desktop-limitations.md (Chinese Simplified)
DBojsen Jun 21, 2026
23a5bcf
New translations editions.md (Spanish)
DBojsen Jun 21, 2026
3e6c0e1
New translations editions.md (Chinese Simplified)
DBojsen Jun 21, 2026
51623bb
New translations general-introduction.md (Chinese Simplified)
DBojsen Jun 21, 2026
7effda4
New translations getting-started.md (Spanish)
DBojsen Jun 21, 2026
47d603d
New translations getting-started.md (Chinese Simplified)
DBojsen Jun 21, 2026
2d373b3
New translations importing-tables-data-modeling.md (Spanish)
DBojsen Jun 21, 2026
09bf028
New translations importing-tables-data-modeling.md (Chinese Simplified)
DBojsen Jun 21, 2026
5b9504b
New translations index.md (Spanish)
DBojsen Jun 21, 2026
2d54873
New translations index.md (Chinese Simplified)
DBojsen Jun 21, 2026
97cb0b6
New translations installation.md (Chinese Simplified)
DBojsen Jun 21, 2026
914e3f7
New translations migrate-from-desktop.md (Chinese Simplified)
DBojsen Jun 21, 2026
171a865
New translations migrate-from-te2.md (Spanish)
DBojsen Jun 21, 2026
5ebe58a
New translations migrate-from-te2.md (Chinese Simplified)
DBojsen Jun 21, 2026
e870e9e
New translations migrate-from-vs.md (Chinese Simplified)
DBojsen Jun 21, 2026
9064419
New translations parallel-development.md (Chinese Simplified)
DBojsen Jun 21, 2026
62d285a
New translations personalizing-te3.md (Chinese Simplified)
DBojsen Jun 21, 2026
e05655d
New translations refresh-preview-query.md (Chinese Simplified)
DBojsen Jun 21, 2026
bcc6e0a
New translations training-telearn.md (Chinese Simplified)
DBojsen Jun 21, 2026
644521f
New translations advanced-filtering-of-the-explorer-tree.md (Chinese …
DBojsen Jun 21, 2026
44a0fa2
New translations advanced-scripting.md (Chinese Simplified)
DBojsen Jun 21, 2026
cf767d9
New translations importing-tables.md (Chinese Simplified)
DBojsen Jun 21, 2026
f1cd0ba
New translations master-model-pattern.md (Chinese Simplified)
DBojsen Jun 21, 2026
2cb9bbd
New translations connect-ssas.md (Chinese Simplified)
DBojsen Jun 21, 2026
d2005bf
New translations deploy-current-model.md (Chinese Simplified)
DBojsen Jun 21, 2026
32c41f7
New translations drag-drop.md (Chinese Simplified)
DBojsen Jun 21, 2026
a47024c
New translations folder-serialization.md (Chinese Simplified)
DBojsen Jun 21, 2026
536349e
New translations formula-fixup-dependencies.md (Chinese Simplified)
DBojsen Jun 21, 2026
d306408
New translations import-export-translations.md (Chinese Simplified)
DBojsen Jun 21, 2026
12b1802
New translations importing-tables-from-excel.md (Chinese Simplified)
DBojsen Jun 21, 2026
398aafe
New translations incremental-refresh2-h.md (Chinese Simplified)
DBojsen Jun 21, 2026
a855216
New translations load-save.md (Chinese Simplified)
DBojsen Jun 21, 2026
3608156
New translations metadata-backup.md (Chinese Simplified)
DBojsen Jun 21, 2026
04103d7
New translations perspectives-translations.md (Chinese Simplified)
DBojsen Jun 21, 2026
bdaffce
New translations powerbi-xmla-pbix-workaround.md (Chinese Simplified)
DBojsen Jun 21, 2026
4d2e7d0
New translations replace-tables.md (Chinese Simplified)
DBojsen Jun 21, 2026
bad5395
New translations script-reference-objects.md (Chinese Simplified)
DBojsen Jun 21, 2026
05ef8a5
New translations undo-redo.md (Spanish)
DBojsen Jun 21, 2026
62c0209
New translations undo-redo.md (Chinese Simplified)
DBojsen Jun 21, 2026
83710fe
New translations xmla-as-connectivity.md (Chinese Simplified)
DBojsen Jun 21, 2026
4cb2ea5
New translations index.md (Chinese Simplified)
DBojsen Jun 21, 2026
3b973ec
New translations di001.md (Chinese Simplified)
DBojsen Jun 21, 2026
edeaf8a
New translations di002.md (Chinese Simplified)
DBojsen Jun 21, 2026
8365bfb
New translations di003.md (Chinese Simplified)
DBojsen Jun 21, 2026
770104a
New translations di004.md (Chinese Simplified)
DBojsen Jun 21, 2026
4e28f41
New translations di005.md (Chinese Simplified)
DBojsen Jun 21, 2026
14fd96a
New translations di006.md (Chinese Simplified)
DBojsen Jun 21, 2026
e96acfb
New translations di007.md (Chinese Simplified)
DBojsen Jun 21, 2026
ab33028
New translations di008.md (Chinese Simplified)
DBojsen Jun 21, 2026
7a151b7
New translations di009.md (Chinese Simplified)
DBojsen Jun 21, 2026
a3c73ba
New translations di011.md (Chinese Simplified)
DBojsen Jun 21, 2026
2a2c2d5
New translations di012.md (Chinese Simplified)
DBojsen Jun 21, 2026
4d364e5
New translations di013.md (Chinese Simplified)
DBojsen Jun 21, 2026
b6f76bf
New translations di014.md (Chinese Simplified)
DBojsen Jun 21, 2026
7acb01e
New translations di015.md (Chinese Simplified)
DBojsen Jun 21, 2026
e0effb5
New translations dr001.md (Chinese Simplified)
DBojsen Jun 21, 2026
0601bfc
New translations dr002.md (Chinese Simplified)
DBojsen Jun 21, 2026
cc8459f
New translations dr004.md (Chinese Simplified)
DBojsen Jun 21, 2026
5f0ed85
New translations dr005.md (Chinese Simplified)
DBojsen Jun 21, 2026
e9393cd
New translations dr006.md (Chinese Simplified)
DBojsen Jun 21, 2026
e9fbc85
New translations dr007.md (Chinese Simplified)
DBojsen Jun 21, 2026
c16c2de
New translations dr008.md (Chinese Simplified)
DBojsen Jun 21, 2026
f27fc70
New translations dr009.md (Chinese Simplified)
DBojsen Jun 21, 2026
29ec3ae
New translations dr010.md (Chinese Simplified)
DBojsen Jun 21, 2026
b840d0e
New translations dr011.md (Chinese Simplified)
DBojsen Jun 21, 2026
f86b8cf
New translations dr012.md (Chinese Simplified)
DBojsen Jun 21, 2026
d7fcffa
New translations dr013.md (Chinese Simplified)
DBojsen Jun 21, 2026
1221e37
New translations dr014.md (Chinese Simplified)
DBojsen Jun 21, 2026
c7cc719
New translations rw001.md (Chinese Simplified)
DBojsen Jun 21, 2026
b85ca66
New translations rw002.md (Chinese Simplified)
DBojsen Jun 21, 2026
0e6be25
New translations rw003.md (Chinese Simplified)
DBojsen Jun 21, 2026
bf5a4c6
New translations faq.md (Chinese Simplified)
DBojsen Jun 21, 2026
775230a
New translations formatdax.md (Chinese Simplified)
DBojsen Jun 21, 2026
0752db2
New translations roadmap2-h.md (Chinese Simplified)
DBojsen Jun 21, 2026
eb719ae
New translations policies.md (Chinese Simplified)
DBojsen Jun 21, 2026
79f438e
New translations preferences.md (Spanish)
DBojsen Jun 21, 2026
ec188cc
New translations preferences.md (Chinese Simplified)
DBojsen Jun 21, 2026
ddde8d9
New translations 3_10_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
2f9f4cd
New translations 3_10_1.md (Chinese Simplified)
DBojsen Jun 21, 2026
bc921b3
New translations 3_12_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
5661d2f
New translations 3_12_1.md (Chinese Simplified)
DBojsen Jun 21, 2026
4cefca3
New translations 3_18_1.md (Chinese Simplified)
DBojsen Jun 21, 2026
36d0c1e
New translations 3_18_2.md (Chinese Simplified)
DBojsen Jun 21, 2026
e10a18e
New translations 3_24_2.md (Chinese Simplified)
DBojsen Jun 21, 2026
806a7bd
New translations index.md (Spanish)
DBojsen Jun 21, 2026
5843f45
New translations security-privacy.md (Spanish)
DBojsen Jun 21, 2026
2674ac6
New translations licensing-activation.md (Spanish)
DBojsen Jun 21, 2026
24b89ff
New translations locale-not-supported.md (Spanish)
DBojsen Jun 21, 2026
19cb4f9
New translations connecting-to-azure-databricks.md (Spanish)
DBojsen Jun 21, 2026
1188f56
New translations incremental-refresh-schema.md (Spanish)
DBojsen Jun 21, 2026
78f1fc5
New translations incremental-refresh-setup.md (Spanish)
DBojsen Jun 21, 2026
3169a73
New translations incremental-refresh-setup.md (Chinese Simplified)
DBojsen Jun 21, 2026
73463d6
New translations incremental-refresh-workspace-mode.md (Chinese Simpl…
DBojsen Jun 21, 2026
0f189e0
New translations new-as-model.md (Chinese Simplified)
DBojsen Jun 21, 2026
95fa526
New translations new-pbi-model.md (Chinese Simplified)
DBojsen Jun 21, 2026
3bca49e
New translations powerbi-xmla.md (Chinese Simplified)
DBojsen Jun 21, 2026
41c555f
New translations udfs.md (Chinese Simplified)
DBojsen Jun 21, 2026
c387152
New translations bpa-avoid-invalid-characters-descriptions.md (Chines…
DBojsen Jun 21, 2026
fa43f7b
New translations bpa-avoid-invalid-characters-names.md (Chinese Simpl…
DBojsen Jun 21, 2026
6aabaa8
New translations bpa-avoid-provider-partitions-structured.md (Chinese…
DBojsen Jun 21, 2026
98872db
New translations bpa-calculation-groups-no-items.md (Chinese Simplified)
DBojsen Jun 21, 2026
c914e71
New translations bpa-data-column-source.md (Chinese Simplified)
DBojsen Jun 21, 2026
bfff258
New translations bpa-date-table-exists.md (Chinese Simplified)
DBojsen Jun 21, 2026
2b004b8
New translations bpa-do-not-summarize-numeric.md (Chinese Simplified)
DBojsen Jun 21, 2026
b03f47b
New translations bpa-expression-required.md (Chinese Simplified)
DBojsen Jun 21, 2026
ac9ec51
New translations bpa-format-string-columns.md (Chinese Simplified)
DBojsen Jun 21, 2026
104d1a3
New translations bpa-format-string-measures.md (Chinese Simplified)
DBojsen Jun 21, 2026
d34e937
New translations bpa-hide-foreign-keys.md (Chinese Simplified)
DBojsen Jun 21, 2026
390e675
New translations bpa-many-to-many-single-direction.md (Chinese Simpli…
DBojsen Jun 21, 2026
b34f433
New translations bpa-perspectives-no-objects.md (Chinese Simplified)
DBojsen Jun 21, 2026
a95e810
New translations bpa-powerbi-latest-compatibility.md (Chinese Simplif…
DBojsen Jun 21, 2026
8cf90c9
New translations bpa-relationship-same-datatype.md (Chinese Simplified)
DBojsen Jun 21, 2026
a9a7099
New translations bpa-remove-auto-date-table.md (Chinese Simplified)
DBojsen Jun 21, 2026
64d0d35
New translations bpa-remove-unused-data-sources.md (Chinese Simplified)
DBojsen Jun 21, 2026
04e6ae4
New translations bpa-set-isavailableinmdx-false.md (Chinese Simplified)
DBojsen Jun 21, 2026
291a546
New translations bpa-set-isavailableinmdx-true-necessary.md (Chinese …
DBojsen Jun 21, 2026
4d34f6e
New translations bpa-specify-application-name.md (Chinese Simplified)
DBojsen Jun 21, 2026
8553402
New translations bpa-trim-object-names.md (Chinese Simplified)
DBojsen Jun 21, 2026
9c6584f
New translations bpa-visible-objects-no-description.md (Chinese Simpl…
DBojsen Jun 21, 2026
6a6f543
New translations update-compatibility-level.md (Chinese Simplified)
DBojsen Jun 21, 2026
678b992
New translations advanced-refresh.md (Chinese Simplified)
DBojsen Jun 21, 2026
e9d7105
New translations built-in-bpa-rules.md (Chinese Simplified)
DBojsen Jun 21, 2026
4288ded
New translations refresh-overrides.md (Chinese Simplified)
DBojsen Jun 21, 2026
9ef1380
New translations save-with-supporting-files.md (Chinese Simplified)
DBojsen Jun 21, 2026
d27720d
New translations application-language.md (Chinese Simplified)
DBojsen Jun 21, 2026
0f6eb71
New translations 3_25_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
644f72b
New translations semantic-bridge-metric-view-object-model.md (Chinese…
DBojsen Jun 21, 2026
d8de48b
New translations semantic-bridge-metric-view-validation.md (Chinese S…
DBojsen Jun 21, 2026
3d9fb10
New translations semantic-bridge.md (Spanish)
DBojsen Jun 21, 2026
9fe8d80
New translations semantic-bridge.md (Chinese Simplified)
DBojsen Jun 21, 2026
b9c0650
New translations sample-metricview-deserialize.md (Chinese Simplified)
DBojsen Jun 21, 2026
9886f38
New translations semantic-bridge-add-object.md (Chinese Simplified)
DBojsen Jun 21, 2026
7533c35
New translations semantic-bridge-import.md (Chinese Simplified)
DBojsen Jun 21, 2026
4f37b7d
New translations semantic-bridge-load-inspect.md (Chinese Simplified)
DBojsen Jun 21, 2026
0c9a37a
New translations semantic-bridge-remove-object.md (Chinese Simplified)
DBojsen Jun 21, 2026
3dc9818
New translations semantic-bridge-rename-objects.md (Chinese Simplified)
DBojsen Jun 21, 2026
bcc81d1
New translations semantic-bridge-validate-contextual-rules.md (Chines…
DBojsen Jun 21, 2026
3197dc1
New translations semantic-bridge-validate-simple-rules.md (Chinese Si…
DBojsen Jun 21, 2026
849b823
New translations index.md (Chinese Simplified)
DBojsen Jun 21, 2026
d301c0c
New translations 3_25_1.md (Chinese Simplified)
DBojsen Jun 21, 2026
524397a
New translations 3_25_2.md (Chinese Simplified)
DBojsen Jun 21, 2026
99760cb
New translations 3_25_3.md (Chinese Simplified)
DBojsen Jun 21, 2026
f403a5d
New translations _ui-strings.json (Spanish)
DBojsen Jun 21, 2026
be74b14
New translations ai-assistant.md (Spanish)
DBojsen Jun 21, 2026
f864234
New translations scripting-dynamic-linq-vs-csharp.md (Spanish)
DBojsen Jun 21, 2026
bd23a5e
New translations te-cli-commands.md (Spanish)
DBojsen Jun 21, 2026
8caf332
New translations 3_1_1.md (Chinese Simplified)
DBojsen Jun 21, 2026
5920297
New translations 3_1_2.md (Chinese Simplified)
DBojsen Jun 21, 2026
2b4cf37
New translations 3_1_3.md (Chinese Simplified)
DBojsen Jun 21, 2026
a300e40
New translations 3_1_4.md (Chinese Simplified)
DBojsen Jun 21, 2026
78eb316
New translations 3_1_5.md (Chinese Simplified)
DBojsen Jun 21, 2026
7eeed79
New translations 3_1_6.md (Chinese Simplified)
DBojsen Jun 21, 2026
f84f39a
New translations 3_1_7.md (Chinese Simplified)
DBojsen Jun 21, 2026
859acda
New translations 3_20_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
25d4312
New translations 3_20_1.md (Chinese Simplified)
DBojsen Jun 21, 2026
7f1b6bd
New translations 3_21_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
680704c
New translations 3_22_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
b77acee
New translations 3_22_1.md (Chinese Simplified)
DBojsen Jun 21, 2026
d5b665f
New translations 3_23_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
bca9af5
New translations 3_23_1.md (Chinese Simplified)
DBojsen Jun 21, 2026
f41d3f7
New translations 3_24_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
009774b
New translations 3_24_1.md (Chinese Simplified)
DBojsen Jun 21, 2026
1b08658
New translations 3_24_2.md (Chinese Simplified)
DBojsen Jun 21, 2026
cc454df
New translations 3_2_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
faf10e5
New translations 3_2_1.md (Chinese Simplified)
DBojsen Jun 21, 2026
f8b2d07
New translations 3_2_2.md (Chinese Simplified)
DBojsen Jun 21, 2026
8f672a2
New translations 3_2_3.md (Chinese Simplified)
DBojsen Jun 21, 2026
9b97625
New translations 3_3_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
cc75b02
New translations csharp-scripts.md (Chinese Simplified)
DBojsen Jun 21, 2026
1e67476
New translations pivot-grid.md (Chinese Simplified)
DBojsen Jun 21, 2026
76a0725
New translations getting-started.md (Chinese Simplified)
DBojsen Jun 21, 2026
0a3f8a2
New translations index.md (Chinese Simplified)
DBojsen Jun 21, 2026
30cc03b
New translations installation.md (Chinese Simplified)
DBojsen Jun 21, 2026
7b6f5c0
New translations 3_3_1.md (Chinese Simplified)
DBojsen Jun 21, 2026
8258345
New translations 3_3_2.md (Chinese Simplified)
DBojsen Jun 21, 2026
98e1a2d
New translations 3_3_3.md (Chinese Simplified)
DBojsen Jun 21, 2026
1b52304
New translations 3_3_4.md (Chinese Simplified)
DBojsen Jun 21, 2026
bf0b780
New translations 3_3_5.md (Chinese Simplified)
DBojsen Jun 21, 2026
f479d59
New translations 3_3_6.md (Chinese Simplified)
DBojsen Jun 21, 2026
c490222
New translations 3_4_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
524c46e
New translations 3_4_1.md (Chinese Simplified)
DBojsen Jun 21, 2026
99ed2a3
New translations 3_4_2.md (Chinese Simplified)
DBojsen Jun 21, 2026
8e490ec
New translations 3_5_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
1a479f9
New translations 3_5_1.md (Chinese Simplified)
DBojsen Jun 21, 2026
11cce70
New translations 3_6_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
9ecbf77
New translations 3_7_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
743ebce
New translations 3_7_1.md (Chinese Simplified)
DBojsen Jun 21, 2026
7c370ea
New translations 3_8_0.md (Chinese Simplified)
DBojsen Jun 21, 2026
d62ddbf
New translations index.md (Chinese Simplified)
DBojsen Jun 21, 2026
176f97d
New translations licensing-activation.md (Chinese Simplified)
DBojsen Jun 21, 2026
8b10051
New translations locale-not-supported.md (Chinese Simplified)
DBojsen Jun 21, 2026
482d6ae
New translations _ui-strings.json (Chinese Simplified)
DBojsen Jun 21, 2026
b3c217e
New translations te-cli-auth.md (Chinese Simplified)
DBojsen Jun 21, 2026
d2e3cc8
New translations te-cli-automation.md (Chinese Simplified)
DBojsen Jun 21, 2026
b1a9935
New translations te-cli-cicd.md (Chinese Simplified)
DBojsen Jun 21, 2026
2500739
New translations te-cli-install.md (Chinese Simplified)
DBojsen Jun 21, 2026
812e1fd
New translations te-cli-interactive.md (Chinese Simplified)
DBojsen Jun 21, 2026
b3fc6ac
New translations te-cli-migrate.md (Chinese Simplified)
DBojsen Jun 21, 2026
f942c60
New translations te-cli.md (Chinese Simplified)
DBojsen Jun 21, 2026
41cfbc2
New translations te-cli-commands.md (Spanish)
DBojsen Jun 22, 2026
0f961a4
New translations te-cli-commands.md (Chinese Simplified)
DBojsen Jun 22, 2026
ac0d675
Merge branch 'localization' of https://github.com/TabularEditor/Tabul…
mlonsk Jun 22, 2026
e784a1c
New translations direct-query-over-as.md (Chinese Simplified)
DBojsen Jun 22, 2026
90b2da2
New translations useful-script-snippets.md (Chinese Simplified)
DBojsen Jun 22, 2026
9c76d2a
New translations dax-debugger.md (Chinese Simplified)
DBojsen Jun 22, 2026
9a7d5a9
New translations dax-editor.md (Chinese Simplified)
DBojsen Jun 22, 2026
66c4e30
New translations pivot-grid.md (Chinese Simplified)
DBojsen Jun 22, 2026
bfdfb02
New translations desktop-limitations.md (Chinese Simplified)
DBojsen Jun 22, 2026
d4c9a65
New translations parallel-development.md (Chinese Simplified)
DBojsen Jun 22, 2026
f5943d9
New translations master-model-pattern.md (Chinese Simplified)
DBojsen Jun 22, 2026
b98ff19
New translations di003.md (Chinese Simplified)
DBojsen Jun 22, 2026
31c7cd4
New translations di004.md (Chinese Simplified)
DBojsen Jun 22, 2026
6eb586f
New translations di005.md (Chinese Simplified)
DBojsen Jun 22, 2026
8afcfe9
New translations data-security-about.md (Chinese Simplified)
DBojsen Jun 22, 2026
7c1c1b5
New translations data-security-testing.md (Chinese Simplified)
DBojsen Jun 22, 2026
c533e48
New translations udfs.md (Chinese Simplified)
DBojsen Jun 22, 2026
1f73d31
New translations ai-assistant.md (Chinese Simplified)
DBojsen Jun 22, 2026
56b2717
New translations te-cli-commands.md (Chinese Simplified)
DBojsen Jun 22, 2026
5698b83
fix trailing space
mlonsk Jun 22, 2026
ad276ce
Merge branch 'localization' of https://github.com/TabularEditor/Tabul…
mlonsk Jun 22, 2026
711f773
New translations direct-query-over-as.md (Chinese Simplified)
DBojsen Jun 22, 2026
04c98ef
Added a commit
Jun 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 31 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,12 @@ swa start _site
1. **Generates DocFX configurations** - Runs `gen_redirects.py` to create `docfx.json` for each language
2. **Generates language manifest** - Creates `metadata/languages.json` for runtime language switching
3. **Syncs content** - Copies English source to `localizedContent/en/`. For other languages, only shared directories (assets, api) are synced by default since Crowdin manages translations. Use `--sync` to enable full English fallback for missing/outdated translations (useful for local development).
4. **Builds documentation** - Runs DocFX for each requested language
5. **Fixes API docs** - Patches xref links in generated API documentation
6. **Copies API docs** - Shares English API docs with localized sites
7. **Injects SEO tags** - Adds hreflang and canonical tags to HTML files
8. **Generates SWA config** - Creates `staticwebapp.config.json` for Azure Static Web Apps routing
4. **Normalizes DocFX alerts** - Runs `normalize-localized-alerts.py` on each non-English language to repair Crowdin-collapsed Note/Tip/etc. alerts before building (see [DocFX Alerts and Translations](#docfx-alerts-and-translations))
5. **Builds documentation** - Runs DocFX for each requested language
6. **Fixes API docs** - Patches xref links in generated API documentation
7. **Copies API docs** - Shares English API docs with localized sites
8. **Injects SEO tags** - Adds hreflang and canonical tags to HTML files
9. **Generates SWA config** - Creates `staticwebapp.config.json` for Azure Static Web Apps routing

# Project Structure

Expand All @@ -73,7 +74,8 @@ TEDoc/
│ ├── gen_languages.py # Generates language manifest
│ ├── gen_staticwebapp_config.py
│ ├── inject_seo_tags.py
│ └── sync-localized-content.py
│ ├── sync-localized-content.py
│ └── normalize-localized-alerts.py # Repairs Crowdin-collapsed DocFX alerts
├── content/ # English source content (tracked in git)
│ └── _ui-strings.json # English UI strings (header, footer, banners)
├── localizedContent/ # Build directories for all languages
Expand Down Expand Up @@ -117,6 +119,28 @@ To prevent this, add an `<a name="..."></a>` tag above any heading that is refer

Crowdin does not translate HTML `name` attributes, so the anchor remains stable across all languages. Only add these to headings that are actually linked to — there is no need to add them to every heading.

# DocFX Alerts and Translations

DocFX renders styled alert boxes (Note, Tip, Important, Warning, Caution) from a two-line blockquote where the marker stands alone on the first line:

```markdown
> [!NOTE]
> Your note text here.
```

When an alert like this is nested inside a list item, Crowdin collapses the two lines into one on export, producing `> [!NOTE]> Your note text here.`. DocFX requires the marker to be alone on its line, so the collapsed form is downgraded to a plain `<blockquote>` — losing the styled box — and the build logs an `invalid-note-section` warning. Only list-nested alerts are affected; top-level alerts round-trip through Crowdin unchanged.

`build_scripts/normalize-localized-alerts.py` repairs this by splitting the collapsed form back into two lines, preserving the original indentation so the alert stays inside its list item. It is idempotent and only rewrites the exact collapsed pattern (text inside fenced code blocks is left untouched), so it is safe to run repeatedly.

The build runs it automatically for each non-English language before DocFX (step 4 of [What the Build Script Does](#what-the-build-script-does)). You can also run it manually after a Crowdin pull:

```bash
python build_scripts/normalize-localized-alerts.py # fix all languages
python build_scripts/normalize-localized-alerts.py --dry-run # preview without writing
python build_scripts/normalize-localized-alerts.py --check # exit 1 if fixes are needed (CI)
python build_scripts/normalize-localized-alerts.py es # fix a single language
```

# Translating UI Strings

The `_ui-strings.json` file controls the text of site-wide UI elements that are not part of the documentation content itself: the header navigation, header buttons, footer text, and the AI translation warning banner. These strings are applied at runtime by the JavaScript bundle for non-English pages.
Expand Down Expand Up @@ -175,3 +199,4 @@ If a key is missing from a language's file, or no `_ui-strings.json` exists at a
| `tableOfContents` | `Table of Contents` | Mobile TOC offcanvas title |
| `selectLanguage` | `Select language` | Language picker label |
| `copyCode` | `Copy code` | Code block copy button aria-label |

66 changes: 57 additions & 9 deletions build-docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,25 +23,61 @@
import argparse
import json
import os
import re
import shutil
import subprocess
import sys
from pathlib import Path


def run_command(cmd: list[str], description: str, check: bool = True) -> int:
"""Run a command and return exit code."""
_DOCFX_WARNING_RE = re.compile(r': warning ', re.IGNORECASE)


def run_command(cmd: list[str], description: str, check: bool = True, fail_on_warnings: bool = False) -> int:
"""Run a command and return exit code.

If fail_on_warnings=True, streams output line-by-line, counts DocFX warning
diagnostics (lines matching ': warning '), and returns exit code 1 if any
are found — even when the process itself exits 0.
"""
print(f"\n{'='*60}")
print(f" {description}")
print(f"{'='*60}")
print(f"Running: {' '.join(cmd)}\n")


if fail_on_warnings:
warning_count = 0
process = subprocess.Popen(
cmd,
shell=(os.name == 'nt'),
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True,
encoding='utf-8',
errors='replace'
)
for line in process.stdout:
print(line, end='', flush=True)
if _DOCFX_WARNING_RE.search(line):
warning_count += 1
process.wait()

if check and process.returncode != 0:
print(f"Error: Command failed with exit code {process.returncode}")
return process.returncode

if warning_count > 0:
print(f"\nError: DocFX produced {warning_count} warning(s). Failing build.")
return 1

return process.returncode

result = subprocess.run(cmd, shell=(os.name == 'nt'))

if check and result.returncode != 0:
print(f"Error: Command failed with exit code {result.returncode}")
return result.returncode

return result.returncode


Expand Down Expand Up @@ -85,15 +121,24 @@ def prepare_localized_content(lang: str, sync: bool = False) -> int:
)

if sync:
return run_command(
result = run_command(
[sys.executable, "build_scripts/sync-localized-content.py", "--sync", lang],
f"Syncing {lang} content (fallback to English for outdated)"
)
else:
return run_command(
result = run_command(
[sys.executable, "build_scripts/sync-localized-content.py", "--shared-only", lang],
f"Syncing shared directories for {lang}"
)
if result != 0:
return result

# Repair Crowdin-collapsed DocFX alerts (e.g. "> [!NOTE]> text") before docfx
# builds this language, so alerts render as styled boxes instead of plain quotes.
return run_command(
[sys.executable, "build_scripts/normalize-localized-alerts.py", lang],
f"Normalizing DocFX alerts for {lang}"
)


def build_language(lang: str, sync: bool = False) -> int:
Expand All @@ -110,10 +155,13 @@ def build_language(lang: str, sync: bool = False) -> int:
if result != 0:
return result

# Build the documentation
# Build the documentation — fail on DocFX warnings only for English (the
# authored source). Localized content is Crowdin-managed and may carry
# translation warnings that must not block deployment.
return run_command(
["docfx", config_path],
f"Building {lang} documentation"
f"Building {lang} documentation",
fail_on_warnings=(lang == "en")
)


Expand Down
172 changes: 172 additions & 0 deletions build_scripts/normalize-localized-alerts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Normalize DocFX alerts in Crowdin-translated content.

Crowdin collapses DocFX/GitHub-style alerts that are nested inside list items,
joining the marker line and the first content line. This:

> [!NOTE]
> text

comes back from Crowdin as:

> [!NOTE]> text

DocFX requires the alert marker (e.g. [!NOTE]) to stand alone on its line.
Otherwise the parser emits an "invalid-note-section" warning and downgrades the
alert to a plain <blockquote>, losing the styled NOTE/TIP/IMPORTANT box.

This script finds the collapsed form and splits it back into two lines,
preserving the original indentation so the alert stays inside its list item.
It is idempotent and only rewrites the exact collapsed pattern, so it is safe
to run after every Crowdin pull. Lines inside fenced code blocks are skipped so
documentation that shows alert syntax verbatim is never altered.

Usage:
python normalize-localized-alerts.py # fix all languages
python normalize-localized-alerts.py --dry-run # preview only
python normalize-localized-alerts.py --check # exit 1 if fixes needed (CI)
python normalize-localized-alerts.py es # fix only Spanish
"""

import argparse
import sys
import re
from pathlib import Path

# localizedContent/ lives one level up from this build_scripts/ directory.
TEDOC_ROOT = Path(__file__).resolve().parent.parent
LOCALIZED_DIR = TEDOC_ROOT / "localizedContent"

# A blockquote line where a DocFX alert marker is immediately followed by '>'
# and inline content, e.g. " > [!NOTE]> text". Captures the leading
# indentation, the marker, and the trailing content.
COLLAPSED_ALERT_RE = re.compile(r"^([ \t]*)>[ \t]?(\[![A-Za-z]+\])>[ \t]?(.*)$")

# A fenced-code delimiter: 3+ backticks or 3+ tildes, optionally indented.
# Group 1 is the run of fence characters; group 2 is any trailing text
# (an info string on an opener; must be blank on a valid closer).
FENCE_RE = re.compile(r"^\s*(`{3,}|~{3,})(.*)$")


def normalize_text(text: str, newline: str) -> tuple[str, int]:
"""Return (new_text, fixes) with collapsed alerts split into two lines.

Fenced code blocks are tracked per CommonMark so alert-looking text inside a
code sample is never rewritten: a fence is only *closed* by a delimiter using
the same character, at least as long as the opener, with no trailing text.
This keeps state in sync across nested/mismatched fences (e.g. a ```` block
that contains ``` lines, or backtick and tilde fences mixed in one file).
"""
lines = text.split(newline)
out: list[str] = []
fence_char = "" # "" when outside a fence, else the opener's char ("`"/"~")
fence_len = 0
fixes = 0

for line in lines:
fence = FENCE_RE.match(line)
if fence:
run, tail = fence.group(1), fence.group(2)
char, length = run[0], len(run)
if not fence_char:
fence_char, fence_len = char, length # opening fence
elif char == fence_char and length >= fence_len and not tail.strip():
fence_char, fence_len = "", 0 # matching closing fence
# Otherwise it's a fence-looking line inside the block: leave as content.
out.append(line)
continue

if not fence_char:
m = COLLAPSED_ALERT_RE.match(line)
if m:
indent, marker, rest = m.group(1), m.group(2), m.group(3)
out.append(f"{indent}> {marker}")
out.append(f"{indent}> {rest}" if rest else f"{indent}>")
fixes += 1
continue

out.append(line)

return newline.join(out), fixes


def normalize_file(path: Path, dry_run: bool) -> int:
"""Normalize a single file in place. Returns number of alerts fixed."""
with open(path, "r", encoding="utf-8", newline="") as f:
text = f.read()

newline = "\r\n" if "\r\n" in text else "\n"
new_text, fixes = normalize_text(text, newline)

if fixes and not dry_run:
with open(path, "w", encoding="utf-8", newline="") as f:
f.write(new_text)

return fixes


def iter_markdown_files(lang: str | None):
"""Yield every .md file under localizedContent/ (optionally one language)."""
base = LOCALIZED_DIR / lang if lang else LOCALIZED_DIR
if not base.exists():
return
yield from sorted(base.rglob("*.md"))


def main() -> int:
parser = argparse.ArgumentParser(
description="Split Crowdin-collapsed DocFX alerts back into two lines."
)
parser.add_argument(
"lang", nargs="?",
help="Language code to fix (default: all languages under localizedContent/)",
)
parser.add_argument(
"--dry-run", action="store_true",
help="Show what would change without writing files",
)
parser.add_argument(
"--check", action="store_true",
help="Exit 1 if any file needs fixing (implies --dry-run). For CI.",
)
args = parser.parse_args()

dry_run = args.dry_run or args.check

if not LOCALIZED_DIR.exists():
print(f"Error: {LOCALIZED_DIR} not found.")
return 1

total_files = 0
total_fixes = 0

for path in iter_markdown_files(args.lang):
fixes = normalize_file(path, dry_run)
if fixes:
total_files += 1
total_fixes += fixes
rel = path.relative_to(LOCALIZED_DIR)
verb = "Would fix" if dry_run else "Fixed"
print(f" {verb} {fixes} alert(s): {rel}")

if total_fixes == 0:
print("No collapsed alerts found. Everything is clean.")
return 0

action = "would be fixed" if dry_run else "fixed"
print(f"\n{total_fixes} alert(s) across {total_files} file(s) {action}.")

if args.check:
print("Run without --check to apply the fixes.")
return 1
return 0


if __name__ == "__main__":
try:
sys.exit(main())
except KeyboardInterrupt:
print("\nInterrupted.")
sys.exit(1)
Loading
Loading