<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="/transform"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
      xmlns:owl="http://www.w3.org/2002/07/owl#"
      xmlns:sh="http://www.w3.org/ns/shacl#"
      xmlns:dct="http://purl.org/dc/terms/"
      xmlns:bibo="http://purl.org/ontology/bibo/"
      xmlns:foaf="http://xmlns.com/foaf/0.1/"
      xmlns:oa="http://www.w3.org/ns/oa#"
      xmlns:skos="http://www.w3.org/2004/02/skos/core#"
      xmlns:ev="http://purl.org/NET/c4dm/event.owl#"
      xmlns:qb="http://purl.org/linked-data/cube#"
      xmlns:vann="http://purl.org/vocab/vann/"
      xmlns:xhv="http://www.w3.org/1999/xhtml/vocab#"
      xmlns:adms="http://www.w3.org/ns/adms#"
      xmlns:mliv="https://vocab.methodandstructure.com/mliv#"
      prefix="rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# rdfs: http://www.w3.org/2000/01/rdf-schema# xsd: http://www.w3.org/2001/XMLSchema# owl: http://www.w3.org/2002/07/owl# sh: http://www.w3.org/ns/shacl# dct: http://purl.org/dc/terms/ bibo: http://purl.org/ontology/bibo/ foaf: http://xmlns.com/foaf/0.1/ oa: http://www.w3.org/ns/oa# skos: http://www.w3.org/2004/02/skos/core# ev: http://purl.org/NET/c4dm/event.owl# qb: http://purl.org/linked-data/cube# vann: http://purl.org/vocab/vann/ xhv: http://www.w3.org/1999/xhtml/vocab# adms: http://www.w3.org/ns/adms# mliv: https://vocab.methodandstructure.com/mliv#"
      vocab="http://www.w3.org/1999/xhtml/vocab#" xml:lang="en">
  <head>
    <title about="#" property="dct:title">Message Localization Inventory Vocabulary</title>
    <base href="https://vocab.methodandstructure.com/mliv"/>
    <!--<link rel="bibo:status" href="http://purl.org/ontology/bibo/status/draft"/>-->
    <link rel="bibo:status" href="http://purl.org/ontology/bibo/status/published"/>
    <link rel="up top contents index" href="/"/>
    <meta name="description" about="#" property="dct:description rdfs:comment" content="MLIV provides an intermediate representation for collating localized messages, to better organize cross-platform software and digital media localization efforts."/>
  </head>
  <body about="" typeof="bibo:Specification">
    <div rel="foaf:primaryTopic" resource="#" typeof="owl:Ontology">
      <dl>
        <dt>Author</dt>
        <dd><a rel="dct:creator" href="https://doriantaylor.com/person/dorian-taylor#me"><span property="foaf:name">Dorian Taylor</span></a></dd>
        <dt>Version</dt>
        <dd property="owl:versionInfo" datatype="xsd:string">0.1</dd>
        <dt>Created</dt>
        <dd property="dct:created" datatype="xsd:date" content="2022-01-04">January 4, 2022</dd>
        <dt>Issued</dt>
        <dd property="dct:created" datatype="xsd:dateTime" content="2026-01-25T19:17:54Z">January 25, 2026</dd>
        <dt>Namespace <abbr>URI</abbr></dt>
        <dd>
          <p><a href="#">https://vocab.methodandstructure.com/mliv#</a></p>
        </dd>
        <dt>Preferred Namespace Prefix</dt>
        <dd><code about="#" property="vann:preferredNamespacePrefix" datatype="xsd:token">mliv</code></dd>
      </dl>
      <p>Many organizations produce software in multiple languages. Many organizations <em>also</em> release the <q>same</q> software product&#x2014;at least to a first approximation&#x2014;on more than one platform. While most modern software frameworks support <a rel="dct:references" href="https://en.wikipedia.org/wiki/Internationalization_and_localization">internationalization and localization</a> (<abbr>I18N</abbr>/<abbr>L10N</abbr>) out of the box, they seldom agree on a data format with which to represent the translated text.</p>
      <p>To enable word-for-word consistency in the messaging across platforms, as well as to reduce wasted effort translating messages which are both redundant and inconsistent, there is value in creating an intermediate representation for the message content that subsumes the underlying semantics of the individual concrete localization formats. The idea is to maintain a single authoritative repository of localized messages for the entire organization. From there it is possible to write small scripts to transform the intermediate format to the platform-specific ones. This vocabulary provides just such a representation.</p>
      <p>This vocabulary is a derivative of an unpublished one from several years prior. Its current scope is to identify individual messages and bundle together their translated equivalents, while attaching them to a context and target in a codebase.</p>
    </div>
    <section id="ch-classes" typeof="bibo:Chapter">
      <h2 property="dct:title">Classes</h2>
      <figure>
        <object data="mliv-classes.svg"><img src="mliv-classes" alt=""/></object>
        <figcaption>
          <p>Class inheritance diagram for <abbr>MLIV</abbr>.</p>
        </figcaption>
      </figure>
      <p>This vocabulary only needs a handful of classes: the <a href="#Message"><code>mliv:Message</code></a>, an <a href="#Context"><code>mliv:Context</code></a> to relate a set of messages to a location that may be common to more than one codebase, and a general-purpose <a href="#Collection"><code>mliv:Collection</code></a>. Everything else can be covered by other <abbr>RDF</abbr> vocabularies.</p>
      <figure>
        <pre><![CDATA[@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix dct:  <http://purl.org/dc/terms/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix mliv: <https://vocab.methodandstructure.com/mliv#> .

<tag:my.club,2026:l10n#login_signup_button_label> a mliv:Message ;
  mliv:target <https://github.com/random-person/project> ;
  mliv:context <tag:my.club,2026:l10n#signup_screen> ;
  dct:isReferencedBy <https://github.com/random-person/project/blob/de1027d6806d42584748f76733d55a9ca1c41f3a/src/signup.py#L137> ;
  dct:description "This is a general-purpose call to action to start a trial account."@en ;
  rdf:value "Start your 14-day free trial"@en,
    "Commencez votre abonnement gratuite de 14 jours"@fr .]]></pre>
        <figcaption>
          <p>This example depicts a localized message in English and French, with references back to the product, including the exact line of code where the message is referenced.</p>
        </figcaption>
      </figure>
      <section id="Collection" rel="dct:hasPart" resource="#Collection" typeof="owl:Class">
        <h3><code property="rdfs:label" datatype="xsd:token">Collection</code></h3>
        <p property="rdfs:comment">A <code>mliv:Collection</code> is an arbitrary bundle of <code>mliv:Message</code> entities.</p>
        <dl>
          <dt>Subclass of:</dt>
          <dd><a rel="rdfs:subClassOf" href="https://www.w3.org/TR/rdf-schema/#ch_container" resource="rdfs:Container"><code>rdfs:Container</code></a></dd>
          <dt>Properties</dt>
          <dd><a rev="rdfs:domain" href="#member"><code>mliv:member</code></a></dd>
        </dl>
        <p><a rel="rdfs:isDefinedBy" href="#">Back to Top</a></p>
      </section>
      <section id="Context" rel="dct:hasPart" resource="#Context" typeof="owl:Class">
        <h3><code property="rdfs:label" datatype="xsd:token">Context</code></h3>
        <p property="rdfs:comment">A <code>mliv:Context</code> extends <code>mliv:Collection</code> by representing a state in an application, such as a screen or page, that uses a set of <code>mliv:Message</code> entities.</p>
        <figure>
          <pre><![CDATA[<tag:my.club,2026:l10n#signup_screen> a mliv:Context ;
  dct:description "This what new users see when prompted to create an account."@en ;
  foaf:depiction <https://my.club.internal/assets/web/signup-screen.png> .
]]></pre>
          <figcaption>
            <p>This example depicts a <code>mliv:Context</code>, with a link to a screenshot showing where the message(s) are to be used.</p>
          </figcaption>
        </figure>
        <dl>
          <dt>Subclass of:</dt>
          <dd><a rel="rdfs:subClassOf" href="#Collection"><code>mliv:Collection</code></a></dd>
          <dt>Properties:</dt>
          <dd><a rev="rdfs:domain" href="#context-of"><code>mliv:context-of</code></a></dd>
          <dd><a about="#target" rel="rdfs:domain" resource="_:E6XcPs6YxnI24OHbsMcp8J" href="#target"><code>mliv:target</code></a></dd>
        </dl>
        <p><a rel="rdfs:isDefinedBy" href="#">Back to Top</a></p>
      </section>
      <section id="Message" about="#Message" typeof="owl:Class">
        <h3><code property="rdfs:label" datatype="xsd:token">Message</code></h3>
        <p property="rdfs:comment">The essence of the Message Localization Inventory Vocabulary is the <code>mliv:Message</code> itself.</p>
        <dl>
          <dt>Properties:</dt>
          <dd><a rev="rdfs:domain" href="#context"><code>mliv:context</code></a></dd>
          <dd><a about="#target" rel="rdfs:domain" resource="_:E6XcPs6YxnI24OHbsMcp8J" href="#target"><code>mliv:target</code></a></dd>
        </dl>
        <p><a rel="rdfs:isDefinedBy" href="#">Back to Top</a></p>
      </section>
    </section>
    <section id="ch-properties" typeof="bibo:Chapter">
      <h2 property="dct:title">Properties</h2>
      <figure>
        <object data="mliv-properties.svg"><img src="mliv-properties" alt=""/></object>
        <figcaption>
          <p>Property relation diagram for <abbr>MLIV</abbr>.</p>
        </figcaption>
      </figure>
      <p></p>
      <section id="context" about="#context" typeof="owl:ObjectProperty">
        <h3><code property="rdfs:label" datatype="xsd:token">context</code></h3>
        <p property="rdfs:comment">This property relates a <code>mliv:Message</code> to a <code>mliv:Context</code>.</p>
        <dl>
          <dt>Inverse of:</dt>
          <dd><a rel="owl:inverseOf" href="#context-of"><code>mliv:context-of</code></a></dd>
        </dl>
        <p><a rel="rdfs:isDefinedBy" href="#">Back to Top</a></p>
      </section>
      <section id="context-of" about="#context-of" typeof="owl:ObjectProperty">
        <h3><code property="rdfs:label" datatype="xsd:token">context-of</code></h3>
        <p property="rdfs:comment">This property relates a <code>mliv:Context</code> to a <code>mliv:Message</code>.</p>
        <dl>
          <dt>Sub-property of:</dt>
          <dd><a rel="rdfs:subPropertyOf" href="#member"><code>mliv:member</code></a></dd>
          <dt>Inverse of:</dt>
          <dd><a rel="owl:inverseOf" href="#context"><code>mliv:context</code></a></dd>
        </dl>
        <p><a rel="rdfs:isDefinedBy" href="#">Back to Top</a></p>
      </section>
      <section id="member" about="#member" typeof="owl:ObjectProperty">
        <h3><code property="rdfs:label" datatype="xsd:token">member</code></h3>
        <p property="rdfs:comment">This property relates a <code>mliv:Collection</code> to one or more <code>mliv:Message</code>s.</p>
        <dl>
          <dt>Sub-property of:</dt>
          <dd><a rel="rdfs:subPropertyOf" href="https://www.w3.org/TR/rdf-schema/#ch_member" resource="rdfs:member"><code>rdfs:member</code></a></dd>
        </dl>
        <p><a rel="rdfs:isDefinedBy" href="#">Back to Top</a></p>
      </section>
      <section id="target" about="#target" typeof="owl:ObjectProperty">
        <h3><code property="rdfs:label" datatype="xsd:token">target</code></h3>
        <p property="rdfs:comment">This property relates a <code>mliv:Message</code> or <code>mliv:Collection</code> to a target address, like a repository root on <span>GitHub</span>. We can subsequently use this relation to inform the generation of platform-specific resource files.</p>
        <dl>
          <dt>Domain</dt>
          <dd rel="rdfs:domain">
            <span about="_:E6XcPs6YxnI24OHbsMcp8J" rel="owl:unionOf" resource="_:E5cpplcgF6YZqWEAIb4nbK">
              <a rel="rdf:first" href="#Context"><code>mliv:Context</code></a> <span rel="rdf:rest" resource="_:ElZcWr7akoSjHlZzHRGO6K">&#x222a;</span> <a about="_:ElZcWr7akoSjHlZzHRGO6K" rel="rdf:first" href="#Message"><code>mliv:Message</code></a>
              <span about="_:ElZcWr7akoSjHlZzHRGO6K" rel="rdf:rest" resource="rdf:nil"/>
            </span>
          </dd>
        </dl>
        <p><a rel="rdfs:isDefinedBy" href="#">Back to Top</a></p>
      </section>
    </section>
    <section id="ch-references">
      <h2 property="dct:title">References</h2>
      <dl about="#">
        <dt>Imports:</dt>
        <dd rel="owl:imports" resource="dct:"><a rel="rdfs:seeAlso" href="https://www.dublincore.org/specifications/dublin-core/dcmi-terms/"><span property="dct:title">DCMI Metadata Terms</span></a></dd>
        <dd rel="owl:imports" resource="rdfs:"><a rel="rdfs:seeAlso" href="https://www.w3.org/TR/rdf11-schema/"><span property="dct:title">RDF Schema 1.1</span></a></dd>
        <!-- XXX what was this supposed to be for?
             <dd><a about="#" rel="owl:imports" resource="adms:" href="https://www.w3.org/TR/vocab-adms/">Asset Description Metadata Schema</a></dd>-->
        <dt>See Also:</dt>
        <dd><a rel="dct:references" href="https://en.wikipedia.org/wiki/Internationalization_and_localization">Internationalization and Localization &#x2014; Wikipedia</a></dd>
        <dd><a rel="dct:references" href="https://icu.unicode.org/">International Components for Unicode</a></dd>
      </dl>
      <!--<p>This document is copyright 2010-2025 <a rel="dct:creator" href="https://doriantaylor.com/person/dorian-taylor#me">Dorian Taylor</a>, available under a <a rel="license" href="http://creativecommons.org/licenses/by/2.5/ca/">Creative Commons Attribution 2.5 Canada</a> license, where <dfn>attribution</dfn> is defined as a link <a href="#">here</a>.</p>-->
      <p>This document is copyright 2022-2026 <a rel="dct:creator" href="https://doriantaylor.com/person/dorian-taylor#me">Dorian Taylor</a>, available under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0</a> license, where <dfn>attribution</dfn> is defined as a link <a href="#">here</a>.</p>
    </section>
  </body>
</html>
