{
  "version": "https://jsonfeed.org/version/1",
  "title": "Marmite 0.4.0",
  "home_page_url": "https://marmite.blog",
  "feed_url": "https://marmite.blog/tag-documentacion.json",
  "description": "Static Site Generator <br> <small>for blogs</small> <br> <small>made with ❤️ and 🦀</small>",
  "items": [
    {
      "id": "https://marmite.blog/language-streams-contenido-multilingue.html",
      "url": "https://marmite.blog/language-streams-contenido-multilingue.html",
      "title": "Language Streams - Contenido Multilingue",
      "content_html": "<p>Marmite soporta sitios multilingues a traves de language streams. Cada idioma se convierte en una stream con su propia pagina de listado y feed RSS, mientras que las traducciones se vinculan automaticamente con navegacion &quot;Tambien disponible en&quot; y etiquetas hreflang para SEO.</p>\n<h2><a href=\"#como-funciona\" aria-hidden=\"true\" class=\"anchor\" id=\"como-funciona\"></a>Como Funciona</h2>\n<p>Los idiomas se detectan automaticamente a partir del contenido. Solo establece <code>language: xx</code> en el frontmatter o usa convenciones de nombres de subcarpetas, y marmite se encarga del resto - no se requiere configuracion.</p>\n<p>El campo <code>language</code> en <code>marmite.yaml</code> (valor predeterminado <code>en</code>) determina el idioma predeterminado del sitio. El contenido en el idioma predeterminado permanece en <code>index.html</code>. Los demas idiomas obtienen sus propias paginas de stream (<code>pt.html</code>, <code>es.html</code>) y feeds RSS (<code>pt.rss</code>, <code>es.rss</code>).</p>\n<h3><a href=\"#opcional-nombres-para-visualizacion\" aria-hidden=\"true\" class=\"anchor\" id=\"opcional-nombres-para-visualizacion\"></a>Opcional: Nombres para Visualizacion</h3>\n<p>Por defecto, las streams de idioma se etiquetan con su codigo de dos letras (por ejemplo, &quot;pt&quot;, &quot;es&quot;). Para establecer nombres legibles, agrega una seccion opcional <code>languages</code> en <code>marmite.yaml</code>:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-yaml\"><a-pr>language</a-pr><a-p>:</a-p> <a-s>en</a-s>\n<a-pr>languages</a-pr><a-p>:</a-p>\n  <a-pr>pt</a-pr><a-p>:</a-p>\n    <a-pr>display_name</a-pr><a-p>:</a-p> <a-s>&quot;Portugues&quot;</a-s>\n  <a-pr>es</a-pr><a-p>:</a-p>\n    <a-pr>display_name</a-pr><a-p>:</a-p> <a-s>&quot;Espanol&quot;</a-s></code></pre>\n<p>Esto sigue el mismo patron que <code>streams:</code> y <code>series:</code> - la configuracion es puramente estetica. Los sitios sin contenido en multiples idiomas no se ven afectados.</p>\n<h2><a href=\"#organizacion-del-contenido\" aria-hidden=\"true\" class=\"anchor\" id=\"organizacion-del-contenido\"></a>Organizacion del Contenido</h2>\n<p>Hay cuatro formas de organizar contenido multilingue. Todas producen salida HTML plana.</p>\n<h3><a href=\"#opcion-1-agrupacion-por-subcarpeta-auto-descubrimiento\" aria-hidden=\"true\" class=\"anchor\" id=\"opcion-1-agrupacion-por-subcarpeta-auto-descubrimiento\"></a>Opcion 1: Agrupacion por Subcarpeta (Auto-Descubrimiento)</h3>\n<p>Agrupa las traducciones en una subcarpeta con el nombre del slug del contenido base. Los archivos con prefijo de codigo de idioma ISO 639-1 se detectan y vinculan automaticamente:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner\">content/hello/\n  hello.md              # Idioma predeterminado (en)\n  pt-ola-mundo.md       # Traduccion al portugues\n  es-hola-mundo.md      # Traduccion al espanol\n</code></pre>\n<p>Esto genera:</p>\n<ul>\n<li><code>hello.html</code> - Post en ingles, listado en <code>index.html</code></li>\n<li><code>pt-ola-mundo.html</code> - Post en portugues, listado en <code>pt.html</code></li>\n<li><code>es-hola-mundo.html</code> - Post en espanol, listado en <code>es.html</code></li>\n</ul>\n<p>Las tres paginas muestran automaticamente enlaces &quot;Tambien disponible en&quot; hacia las otras.</p>\n<div class=\"markdown-alert markdown-alert-tip\">\n<p class=\"markdown-alert-title\">Tip</p>\n<p>La subcarpeta tambien puede tener la fecha, por ejemplo <code>content/2026-07-02-hello/</code>, asi no necesitas especificar la fecha en el frontmatter de cada traduccion.</p>\n</div>\n<h3><a href=\"#opcion-2-mixto-archivo-plano--subcarpeta\" aria-hidden=\"true\" class=\"anchor\" id=\"opcion-2-mixto-archivo-plano--subcarpeta\"></a>Opcion 2: Mixto Archivo Plano + Subcarpeta</h3>\n<p>Si tienes un sitio plano existente y quieres agregar traducciones sin mover los archivos originales, crea una subcarpeta que coincida con el slug del contenido existente:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner\">content/\n  hello.md              # Archivo plano existente, slug: hello\n  hello/\n    pt-ola.md           # Traduccion al portugues, vinculada automaticamente\n</code></pre>\n<p>Marmite detecta que el nombre de la subcarpeta <code>hello</code> coincide con el slug del archivo plano y los vincula como traducciones.</p>\n<div class=\"markdown-alert markdown-alert-important\">\n<p class=\"markdown-alert-title\">Important</p>\n<p>Los nombres de las subcarpetas deben coincidir con el slug del post original (no el nombre del archivo, sino el slug resuelto, a veces tomado del titulo) para ser vinculados automaticamente como traducciones.</p>\n</div>\n<h3><a href=\"#opcion-3-puntero-translates\" aria-hidden=\"true\" class=\"anchor\" id=\"opcion-3-puntero-translates\"></a>Opcion 3: Puntero Translates</h3>\n<p>Cada traduccion apunta al slug del contenido original usando el campo <code>translates</code>. Marmite construye la red completa de enlaces bidireccionales automaticamente:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-yaml\"><a-p>---</a-p>\n<a-pr>title</a-pr><a-p>:</a-p> <a-s>Hola Mundo</a-s>\n<a-pr>date</a-pr><a-p>:</a-p> <a-s>2024-01-01</a-s>\n<a-pr>language</a-pr><a-p>:</a-p> <a-s>es</a-s>\n<a-pr>translates</a-pr><a-p>:</a-p> <a-s>hello</a-s>\n<a-p>---</a-p></code></pre>\n<p>Esto es mas simple que mantener una lista <code>translations</code> en cada archivo. Solo establece <code>translates</code> en cada traduccion y marmite conecta todo. Cuando <code>language</code> se define con un valor diferente al idioma predeterminado del sitio, marmite automaticamente coloca el contenido en la stream del idioma correspondiente.</p>\n<h3><a href=\"#opcion-4-enlace-de-traduccion-via-frontmatter\" aria-hidden=\"true\" class=\"anchor\" id=\"opcion-4-enlace-de-traduccion-via-frontmatter\"></a>Opcion 4: Enlace de Traduccion via Frontmatter</h3>\n<p>Define el idioma y las traducciones explicitamente en el frontmatter:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-yaml\"><a-p>---</a-p>\n<a-pr>title</a-pr><a-p>:</a-p> <a-s>Hello World</a-s>\n<a-pr>date</a-pr><a-p>:</a-p> <a-s>2024-01-01</a-s>\n<a-pr>language</a-pr><a-p>:</a-p> <a-s>en</a-s> <a-c># se puede omitir porque es el idioma predeterminado</a-c>\n<a-pr>translations</a-pr><a-p>:</a-p>\n  <a-p>-</a-p> <a-s>pt-ola</a-s>  <a-c># luego escribes un post con slug `ola` y language: pt</a-c>\n  <a-p>-</a-p> <a-s>es-hola</a-s>\n<a-p>---</a-p></code></pre>\n<p>El campo <code>translations</code> acepta una lista de slugs. Marmite resuelve cada slug al contenido real, completa el codigo de idioma y el nombre de visualizacion, y crea enlaces bidireccionales. Si el post A lista al post B como traduccion, el post B automaticamente recibe un enlace de vuelta al post A.</p>\n<div class=\"markdown-alert markdown-alert-important\">\n<p class=\"markdown-alert-title\">Important</p>\n<p>Prefiere las opciones 1 y 2 para auto-descubrimiento. Las opciones 3 y 4 requieren frontmatter explicito pero te dan mas control sobre la vinculacion.</p>\n</div>\n<h2><a href=\"#campos-de-frontmatter\" aria-hidden=\"true\" class=\"anchor\" id=\"campos-de-frontmatter\"></a>Campos de Frontmatter</h2>\n<h3><a href=\"#language\" aria-hidden=\"true\" class=\"anchor\" id=\"language\"></a><code>language</code></h3>\n<p>Define explicitamente el codigo de idioma del contenido:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-yaml\"><a-pr>language</a-pr><a-p>:</a-p> <a-s>es</a-s></code></pre>\n<p>Normalmente no es necesario con la deteccion por subcarpeta (Opciones 1 y 2) - el idioma se infiere automaticamente. Usalo para las Opciones 3 y 4.</p>\n<p>Cuando <code>language</code> se define con un valor diferente al idioma predeterminado del sitio y no se establece una <code>stream</code> explicita, marmite automaticamente usa el idioma como stream, es decir, este post se publicara en la stream es.html.</p>\n<h3><a href=\"#translates\" aria-hidden=\"true\" class=\"anchor\" id=\"translates\"></a><code>translates</code></h3>\n<p>Apunta una traduccion al slug del contenido original:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-yaml\"><a-pr>translates</a-pr><a-p>:</a-p> <a-s>hello</a-s></code></pre>\n<p>Marmite crea enlaces bidireccionales entre el contenido original y todas sus traducciones. No es necesario con auto-descubrimiento por subcarpeta. Ver Opcion 3 arriba para mas detalles.</p>\n<h3><a href=\"#translations\" aria-hidden=\"true\" class=\"anchor\" id=\"translations\"></a><code>translations</code></h3>\n<p>Vincula manualmente a traducciones por slug:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-yaml\"><a-pr>translations</a-pr><a-p>:</a-p>\n  <a-p>-</a-p> <a-s>en-hello-world</a-s>\n  <a-p>-</a-p> <a-s>pt-ola-mundo</a-s></code></pre>\n<p>No es necesario al usar auto-descubrimiento por subcarpeta (Opciones 1 y 2) o <code>translates:</code> (Opcion 3), ya que las traducciones se vinculan automaticamente.</p>\n<h2><a href=\"#notas-de-compatibilidad\" aria-hidden=\"true\" class=\"anchor\" id=\"notas-de-compatibilidad\"></a>Notas de Compatibilidad</h2>\n<ul>\n<li>El contenido del idioma predeterminado usa la stream <code>index</code> y aparece en la pagina principal <code>index.html</code></li>\n<li>Los idiomas se auto-detectan a partir de todo el contenido observado - no se requiere configuracion</li>\n<li>La deteccion de idioma por prefijo de nombre de archivo solo funciona dentro de subcarpetas, nunca para archivos planos en la raiz del contenido (previniendo falsos positivos como <code>essential-guide.md</code> siendo detectado como idioma <code>es</code>)</li>\n<li>Los punteros <code>translates:</code> se procesan despues de la recoleccion de contenido para construir enlaces bidireccionales</li>\n<li>Un post puede tener tanto una <code>series</code> como una language stream - funcionan independientemente</li>\n<li>Las colisiones de slug entre idiomas se evitan con el prefijo de stream en los slugs (<code>en-hello</code> vs <code>es-hola</code>)</li>\n<li>Las paginas (contenido sin fechas) pueden tener <code>language</code> y <code>translations</code> para visualizacion en plantillas, pero no aparecen en paginas de listado de stream</li>\n</ul>\n<blockquote>\n<p>Please consider giving a ☆ on Marmite <a href=\"https://github.com/rochacbruno/marmite\">Github</a> repository, that helps a lot!</p>\n</blockquote>\n<!-- Contents from _markdown_footer.md are appended to every content -->\n<!-- _references.md is a file to gather all references together \nthis file is appended to every raw markdown.\n-->\n",
      "summary": "\"Escribe contenido en multiples idiomas con enlaces de traduccion automaticos, paginas de stream por idioma y etiquetas hreflang para SEO usando la funcion de language streams de marmite.\"",
      "date_published": "2026-07-02T00:00:00-00:00",
      "image": "media/language-streams/banner.jpg",
      "authors": [
        {
          "name": "Bruno Rocha",
          "url": "https://go.rocha.social/@bruno",
          "avatar": "https://github.com/rochacbruno.png"
        }
      ],
      "tags": [
        "documentacion"
      ],
      "language": "en"
    }
  ]
}