lawref.i18n
Оверлеи меток §218: переводы объявлений ВНЕ CLIR (DECISION-0070).
Пакет корпуса несёт в исходнике .law язык источника и рабочий перевод —
они часть акта формализации и живут в CLIR как метки §218. Дополнительные
языки отображения в CLIR не вкомпилируются вовсе: файл i18n/<lang>.json
рядом с law.toml — презентационный слой, который читают вербализатор
(lawref verbalize --labels …), MCP и рабочий стол, но НЕ lowering.
Доктринальное основание — §218/E-0010: метки вне preimage §209, «смена
отображаемого языка не меняет IDs и semantics». Оверлей реализует это ПО
ПОСТРОЕНИЮ: канонические байты CLIR, check_lower и differential его не
видят, потому что документ с влитыми метками существует только в памяти
консьюмера. Обратная сторона той же монеты — оверлей адресует узлы по id,
и ссылка может протухнуть молча; поэтому висячий ключ здесь — ГРОМКИЙ отказ
(apply_overlays перечисляет все), а корпусные файлы держат ворота
verify/ci/gates/coverage/check_i18n_overlays.py с канарейкой.
Формат файла (полный, других ключей нет):
{ "formatVersion": "law.i18n/0.1", "package": "de.kafka.vor_dem_gesetz", // имя пакета [§10](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/04-part-iv-project-and-files.ru.md#10-lawtoml) — сверяется "language": "en", // один язык на файл "labels": { "Eingang": [{"status": "translation", "text": "entrance to the law"}] }}Ключи labels — локальные имена узлов (фрагмент id после #, включая
процедурные вида Zutritt/initial); язык у записей не пишется — он один на
файл и подставляется отсюда. status — словарь §218 (official | unofficial |
translation); у перевода по смыслу translation. Морфология grammaticalForms
допустима, но словарь слотов §218.1 закрыт по семействам языков — для языков
вне ru/kk/en он пуст, и формы там писать некуда.
Анонимные узлы (assert-N) нумеруются позиционно — их переезд перенумеровывает
id; оверлею на такие узлы ссылаться МОЖНО, но хрупкость по датам/порядку
оплачивает автор: ворота назовут висячий ключ первым же прогоном.
Attributes
| Name | Description |
|---|---|
FORMAT_VERSION | No description. |
LABEL_STATUSES | No description. |
Functions
| Name | Description |
|---|---|
apply_overlays | Влить метки оверлеев в КОПИЮ документа (сам документ не трогается). |
content_hash | Пин байтов оверлея для law.lock — sha256 канонических байтов §208 |
dangling_keys | Ключи оверлея, не находящие узла в документе (отсортированы). |
discover_overlays | Файлы оверлеев пакета: i18n/*.json рядом с law.toml, детерминированно |
load_overlay | Прочитать и проверить файл оверлея; на дефекте — ValueError со ВСЕМИ |
overlay_labels | Материализованные метки §218: язык файла подставлен в каждую запись. |
validate_overlay | Список дефектов формы (пустой — файл корректен). Ссылки на узлы НЕ |
FORMAT_VERSIONattributemodule attribute#
FORMAT_VERSION = 'law.i18n/0.1'LABEL_STATUSESattributemodule attribute#
LABEL_STATUSES = ('official', 'unofficial', 'translation')apply_overlaysfunction#
def apply_overlays(document: dict, overlays: list[dict]) -> dictВлить метки оверлеев в КОПИЮ документа (сам документ не трогается).
Громкие отказы: дефект формы, чужой пакет, висячие ключи (перечисляются
все и по всем оверлеям разом — чинить пачкой дешевле, чем по одному).
Слитый список меток пересортирован ключом lowering-а (language, status,
text), чтобы выбор verbalize.label_of работал на нём без оговорок;
точный дубль существующей метки не добавляется — повторное применение
идемпотентно.
content_hashfunction#
def content_hash(overlay: dict) -> strПин байтов оверлея для law.lock — sha256 канонических байтов §208
(та же форма digest-а, что у A3-ресурсов: sha256:<hex>).
dangling_keysfunction#
def dangling_keys(document: dict, overlay: dict) -> list[str]Ключи оверлея, не находящие узла в документе (отсортированы).
discover_overlaysfunction#
def discover_overlays(package_dir: Path) -> list[Path]Файлы оверлеев пакета: i18n/*.json рядом с law.toml, детерминированно
отсортированные. Каталога нет — пустой список, это не дефект: перевод
опционален, в отличие от метки §218 в самом акте.
load_overlayfunction#
def load_overlay(path: Path) -> dictПрочитать и проверить файл оверлея; на дефекте — ValueError со ВСЕМИ
находками разом. Имя файла в каталоге i18n/ обязано совпадать с языком:
i18n/en.json с "language": "de" внутри — это две таблички на одной
двери, и ложь одной из них молчалива ровно до первого читателя.
overlay_labelsfunction#
def overlay_labels(overlay: dict) -> dict[str, list[dict]]Материализованные метки §218: язык файла подставлен в каждую запись.
validate_overlayfunction#
def validate_overlay(overlay: object, *, origin: str = 'оверлей') -> list[str]Список дефектов формы (пустой — файл корректен). Ссылки на узлы НЕ
проверяются: для этого нужен документ — см. dangling_keys.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.