i18n on the web - deepseek translations

This commit is contained in:
Priec
2026-08-14 20:35:37 +02:00
parent 2dc0d94ba0
commit 8f1bfdbe0c
91 changed files with 4679 additions and 1237 deletions

View File

@@ -1,10 +1,10 @@
{# GET /admin/tables/new — crate::pages::add_table::ui::AddTablePage #}
{% extends "ui/form_page.html" %}
{% block title %}Add table{% endblock %}
{% block eyebrow %}Table definition{% endblock %}
{% block heading %}Add table{% endblock %}
{% block lead %}<p>Choose whether the table belongs to one profile or is available to all profiles, then add its columns. After creation, you can assign the initial role permissions.</p>{% endblock %}
{% block title %}{{ nav.tr("add-table-title") }}{% endblock %}
{% block eyebrow %}{{ nav.tr("add-table-eyebrow") }}{% endblock %}
{% block heading %}{{ nav.tr("add-table-title") }}{% endblock %}
{% block lead %}<p>{{ nav.tr("add-table-lead") }}</p>{% endblock %}
{% block form %}
{#

View File

@@ -17,16 +17,16 @@
down to the column list or the Create table button. The alert stays too, as
what is left on the page after the dialog is dismissed.
#}
{%- if let Some(message) = page.error %}{% call alert::error("Could not continue", message) %}{% endcall %}{% endif -%}
{%- if let Some(message) = page.status %}{% call toast::success("Draft updated", message) %}{% endcall %}{% endif -%}
{%- if let Some(message) = page.error %}{% call dialog::error("Could not continue", message) %}{% endcall %}{% endif -%}
{%- if let Some(message) = page.error %}{% call alert::error(nav.locale, nav.tr("builder-could-not-continue"), message) %}{% endcall %}{% endif -%}
{%- if let Some(message) = page.status %}{% call toast::success(nav.tr("builder-draft-updated"), message) %}{% endcall %}{% endif -%}
{%- if let Some(message) = page.error %}{% call dialog::error(nav.locale, nav.tr("builder-could-not-continue"), message) %}{% endcall %}{% endif -%}
<section class="builder-section">
<h2>Table details</h2>
<h2>{{ nav.tr("builder-table-details") }}</h2>
<div class="form-grid">
{# Penguin UI custom radio, adapted from radio/custom-radio.html with this form's values and htmx behaviour. #}
<fieldset class="col-span-full m-0 border-0 p-0">
<legend class="mb-2 text-xs text-on-surface">Where should this table be available?</legend>
<legend class="mb-2 text-xs text-on-surface">{{ nav.tr("builder-scope-question") }}</legend>
<div class="grid grid-cols-1 gap-2">
<label class="relative flex items-center gap-3 rounded-radius border border-outline bg-surface-alt px-3 py-2.5 text-on-surface transition-colors has-checked:border-primary has-checked:bg-primary/5 has-checked:text-on-surface-strong has-focus:outline-2 has-focus:outline-offset-2 has-focus:outline-primary">
<input id="scope-profile" type="radio" name="global" value="false" class="peer sr-only"
@@ -38,7 +38,7 @@
<svg aria-hidden="true" viewBox="0 0 16 16" fill="currentColor" class="invisible size-5 shrink-0 peer-checked:visible">
<path fill-rule="evenodd" d="M12.416 3.376a.75.75 0 0 1 .208 1.04l-5 7.5a.75.75 0 0 1-1.154.114l-3-3a.75.75 0 0 1 1.06-1.06l2.353 2.353 4.493-6.74a.75.75 0 0 1 1.04-.207Z" clip-rule="evenodd"></path>
</svg>
<span class="flex flex-col"><strong class="text-sm font-medium">One profile</strong><small id="scope-profile-description">Only the selected profile can use this table.</small></span>
<span class="flex flex-col"><strong class="text-sm font-medium">{{ nav.tr("builder-scope-profile") }}</strong><small id="scope-profile-description">{{ nav.tr("builder-scope-profile-hint") }}</small></span>
</label>
<label class="relative flex items-center gap-3 rounded-radius border border-outline bg-surface-alt px-3 py-2.5 text-on-surface transition-colors has-checked:border-primary has-checked:bg-primary/5 has-checked:text-on-surface-strong has-focus:outline-2 has-focus:outline-offset-2 has-focus:outline-primary">
<input id="scope-global" type="radio" name="global" value="true" class="peer sr-only"
@@ -50,21 +50,21 @@
<svg aria-hidden="true" viewBox="0 0 16 16" fill="currentColor" class="invisible size-5 shrink-0 peer-checked:visible">
<path fill-rule="evenodd" d="M12.416 3.376a.75.75 0 0 1 .208 1.04l-5 7.5a.75.75 0 0 1-1.154.114l-3-3a.75.75 0 0 1 1.06-1.06l2.353 2.353 4.493-6.74a.75.75 0 0 1 1.04-.207Z" clip-rule="evenodd"></path>
</svg>
<span class="flex flex-col"><strong class="text-sm font-medium">All profiles</strong><small id="scope-global-description">Every profile can use this shared table.</small></span>
<span class="flex flex-col"><strong class="text-sm font-medium">{{ nav.tr("builder-scope-global") }}</strong><small id="scope-global-description">{{ nav.tr("builder-scope-global-hint") }}</small></span>
</label>
</div>
</fieldset>
{% if !page.draft.global %}
<label>Which profile?
<label>{{ nav.tr("builder-which-profile") }}
<select name="profile_name" hx-post="/admin/tables/builder" hx-trigger="change"
hx-include="#table-form" hx-target="#builder" hx-swap="innerHTML"
hx-vals='{"action": "refresh"}'>
<option value="">Choose a profile</option>
<option value="">{{ nav.tr("builder-choose-profile") }}</option>
{% for profile in page.profiles %}
<option value="{{ profile }}" {% if page.selected_profile() == profile.as_str() %}selected{% endif %}>{{ profile }}</option>
{% endfor %}
<option value="__new__" {% if page.draft.creating_new_profile %}selected{% endif %}>+ New profile…</option>
<option value="__new__" {% if page.draft.creating_new_profile %}selected{% endif %}>+ {{ nav.tr("builder-new-profile") }}</option>
</select>
</label>
{% else %}
@@ -72,13 +72,13 @@
{% endif %}
{% if page.draft.show_profile_name_input() %}
<label>New profile name
<label>{{ nav.tr("builder-new-profile-name") }}
<input name="profile_name_input" value="{{ page.draft.profile_name_input }}" placeholder="bookkeeping">
</label>
{% endif %}
{% if page.draft.show_accounting_currency() %}
<label>Accounting currency
<label>{{ nav.tr("builder-accounting-currency") }}
<input name="accounting_currency" value="{{ page.draft.accounting_currency }}" list="currency-codes"
maxlength="3" placeholder="EUR">
</label>
@@ -95,7 +95,7 @@
that list is only rendered after a column-type `change`, which posts the
current name along with the rest of the form.
#}
<label>Table name
<label>{{ nav.tr("builder-table-name") }}
<input name="table_name" value="{{ page.draft.table_name }}" placeholder="invoice">
</label>
@@ -103,7 +103,7 @@
</section>
<section class="builder-section">
<h2>Add a column</h2>
<h2>{{ nav.tr("builder-add-column-heading") }}</h2>
<div class="form-grid">
{#
A compound choice is a definition row, not a column: it is named after
@@ -111,26 +111,26 @@
nothing to name, so the field is replaced by what the choice will add.
#}
{% if !page.draft.columns.pending_is_compound() %}
<label>{% if page.draft.columns.show_link_target() %}Link alias{% else %}Column name{% endif %}
<label>{% if page.draft.columns.show_link_target() %}{{ nav.tr("td-link-alias") }}{% else %}{{ nav.tr("td-column-name") }}{% endif %}
<input name="column_name_input" value="{{ page.draft.columns.name_input }}" placeholder="number">
{% if page.draft.columns.show_link_target() %}<small>The alias is the column name used to distinguish this relationship.</small>{% endif %}
{% if page.draft.columns.show_link_target() %}<small>{{ nav.tr("td-link-alias-hint") }}</small>{% endif %}
</label>
{% endif %}
<label>Column type
<label>{{ nav.tr("td-column-type") }}
<select name="column_type_input" hx-post="/admin/tables/builder" hx-trigger="change"
hx-include="#table-form" hx-target="#builder" hx-swap="innerHTML"
hx-vals='{"action": "refresh"}'>
<option value="">Choose a type</option>
<option value="">{{ nav.tr("td-choose-type") }}</option>
{% for column_type in column_types %}
<option value="{{ column_type }}" {% if page.draft.columns.type_input == *column_type %}selected{% endif %}>{% if *column_type == "link" %}FKlink{% else %}{{ column_type }}{% endif %}</option>
<option value="{{ column_type }}" {% if page.draft.columns.type_input == *column_type %}selected{% endif %}>{% if *column_type == "link" %}{{ nav.tr("td-fk-link") }}{% else %}{{ column_type }}{% endif %}</option>
{% endfor %}
</select>
</label>
{% if page.draft.columns.show_temporal_type() %}
<label>Temporal type
<label>{{ nav.tr("td-temporal-type") }}
<select name="temporal_type_input">
<option value="">Choose a temporal type</option>
<option value="">{{ nav.tr("td-choose-temporal-type") }}</option>
{% for temporal_type in temporal_types %}
<option value="{{ temporal_type }}" {% if page.draft.columns.temporal_type_input == *temporal_type %}selected{% endif %}>{{ temporal_type }}</option>
{% endfor %}
@@ -139,9 +139,9 @@
{% endif %}
{% if page.draft.columns.show_gtin_type() %}
<label>GTIN type
<label>{{ nav.tr("td-gtin-type") }}
<select name="gtin_type_input">
<option value="">Choose a GTIN length</option>
<option value="">{{ nav.tr("td-choose-gtin-length") }}</option>
{% for gtin_type in gtin_types %}
<option value="{{ gtin_type }}" {% if page.draft.columns.gtin_type_input == *gtin_type %}selected{% endif %}>GTIN-{{ gtin_type }}</option>
{% endfor %}
@@ -150,57 +150,57 @@
{% endif %}
{% if page.draft.columns.show_decimal_arguments() %}
<label>Precision
<label>{{ nav.tr("td-precision") }}
<input name="decimal_precision_input" value="{{ page.draft.columns.decimal_precision_input }}"
inputmode="numeric" placeholder="12">
<small>Total digits stored, at least 1.</small>
<small>{{ nav.tr("td-precision-hint") }}</small>
</label>
<label>Scale
<label>{{ nav.tr("td-scale") }}
<input name="decimal_scale_input" value="{{ page.draft.columns.decimal_scale_input }}"
inputmode="numeric" placeholder="3">
<small>Digits after the point, no more than the precision.</small>
<small>{{ nav.tr("td-scale-hint") }}</small>
</label>
{% endif %}
{% if page.draft.columns.show_link_target() %}
<label>Referenced table
<label>{{ nav.tr("td-referenced-table") }}
<select name="link_table_input">
<option value="">Choose a table</option>
<option value="">{{ nav.tr("td-choose-table") }}</option>
{% if !page.draft.global_relation_tables().is_empty() %}
<optgroup label="Global">
<optgroup label="{{ nav.tr("td-group-global") }}">
{% for table in page.draft.global_relation_tables() %}
<option value="{{ table }}" {% if page.draft.columns.link_table_input == *table %}selected{% endif %}>{{ table }}</option>
{% endfor %}
</optgroup>
{% endif %}
{% if !page.draft.user_relation_tables().is_empty() %}
<optgroup label="User-created">
<optgroup label="{{ nav.tr("td-group-user") }}">
{% for table in page.draft.user_relation_tables() %}
<option value="{{ table }}" {% if page.draft.columns.link_table_input == *table %}selected{% endif %}>{{ table }}</option>
{% endfor %}
</optgroup>
{% endif %}
{% if !page.draft.system_relation_tables().is_empty() %}
<optgroup label="System-created">
<optgroup label="{{ nav.tr("td-group-system") }}">
{% for table in page.draft.system_relation_tables() %}
<option value="{{ table }}" {% if page.draft.columns.link_table_input == *table %}selected{% endif %}>{{ table }}</option>
{% endfor %}
</optgroup>
{% endif %}
</select>
{% if page.draft.relation_tables.is_empty() %}<small>No eligible tables exist in this scope.</small>{% endif %}
{% if page.draft.relation_tables.is_empty() %}<small>{{ nav.tr("td-no-eligible-tables") }}</small>{% endif %}
</label>
{% endif %}
{% if page.draft.columns.show_money_options() %}
<label>Currency
<label>{{ nav.tr("td-currency") }}
<input name="column_currency_input" value="{{ page.draft.columns.currency_input }}" list="currency-codes"
maxlength="3" placeholder="EUR">
</label>
<label>Rounding
<label>{{ nav.tr("td-rounding") }}
<select name="column_rounding_input">
<option value="none" {% if page.draft.columns.rounding_input != "half-up" %}selected{% endif %}>none</option>
<option value="half-up" {% if page.draft.columns.rounding_input == "half-up" %}selected{% endif %}>half-up</option>
<option value="none" {% if page.draft.columns.rounding_input != "half-up" %}selected{% endif %}>{{ nav.tr("td-rounding-none") }}</option>
<option value="half-up" {% if page.draft.columns.rounding_input == "half-up" %}selected{% endif %}>{{ nav.tr("td-rounding-half-up") }}</option>
</select>
</label>
{% endif %}
@@ -214,71 +214,71 @@
definition that asks for one on top — so there is no choice to offer.
#}
{% if page.draft.columns.show_indexing() %}
<label>Indexing
<label>{{ nav.tr("td-indexing") }}
<select name="column_indexing_input">
<option value="no" {% if page.draft.columns.indexing_input != "yes" %}selected{% endif %}>no</option>
<option value="yes" {% if page.draft.columns.indexing_input == "yes" %}selected{% endif %}>yes</option>
<option value="no" {% if page.draft.columns.indexing_input != "yes" %}selected{% endif %}>{{ nav.tr("common-no") }}</option>
<option value="yes" {% if page.draft.columns.indexing_input == "yes" %}selected{% endif %}>{{ nav.tr("common-yes") }}</option>
</select>
</label>
{% else if page.draft.columns.pending_is_auto_indexed() %}
<div class="field-note">
<span class="field-label">Indexing</span>
<p class="hint">Indexed automatically — a link is a foreign key, and the server indexes every one of them.</p>
<span class="field-label">{{ nav.tr("td-indexing") }}</span>
<p class="hint">{{ nav.tr("td-indexed-automatically") }}</p>
</div>
{% endif %}
<label>Required
<label>{{ nav.tr("td-required") }}
<select name="column_required_input">
<option value="no" {% if page.draft.columns.required_input != "yes" %}selected{% endif %}>no</option>
<option value="yes" {% if page.draft.columns.required_input == "yes" %}selected{% endif %}>yes</option>
<option value="no" {% if page.draft.columns.required_input != "yes" %}selected{% endif %}>{{ nav.tr("common-no") }}</option>
<option value="yes" {% if page.draft.columns.required_input == "yes" %}selected{% endif %}>{{ nav.tr("common-yes") }}</option>
</select>
<small>A row must carry a value for it.</small>
<small>{{ nav.tr("td-required-hint") }}</small>
</label>
{% if page.draft.columns.show_quantity_ledger() %}
<label>Quantity ledger
<label>{{ nav.tr("td-quantity-ledger") }}
<select name="column_quantity_ledger_input">
<option value="no" {% if page.draft.columns.quantity_ledger_input != "yes" %}selected{% endif %}>no</option>
<option value="yes" {% if page.draft.columns.quantity_ledger_input == "yes" %}selected{% endif %}>yes</option>
<option value="no" {% if page.draft.columns.quantity_ledger_input != "yes" %}selected{% endif %}>{{ nav.tr("common-no") }}</option>
<option value="yes" {% if page.draft.columns.quantity_ledger_input == "yes" %}selected{% endif %}>{{ nav.tr("common-yes") }}</option>
</select>
<small>{{ page.draft.columns.quantity_ledger_types() }} only.</small>
<small>{{ nav.tr_args("td-ql-only", [("types", page.draft.columns.quantity_ledger_types())]) }}</small>
</label>
{% endif %}
{% endif %}
</div>
{% if page.draft.global %}
<p class="hint">A shared table keeps no books of its own, so ACCOUNTING, ACCOUNTING_TRANSFER and quantity-ledger columns are not offered here — each of them posts to one profile's ledger.</p>
<p class="hint">{{ nav.tr("builder-shared-table-hint") }}</p>
{% endif %}
{% if page.draft.columns.pending_is_compound() %}
<div class="compound-note">
<p><code>{{ page.draft.columns.pending_compound_name() }}</code> is a definition row, not a column of its own. Adding it gives the table:</p>
<p><code>{{ page.draft.columns.pending_compound_name() }}</code> {{ nav.tr("builder-compound-intro") }}</p>
<ul>
{% for generated in page.draft.columns.pending_generated_columns() %}
{# The currency and rounding are named rather than shown: those two
inputs sit above with no `change` trigger of their own, so their
current values are only known here on the next render. #}
<li><code>{{ generated.name }}</code> <span class="hint">{{ generated.data_type }}{% if generated.inherits_currency %} — kept in the currency and rounding chosen above{% endif %}</span></li>
<li><code>{{ generated.name }}</code> <span class="hint">{{ generated.data_type }}{% if generated.inherits_currency %} — {{ nav.tr("builder-inherits-currency-hint") }}{% endif %}</span></li>
{% endfor %}
{% if page.draft.columns.pending_compound_name() == "accounting" %}
<li><code>account_id</code> <span class="hint">system column — the account each row is posted to, written as <code>account</code></span></li>
<li><code>account_id</code> <span class="hint">{{ nav.tr("builder-account-system-hint")|safe }}</span></li>
{% endif %}
</ul>
<p class="hint">Each of these can be given a name of your own under <em>Rename generated columns</em> once the row is added; leave a field empty to keep the name shown here.</p>
<p class="hint">These names are reserved: no column of your own may use them, and the table may hold only one <code>{{ page.draft.columns.pending_compound_name() }}</code>. They land where this row sits in the column list, and can be moved with it.</p>
<p class="hint">{{ nav.tr("builder-rename-generated-hint")|safe }}</p>
<p class="hint">{{ nav.tr_args("builder-reserved-hint", [("type", page.draft.columns.pending_compound_name())])|safe }}</p>
</div>
{% endif %}
<button type="button" class="secondary" hx-post="/admin/tables/builder" hx-include="#table-form"
hx-target="#builder" hx-swap="innerHTML" hx-vals='{"action": "add-column"}'>Add column</button>
hx-target="#builder" hx-swap="innerHTML" hx-vals='{"action": "add-column"}'>{{ nav.tr("builder-add-column-button") }}</button>
</section>
<section class="builder-section">
<h2>Columns <span class="count">{{ page.draft.columns.added.len() }}</span></h2>
<h2>{{ nav.tr("builder-columns-heading") }} <span class="count">{{ page.draft.columns.added.len() }}</span></h2>
{% if page.draft.columns.is_empty() %}
<p class="hint">No columns yet. Describe one above and press <em>Add column</em>.</p>
<p class="hint">{{ nav.tr("builder-no-columns") }} <em>{{ nav.tr("builder-add-column-button") }}</em>.</p>
{% else %}
<p class="hint">Columns are created in this order. Use the arrows to move one.</p>
<p class="hint">{{ nav.tr("builder-columns-order-hint") }}</p>
<table class="builder-table">
<thead><tr><th>Order</th><th>Name</th><th>Type</th><th>Indexed</th><th>Options</th><th></th></tr></thead>
<thead><tr><th>{{ nav.tr("builder-th-order") }}</th><th>{{ nav.tr("builder-th-name") }}</th><th>{{ nav.tr("builder-th-type") }}</th><th>{{ nav.tr("builder-th-indexed") }}</th><th>{{ nav.tr("builder-th-options") }}</th><th></th></tr></thead>
<tbody>
{#
Every declared column, each followed by the columns the server will
@@ -290,11 +290,11 @@
<tr {% if row.index.is_none() %}class="generated-row"{% endif %}>
<td class="order">
{% if let Some(index) = row.index %}
<button type="button" class="toggle move" aria-label="Move {{ row.name }} up"
<button type="button" class="toggle move" aria-label="{{ nav.tr_args("builder-move-up", [("name", row.name.clone())]) }}"
{% if row.first %}disabled{% else %}hx-post="/admin/tables/builder" hx-include="#table-form"
hx-target="#builder" hx-swap="innerHTML"
hx-vals='{"action": "move-column-up", "index": "{{ index }}"}'{% endif %}>&uarr;</button>
<button type="button" class="toggle move" aria-label="Move {{ row.name }} down"
<button type="button" class="toggle move" aria-label="{{ nav.tr_args("builder-move-down", [("name", row.name.clone())]) }}"
{% if row.last %}disabled{% else %}hx-post="/admin/tables/builder" hx-include="#table-form"
hx-target="#builder" hx-swap="innerHTML"
hx-vals='{"action": "move-column-down", "index": "{{ index }}"}'{% endif %}>&darr;</button>
@@ -306,7 +306,7 @@
<code>{{ row.name }}</code>
{# The list only reports a rename; it is asked for below, so that
this column stays something to read. #}
{% if !row.alias.is_empty() %}<span class="tag">renamed to {{ row.alias }}</span>{% endif %}
{% if !row.alias.is_empty() %}<span class="tag">{{ nav.tr_args("builder-renamed-to", [("alias", row.alias.clone())]) }}</span>{% endif %}
</td>
<td>{{ row.data_type }}</td>
<td>
@@ -323,7 +323,7 @@
{% else if row.indexed %}
{# Not a choice anyone made: a link and the account foreign key
are indexed by the server as it creates the table. #}
<span class="tag">indexed automatically</span>
<span class="tag">{{ nav.tr("td-indexed-automatically-tag") }}</span>
{% else %}
<span class="hint">&mdash;</span>
{% endif %}
@@ -333,7 +333,7 @@
{% if let Some(index) = row.index %}
<button type="button" class="danger" hx-post="/admin/tables/builder" hx-include="#table-form"
hx-target="#builder" hx-swap="innerHTML"
hx-vals='{"action": "remove-column", "index": "{{ index }}"}'>Remove</button>
hx-vals='{"action": "remove-column", "index": "{{ index }}"}'>{{ nav.tr("common-remove") }}</button>
{% endif %}
</td>
</tr>
@@ -369,8 +369,8 @@
{# Open once a name has been asked for: the section is where those names are
read back, and a swap that closed it would hide what was just applied. #}
<details class="rename-generated" {% if page.draft.has_generated_aliases() %}open{% endif %}>
<summary>Rename generated columns</summary>
<p class="hint">These columns come from the definition rows above. Give one a name of your own, or leave it empty to keep the name shown.</p>
<summary>{{ nav.tr("builder-rename-generated") }}</summary>
<p class="hint">{{ nav.tr("builder-rename-generated-hint2") }}</p>
<ul class="rename-list">
{% for row in page.alias_rows() %}
<li>
@@ -378,7 +378,7 @@
<span class="hint">{{ row.data_type }}</span>
<input type="hidden" name="generated_alias_sources" value="{{ row.source }}">
<input name="generated_alias_names" value="{{ row.alias }}"
aria-label="Rename {{ row.source }}" placeholder="{{ row.source }}">
aria-label="{{ nav.tr_args("builder-rename-aria", [("name", row.source.clone())]) }}" placeholder="{{ row.source }}">
</li>
{% endfor %}
</ul>
@@ -389,7 +389,7 @@
#}
<button type="button" class="secondary" hx-post="/admin/tables/builder" hx-include="#table-form"
hx-target="#builder" hx-swap="innerHTML"
hx-vals='{"action": "apply-generated-names"}'>Apply names</button>
hx-vals='{"action": "apply-generated-names"}'>{{ nav.tr("builder-apply-names") }}</button>
</details>
</section>
{% endif %}
@@ -401,8 +401,8 @@
</section>
<section class="builder-section">
<h2>Row display columns</h2>
<p class="hint">What identifies a row to users, in the order chosen. Pick <code>id</code> to clear the list.</p>
<h2>{{ nav.tr("builder-row-display") }}</h2>
<p class="hint">{{ nav.tr("builder-row-display-hint")|safe }}</p>
<ul class="builder-list">
{% for candidate in page.row_display_candidates() %}
<li>
@@ -420,11 +420,11 @@
</section>
<section class="builder-section">
<h2>Table definition preview</h2>
<h2>{{ nav.tr("builder-preview") }}</h2>
<table class="builder-table preview">
<thead><tr><th></th><th>Column</th><th>Type</th><th>Options</th><th>Source</th></tr></thead>
<thead><tr><th></th><th>{{ nav.tr("builder-preview-th-column") }}</th><th>{{ nav.tr("builder-preview-th-type") }}</th><th>{{ nav.tr("builder-preview-th-options") }}</th><th>{{ nav.tr("builder-preview-th-source") }}</th></tr></thead>
<tbody>
{% for row in page.draft.preview_rows() %}
{% for row in page.draft.preview_rows(nav.locale) %}
<tr class="source-{{ row.source }}">
<td class="mark">{{ row.mark }}</td>
<td><code>{{ row.column }}</code></td>
@@ -438,6 +438,6 @@
</section>
<div class="form-actions">
<a href="/admin">Cancel</a>
<button type="submit">Create table</button>
<a href="/admin">{{ nav.tr("common-cancel") }}</a>
<button type="submit">{{ nav.tr("builder-create-table") }}</button>
</div>