The project is in a healthy, maintained state
Yet Another Multilingual Markdown processor
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

~> 2.5
~> 5.0
~> 13.0

Runtime

 Project Readme

YAMultilingualMarkdown

YAMultilingualMarkdown is a utility to convert Yet Another Multilingual Markdown to HTML.

Yet Another Multilingual Markdown (format) is a Markdown dialect designed for hosting multilingual content. YAMultilingualMarkdown (tool) converts Yet Another Multilingual Markdown to HTML while extracting only the content in specified language(s).

Usage

Synopsis

ya_multilingual_markdown [OPTIONS] [FILE]

Options

Type ya_multilingual_markdown --help to show command line options.

Convert Yet Another Multilingual Markdown to HTML

Usage:
  ya_multilingual_markdown [OPTIONS] [FILE]

Options:
        --langs=LANG1,LANG2,...      Languages to be included in the output (default: ""; empty implies all)
        --lang-attr-name=STRING      Attribute name for language (default: "lang")
        --heading-lang-sep=STRING    Languages separator in headings (default: " / ")
        --output-type=auto|fragment|document
                                     Output type (default: "auto")
        --template-file=FILE         Document template file in eRuby format to embed contents
        --link-suffixes=FROM:TO,...  Link suffixes to rewrite (default: ".md:.html")
        --show-default-template      Show default document template
        --log-level=unknown|fatal|error|warn|info|debug
                                     Log level (default: warn)
        --help                       Show help message
        --version                    Show version number

Examples

Multilingual contents: headings, paragraphs, and other elements

A simple Yet Aonther Multilingual Markdown document looks like the following (snow_white.md):

# Schneeweißchen
{: lang="de"}

# Little Snow-white
{: lang="en"}

Es war einmal mitten im Winter,...
{: lang="de"}

Once upon a time in the middle of winter,...
{: lang="en"}

(You can use PHP Markdown Extra style extended syntax ({: name="value"}) to add attributes to block elements.)

Keep all languages

Without language-related options, the output will contain all languages.

ya_multilingual_markdown snow_white.md

Excerpt from the output:

<h1><span lang="de">Schneeweißchen</span> / <span lang="en">Little Snow-white</span></h1>

<p lang="de">Es war einmal mitten im Winter,...</p>

<p lang="en">Once upon a time in the middle of winter,...</p>

In a browser, above output may look like the following:

Schneeweißchen / Little Snow-white

Es war einmal mitten im Winter, ...

Once upon a time in the middle of winter, ...

Extract single language

With option --langs=en, the output will contain only the elements with lang whose value is set to en (and elements without lang attribute).

ya_multilingual_markdown --langs=en snow_white.md

Excerpt from the output:

<h1><span lang="en">Little Snow-white</span></h1>


<p lang="en">Once upon a time in the middle of winter, ...</p>

In a browser, above output may look like the following:

Little Snow-white

Once upon a time in the middle of winter, ...

Extract multiple languages

With option --langs=de,en, the output will contain elements with lang set to de or en (and elements without lang).

ya_multilingual_markdown --langs=de,en snow_white.md

Excerpt from the output:

<h1><span lang="de">Schneeweißchen</span> / <span lang="en">Little Snow-white</span></h1>

<p lang="de">Es war einmal mitten im Winter,...</p>

<p lang="en">Once upon a time in the middle of winter,...</p>

In a browser, the output may look like the following:

Schneeweißchen / Little Snow-white

Es war einmal mitten im Winter, ...

Once upon a time in the middle of winter, ...

Metadata in YAML front matter

Document metadata can be stored in the document using Jekyll-style YAML front matter.

A simple Yet Aonther Multilingual Markdown document with YAML front matter looks like the following (snow_white_with_metadata.md):

---
title: Little Snow-white
author:
  - Jacob Ludwig Karl Grimm
  - Wilhelm Carl Grimm
meta:
  - name: original title
    content: Schneeweißchen
    lang: de
  - name: translator
    content: Margaret Hunt
    lang: en
---
...

(The key author is a shortcut to <meta name="author" .../>.)

Let us include all languages in the output:

ya_multilingual_markdown snow_white_with_metadata.md

Excerpt from the output:

<title>Little Snow-white</title>
<meta name="author" content="Jacob Ludwig Karl Grimm" />
<meta name="author" content="Wilhelm Carl Grimm" />
<meta name="original title" content="Schneeweißchen" lang="de" />
<meta name="translator" content="Margaret Hunt" lang="en" />
<p>...</p>

You can filter metadata based on their languages.

Let us include en only (thus exclude de) in the output:

ya_multilingual_markdown --langs=en snow_white_with_metadata.md

Excerpt from the output:

<title>Little Snow-white</title>
<meta name="author" content="Jacob Ludwig Karl Grimm" />
<meta name="author" content="Wilhelm Carl Grimm" />
<meta name="translator" content="Margaret Hunt" lang="en" />
<p>...</p>

Output complete document

Use --output-type=document to print complete HTML document rather than HTML fragments.

Input:

---
title: Little Snow-white
---
Once upon a time in the middle of winter, ...

Command line:

ya_multilingual_markdown --output-type=document snow_white_with_title.md

Output:

<!DOCTYPE html>
<html>
  <head>
    <title>Little Snow-white</title>
  </head>
  <body>
    <p>Once upon a time in the middle of winter, ...</p>
  </body>
</html>

--output-type=auto will automatically choose document if the input inludes a front matter.

You can provide a custom template using --template-file=FILE. Templates must be in eRuby format. Use --show-default-template to see the built-in default template.

Installation

gem install ya_multilingual_markdown

or

git clone https://github.com/hisashim/ya_multilingual_markdown
cd ya_multilingual_markdown
rake install

Requirements

Runtime requirements:

Development requirements (in addition to runtime requirements):

Notes

Limitations and known problems

  • Only a small subset of kramdown's extended syntax is supported, although YAMultilingualMarkdown is built upon kramdown.

  • As for multilingual headings, ALD (Attribute List Definition) for each heading must be placed only after the heading.

    Supported:

    # Schneeweißchen
    {: lang="de"}
    
    # Little Snow-white
    {: lang="en"}
    

    Not supported:

    {: lang="de"}
    # Schneeweißchen
    
    {: lang="en"}
    # Little Snow-white
    

    This compromise allows us to write id at the beginning of headings as well as at the end, with less code.

    {: #title}
    # Schneeweißchen
    {: lang="de"}
    
    # Little Snow-white
    {: lang="en"}
    
    # Schneeweißchen
    {: lang="de"}
    
    # Little Snow-white
    {: lang="en"}
    {: #title}
    

Motivation

Yet Aonther Multilingual Markdown and its processor were born out of the need for a manuscript format for translated books.

Having a side-by-side version of the galley proof that includes both the original and translated texts helps translators review their work. Being able to search and edit manuscripts in a (sort of) side-by-side format is also useful.

While placing translated text in separate files from the original is a common and effective approach for localization/multilingualization projects, a format allowing multiple languages within a single file comes in handy for small projects. Yet Aonther Multilingual Markdown is an attempt to develop a proof of concept for such a format and a processing tool.

See also

License

This software is distributed under the terms of the MIT license.

Acknowledgments

Many thanks to:

  • Koichi Sasada, whose manuscript preprocessor inspired me to come up with a lightweight markup format that features multilingualization.

Contributors