Skip to content

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

NameDescription
FORMAT_VERSIONNo description.
LABEL_STATUSESNo description.

Functions

NameDescription
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.