Skip to content

OpenL10n and OpenI18n: what a file says in any language, and the languages a service speaks - #187

Merged
ralyodio merged 1 commit into
masterfrom
openl10n
Sep 13, 2026
Merged

ralyodio merged 1 commit into
masterfrom
openl10n

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

Anthony: "opentranslate or something", then "localization and internationalization: do an openl10n and openi18n".

Two specs, in the OpenFile shape (problem, terms, the record, rules that degrade, discovery, what is deliberately absent, related standards, version history):

  • OpenL10n (docs/openl10n.md): the record of what a file says, in any language. One transcript per media per language, addressed by the OpenFile sha256: id (or url: / live: for what has no bytes), lines as seconds into the media, translatedFrom on a translation, complete for a whole-media pass, languages listing every transcript the keeper has, translation made once on request with a 202 progress answer, SRT/VTT/text renderings, discovery through the OpenFile record's transcripts list and rel="openl10n", plus what a hearer and a keeper owe each other (detect the language, stamp media seconds, batch as you go, ask the keeper first) and the live-caption line shape.
  • OpenI18n (docs/openi18n.md): /.well-known/openi18n.json, the languages a service speaks with targets per language, default, how to ask for a language on any resource, the translate endpoint (POST {texts, from, to}{texts}, GET answers the languages), auth, limits, models per pair and the pivot. What is absent: quality scores, locales, string bundles.

Both registered in lib/specs.ts (OpenL10n under OpenFile). They describe what nixamp 0.24 and 0.25 serve today: /api/v1/transcripts/ID?language=, /hash/ID.srt, GET/POST /api/v1/translate. nixamp's own /.well-known/openi18n.json and a top-level transcripts on its OpenFile records are the follow-up on the nixamp side.

🤖 Generated with Claude Code

https://claude.ai/code/session_015KAKuRngFbQg3kET6RS5yN

… OpenFile

OpenL10n is the record of what a file says, in any language: one
transcript per media per language, addressed by the OpenFile id (or a
url: or live: identity for what has no bytes), lines as seconds into the
media, a translation kept beside the original and marked with what it
came from, complete or heard in pieces, made once on request with 202
progress, served as JSON, SRT, VTT or text.

OpenI18n is one file a service serves at /.well-known/openi18n.json
about the languages it speaks: which, which it can turn into which, how
to ask for one, and where texts are translated, with limits, models and
the pivot said out loud.

Both are what nixamp 0.24 and 0.25 serve today, written down so anything
that hears or translates can keep the same record.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015KAKuRngFbQg3kET6RS5yN
@ralyodio
ralyodio merged commit dfbf5a4 into master Sep 13, 2026
@github-actions

Copy link
Copy Markdown

ThreatCrush Security Scan

22 finding(s)

HIGH/CRITICAL: 3 | MEDIUM: 10 | LOW: 9

Severity Rule Location
HIGH secret-private-key plugins/credential-sharing/src/providers/ssh.ts:129
HIGH js-host-header-trust apps/commandboard-web/server.js:27
HIGH js-ssrf-outbound-request apps/pwa/public/sw.js:45
MEDIUM js-unescaped-html-sink apps/commandboard-web/src/main.ts:19
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/app/[[...slug]]/page.tsx:71
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/app/layout.tsx:88
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/app/pricing/page.tsx:46
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/components/breadcrumbs.tsx:43
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/components/site-shell.tsx:34
MEDIUM redos-nested-quantifier packages/opencontext/src/ids.ts:10
MEDIUM redos-nested-quantifier packages/opencontext/src/ids.ts:11
MEDIUM js-timing-unsafe-mac-compare packages/opencontext/src/validate.ts:208
MEDIUM redos-nested-quantifier packages/openontology/src/ids.ts:20
LOW secret-generic-credential apps/pwa/test/appbar.test.mjs:10
LOW secret-aws-access-key packages/opencontext/src/permissions.test.ts:260
LOW secret-private-key packages/opencontext/src/permissions.test.ts:261
LOW secret-stripe-key packages/opencontext/src/permissions.test.ts:262
LOW secret-aws-access-key packages/opencontext/src/security.test.ts:228
LOW secret-private-key plugins/credential-sharing/src/providers/ssh.test.ts:7
LOW secret-database-url plugins/credential-sharing/src/rekey.test.ts:33
LOW secret-openai-key plugins/credential-sharing/src/vault-encryption.test.ts:21
LOW secret-generic-credential plugins/credential-sharing/src/vault-encryption.test.ts:21

Snippets are redacted; ThreatCrush never prints matched credential material.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant