[LyX/master] Add support for the following languages

Juergen Spitzmueller spitz at lyx.org
Sun Aug 25 11:26:39 UTC 2024


commit b625138be66ec5f76c3b9418a6a33c26bb313902
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Sun Aug 25 13:22:07 2024 +0200

    Add support for the following languages
    
    Polyglossia:
    Chinese (Simplified), Chinese (Traditional), Japanese, Kurdish (Sorani),
    Latin (Classic), Latin (Ecclesiastic), Latin (Medieval), N'ko, Odia,
    Punjabi, and Uyghur
    
    Babel:
    Amharic, Armenian, Asturian, Bengali, Church Slavonic, Coptic, Divehi,
    Kannada, Kazakh, Khmer, Kurdish (Sorani), Lao, Latin (Classic),
    Latin (Ecclesiastic), Latin (Medieval), Malayalam, Marathi, N'ko,
    Occitan, Odia, Punjabi, Russian (Petrine orthography), Sanskrit, Syriac,
    Tamil, Telugu, Tibetan, Urdu, and Uyghur
---
 development/FORMAT           |  11 ++
 lib/languages                | 272 +++++++++++++++++++++++--------------------
 lib/lyx2lyx/lyx2lyx_tools.py |  19 ++-
 lib/lyx2lyx/lyx_2_5.py       | 148 ++++++++++++++++++++++-
 src/tex2lyx/Preamble.cpp     |  83 ++++++-------
 src/version.h                |   4 +-
 6 files changed, 363 insertions(+), 174 deletions(-)

diff --git a/development/FORMAT b/development/FORMAT
index 79beb356c7..71caf03107 100644
--- a/development/FORMAT
+++ b/development/FORMAT
@@ -7,6 +7,17 @@ changes happened in particular if possible. A good example would be
 
 -----------------------
 
+2024-08-25 Jürgen Spitzmüller <spitz at lyx.org> 
+	* Format incremented to 630: Add support for a number of languages in
+	  babel and polyglossia:
+	  Polyglossia: Chinese (Simplified), Chinese (Traditional), Japanese, Kurdish (Sorani),
+          Latin (Classic), Latin (Ecclesiastic), Latin (Medieval), N'ko, Odia, Punjabi, and Uyghur
+          Babel: Amharic, Armenian, Asturian, Bengali, Church Slavonic, Coptic, Divehi,
+          Kannada, Kazakh, Khmer, Kurdish (Sorani), Lao, Latin (Classic), Latin (Ecclesiastic),
+          Latin (Medieval), Malayalam, Marathi, N'ko, Occitan, Odia, Punjabi,
+          Russian (Petrine orthography), Sanskrit, Syriac, Tamil, Telugu, Tibetan, Urdu,
+          and Uyghur
+
 2024-08-23 Jürgen Spitzmüller <spitz at lyx.org> 
 	* Format incremented to 629: Add support for language options
 	  New buffer params \language_options_babel and
diff --git a/lib/languages b/lib/languages
index e4feee3a6b..37bbf58645 100644
--- a/lib/languages
+++ b/lib/languages
@@ -211,12 +211,10 @@ Language american
 	LangCode         en_US
 End
 
-# not supported by babel
 Language amharic
 	GuiName          "Amharic"
-# TODO:
-#	BabelName        amharic
-#	BabelProvide     1
+	BabelName        amharic
+	BabelProvide     1
 	PolyglossiaName  amharic
 	Encoding         utf8
 	DateFormats      "dd MMMM yyyy|dd MMM yyyy|dd/MM/yyyy"
@@ -289,12 +287,10 @@ Language arabic_arabi
 	LangCode         ar_SA
 End
 
-# not supported by babel
 Language armenian
 	GuiName          "Armenian"
-# TODO:
-#	BabelName        armenian
-#	BabelProvide     1
+	BabelName        armenian
+	BabelProvide     1
 	PolyglossiaName  armenian
 	QuoteStyle       swiss
 	Encoding         utf8
@@ -302,12 +298,10 @@ Language armenian
 	LangCode         hy_AM
 End
 
-# not supported by babel
 Language asturian
 	GuiName          "Asturian"
-# TODO:
-#	BabelName        asturian
-#	BabelProvide     1
+	BabelName        asturian
+	BabelProvide     1
 	PolyglossiaName  asturian
 	QuoteStyle       french
 	Encoding         iso8859-15
@@ -434,9 +428,8 @@ End
 # supported by polyglossia but not babel:
 Language bengali
 	GuiName          "Bengali"
-# TODO:
-#	BabelName        bengali
-#	BabelProvide     1
+	BabelName        bengali
+	BabelProvide     1
  	PolyglossiaName  bengali
 	QuoteStyle       english
 	Encoding         utf8
@@ -554,9 +547,8 @@ End
 Language chinese-simplified
 	GuiName          "Chinese (simplified)"
 	HasGuiSupport    true
-# TODO
-#	PolyglossiaName  chinese
-#	PolyglossiaOpts  "variant=simplified"
+	PolyglossiaName  chinese
+	PolyglossiaOpts  "variant=simplified"
 	Encoding         euc-cn
 	QuoteStyle       english
 	WordWrap         false
@@ -569,9 +561,8 @@ End
 Language chinese-traditional
 	GuiName         "Chinese (traditional)"
 	HasGuiSupport    true
-# TODO
-#	PolyglossiaName  chinese
-#	PolyglossiaOpts  "variant=traditional"
+	PolyglossiaName  chinese
+	PolyglossiaOpts  "variant=traditional"
 	QuoteStyle       cjk
 	Encoding         utf8-cjk
 	WordWrap         false
@@ -580,12 +571,10 @@ Language chinese-traditional
 	Requires         CJK
 End
 
-# not supported by babel
 Language churchslavonic
 	GuiName         "Church Slavonic"
-# TODO:
-#	BabelName        churchslavic
-#	BabelProvide     1
+	BabelName        churchslavic
+	BabelProvide     1
  	PolyglossiaName  churchslavonic
 	QuoteStyle       swiss
 	Encoding         utf8
@@ -595,13 +584,11 @@ Language churchslavonic
 	Provides         textcyrillic
 End
 
-# not supported by babel
 # FIXME DateFormats
 Language coptic
 	GuiName          "Coptic"
-# TODO:
-#	BabelName        coptic
-#	BabelProvide     1
+	BabelName        coptic
+	BabelProvide     1
 	PolyglossiaName  coptic
 	Encoding         utf8
 	LangCode         cop_EG
@@ -650,9 +637,8 @@ End
 # babel only provides a "bare minimum locale"
 Language divehi
 	GuiName          "Divehi (Maldivian)"
-# TODO:
-#	BabelName        divehi
-#	BabelProvide     1
+	BabelName        divehi
+	BabelProvide     1
 	PolyglossiaName  divehi
 	Encoding         utf8
 	DateFormats      "yyyy MMMM dd|yyyy MMM dd|dd/MM/yyyy"
@@ -917,30 +903,16 @@ Language hebrew
 	LangCode         he_IL
 End
 
-# not supported by babel
 Language hindi
 	GuiName          "Hindi"
-# TODO:
-#	BabelName        hindi
-#	BabelProvide     1
+	BabelName        hindi
+	BabelProvide     1
 	PolyglossiaName  hindi
 	Encoding         utf8
 	DateFormats      "dd MMMM yyyy|dd MMM yyyy|dd-MM-yyyy"
 	LangCode         hi_IN
 End
 
-# Currently not supported (file format change!)
-# "hungarian" is a synonym for the "magyar" babel language option
-# "hungarian" might be used for special purposes,
-# see http://www.math.bme.hu/latex/magyar_pre_tug2004.pdf
-#Language hungarian
-#	GuiName         "Hungarian"
-#	BabelName       hungarian
-#	Encoding        iso8859-2
-#	LangCode        hu_HU
-#       QuoteStyle      polish
-#End
-
 # FontEncoding: OT1 misses ð and Þ
 Language icelandic
 	GuiName          "Icelandic"
@@ -1001,8 +973,7 @@ Language japanese
 	HasGuiSupport    true
 	BabelName        japanese
 	BabelOptFormat   \languageattribute{$lang$}{$opts$}
-# TODO
-#	PolyglossiaName  japanese
+	PolyglossiaName  japanese
 	Encoding         jis-platex
 	WordWrap         false
 	LangCode         ja_JP
@@ -1023,12 +994,10 @@ Language japanese-cjk
 	QuoteStyle      cjk
 End
 
-# not supported by babel
 Language kannada
 	GuiName          "Kannada"
-# TODO:
-#	BabelName        kannada
-#	BabelProvide     1
+	BabelName        kannada
+	BabelProvide     1
 	PolyglossiaName  kannada
 	Encoding         utf8
 	DateFormats      "dd MMMM yyyy|dd MMMM yyyy|dd-MM-yyyy"
@@ -1036,21 +1005,20 @@ Language kannada
 End
 
 # not yet supported by polyglossia
-# not supported by babel
 Language kazakh
 	GuiName          "Kazakh"
+	BabelName        kazakh
+	BabelProvide     1
 	Encoding         ascii
 	# FontEncoding   T2A # not set (no Babel support)
 	DateFormats      "dd MMMM yyyy|dd MMMM yyyy|yyyy-dd-MM"
 	LangCode         kk_KZ
 End
 
-# not supported by babel
 Language khmer
 	GuiName          "Khmer"
-# TODO:
-#	BabelName        khmer
-#	BabelProvide     1
+	BabelName        khmer
+	BabelProvide     1
 	PolyglossiaName  khmer
 	Encoding         utf8
 	DateFormats      "d MMMM yyyy|d MMMM yyyy|dd/MM/yyyy"
@@ -1091,14 +1059,25 @@ Language kurmanji
 	LangCode         kmr
 End
 
-# TODO: kurdish, variant=sorani
 
-# not supported by babel
+Language sorani
+	GuiName          "Kurdish (Sorani)"
+	BabelName        sorani
+	BabelProvide     1
+	PolyglossiaName  kurdish
+	PolyglossiaOpts  "variant=sorani"
+	XindyName        kurdish-bedirxan
+	Encoding         utf8
+	FontEncoding	 T1|OT1
+	DateFormats      "d. MMMM yyyy|d. M. yyyy|yyyy-MM-dd"
+	LangCode         ckb
+End
+
+
 Language lao
 	GuiName          "Lao"
-# TODO:
-#	BabelName        lao
-#	BabelProvide     1
+	BabelName        lao
+	BabelProvide     1
 	PolyglossiaName  lao
 	Encoding         utf8
 	DateFormats      "dd MMMM yyyy|dd MMMM yyyy|dd/MM/yyyy"
@@ -1109,7 +1088,7 @@ End
 # We therefore use the name of its hunspell dictionary.
 # FIXME DateFormats
 Language latin
-	GuiName          "Latin"
+	GuiName          "Latin (Modern)"
 	BabelName        latin
 	BabelOptFormat   modifier
 	PolyglossiaName  latin
@@ -1118,10 +1097,48 @@ Language latin
 	ActiveChars      ^=
 	Encoding         iso8859-15
 	FontEncoding	 T1|OT1
-	LangCode         la_LA
+	LangCode         la
+End
+
+Language latin-classic
+	GuiName          "Latin (Classic)"
+	BabelName        classiclatin
+	BabelOptFormat   modifier
+	PolyglossiaName  latin
+	PolyglossiaOpts  "variant=classic"
+	XindyName        latin
+	ActiveChars      ^=
+	Encoding         iso8859-15
+	FontEncoding	 T1|OT1
+	LangCode         la-x-classic
+End
+
+Language latin-ecclesiastic
+	GuiName          "Latin (Eccesiastic)"
+	BabelName        ecclesiasticlatin
+	BabelOptFormat   modifier
+	PolyglossiaName  latin
+	PolyglossiaOpts  "variant=ecclesiastic"
+	XindyName        latin
+	ActiveChars      ^=
+	Encoding         iso8859-15
+	FontEncoding	 T1|OT1
+	LangCode         la-x-ecclesia
+End
+
+Language latin-medieval
+	GuiName          "Latin (Medieval)"
+	BabelName        medievallatin
+	BabelOptFormat   modifier
+	PolyglossiaName  latin
+	PolyglossiaOpts  "variant=medieval"
+	XindyName        latin
+	ActiveChars      ^=
+	Encoding         iso8859-15
+	FontEncoding	 T1|OT1
+	LangCode         la-x-medieval
 End
 
-# TODO: support Latin varieties (classic, medieval, eccelesiastic)
 
 # latvian must be loaded locally with babel options,
 # not globally via class options
@@ -1213,12 +1230,10 @@ Language macedonian
 	Provides         textcyrillic
 End
 
-# not supported by babel
 Language malayalam
 	GuiName          "Malayalam"
-# TODO:
-#	BabelName        malayalam
-#	BabelProvide     1
+	BabelName        malayalam
+	BabelProvide     1
 	PolyglossiaName  malayalam
 	Encoding         utf8
 	QuoteStyle       english
@@ -1226,12 +1241,10 @@ Language malayalam
 	LangCode         ml_IN
 End
 
-# not supported by babel
 Language marathi
 	GuiName          "Marathi"
-# TODO:
-#	BabelName        marathi
-#	BabelProvide     1
+	BabelName        marathi
+	BabelProvide     1
 	PolyglossiaName  marathi
 	Encoding         utf8
 	DateFormats      "dd MMMM yyyy|d MMM yyyy|dd-MM-yyyy"
@@ -1265,23 +1278,18 @@ Language newzealand
 	LangCode         en_NZ
 End
 
-# TODO:
-# Language nko
-# 	GuiName		 "N’Ko"
-#	BabelName        nko
-#	BabelProvide     1
-# 	PolyglossiaName	 nko
-# 	QuoteStyle       swiss
-# 	Encoding         utf8
+Language nko
+ 	GuiName		 "N’Ko"
+	BabelName        nko
+	BabelProvide     1
+ 	PolyglossiaName	 nko
+ 	QuoteStyle       swiss
+ 	Encoding         utf8
 #       FIXME: DateFormats      "d MMMM، yyyy|dd/MM/yyyy|d/M/yyyy"
-#       gloss-nko.ldf says:
-#	In n'ko, this is an example of date :
-#	  ߂߀߁߃ ߞߏ߲ߞߏߜߍ ߕߟߋ߬ ߁߈ (RTL)
-#	  ( 18 February 2013 )
-#       The word "ߕߟߋ߬" is mandatory between month name and day number.
-# 	RTL              true
-# 	LangCode	 nqo
-# End
+#       see gloss-nko.ldf
+ 	RTL              true
+ 	LangCode	 nqo
+End
 
 Language norsk
 	GuiName          "Norwegian (Bokmaal)"
@@ -1311,11 +1319,9 @@ Language nynorsk
 	LangCode         nn_NO
 End
 
-# not supported by babel
 Language occitan
 	GuiName         "Occitan"
-# TODO
-#	BabelName	occitan
+	BabelName	occitan
 	PolyglossiaName occitan
 	QuoteStyle      french
 	Encoding        utf8
@@ -1323,20 +1329,29 @@ Language occitan
 	LangCode        oc_FR
 End
 
-# TODO: odia (polyglossia)
+Language odia
+ 	GuiName		 "Odia"
+	BabelName        odia
+	BabelProvide     1
+ 	PolyglossiaName	 odia
+ 	Encoding         utf8
+	DateFormats      "dd MMMM yyyy|d MMM yyyy|dd-MM-yyyy"
+ 	LangCode	 or
+End
 
 # Russian orthography from the Petrine orthographic reforms of
 # 1708 to the 1917 orthographic reform
 Language oldrussian
 	GuiName          "Russian (Petrine orthography)"
-# TODO
-#	BabelName	 russian
-#	BabelOpts	 ancient
-#	BabelOptFormat	 modifier
+	BabelName	 russian
+	BabelOpts	 ancient
+	BabelOptFormat	 modifier
 	PolyglossiaName  russian
 	PolyglossiaOpts  "spelling=old"
 	XindyName        russian
 	QuoteStyle       russian
+	Encoding         koi8-r
+	FontEncoding     T2A
 	LangCode         ru_petr1708
 End
 
@@ -1380,7 +1395,15 @@ Language portuguese
 	LangCode         pt_PT
 End
 
-# TODO: punjabi (polyglossia)
+Language punjabi
+	GuiName          "Punjabi"
+	BabelName        punjabi
+	BabelProvide     1
+	PolyglossiaName  punjabi
+	Encoding         utf8
+	DateFormats      "dd MMMM yyyy|dd MMMM yyyy|dd-MM-yyyy"
+	LangCode         pa
+End
 
 Language romanian
 	GuiName          "Romanian"
@@ -1434,13 +1457,11 @@ Language samin
 	LangCode         se_NO
 End
 
-# not supported by babel
 Language sanskrit
 	GuiName          "Sanskrit"
 	PolyglossiaName  sanskrit
-# TODO:
-#	BabelName        sanskrit
-#	BabelProvide     1
+	BabelName        sanskrit
+	BabelProvide     1
 	Encoding         utf8
 	DateFormats      "dd MMMM yyyy|d MMM yyyy|dd-MM-yyyy"
 	LangCode         sa_IN
@@ -1568,12 +1589,10 @@ Language swedish
 	LangCode         sv_SE
 End
 
-# not supported by babel
 Language syriac
 	GuiName          "Syriac"
-# TODO:
-#	BabelName        syriac
-#	BabelProvide     1
+	BabelName        syriac
+	BabelProvide     1
 	PolyglossiaName  syriac
 	Encoding         utf8
 	RTL              true
@@ -1581,24 +1600,20 @@ Language syriac
 	LangCode         syr_SY
 End
 
-# not supported by babel
 Language tamil
 	GuiName          "Tamil"
-# TODO:
-#	BabelName        tamil
-#	BabelProvide     1
+	BabelName        tamil
+	BabelProvide     1
 	PolyglossiaName  tamil
 	Encoding         utf8
 	DateFormats      "dd MMMM yyyy|d MMM yyyy|dd-MM-yyyy"
 	LangCode         ta_IN
 End
 
-# not supported by babel
 Language telugu
 	GuiName          "Telugu"
-# TODO:
-#	BabelName        telugu
-#	BabelProvide     1
+	BabelName        telugu
+	BabelProvide     1
 	PolyglossiaName  telugu
 	Encoding         utf8
 	DateFormats      "dd MMMM yyyy|d MMM yyyy|dd-MM-yyyy"
@@ -1649,13 +1664,11 @@ Language thai
 	EndPostBabelPreamble
 End
 
-# not supported by babel
 #FIXME DateFormats
 Language tibetan
 	GuiName          "Tibetan"
-# TODO:
-#	BabelName        tibetan
-#	BabelProvide     1
+	BabelName        tibetan
+	BabelProvide     1
 	PolyglossiaName  tibetan
 	Encoding         utf8
 	LangCode         bo_CN
@@ -1715,12 +1728,10 @@ Language uppersorbian
 	LangCode         hsb_DE
 End
 
-# not supported by babel
 Language urdu
 	GuiName          "Urdu"
-# TODO:
-#	BabelName        urdu
-#	BabelProvide     1
+	BabelName        urdu
+	BabelProvide     1
 	PolyglossiaName  urdu
 	Encoding         utf8
 	DateFormats      "d MMMM, yyyy|d MMM yyyy|dd/MM/yyyy"
@@ -1728,7 +1739,18 @@ Language urdu
 	LangCode         ur_PK
 End
 
-# TODO: uyghur (polyglossia)
+Language uyghur
+	GuiName          "Uyghur"
+	BabelName        uyghur
+	BabelProvide     1
+	PolyglossiaName  uyghur
+	Encoding         utf8
+	FontEncoding     LAE,LFE
+	DateFormats      "d MMMM yyyy-يىلى|d MMM yyyy-يىلى|yyyy/M/d"
+	RTL              true
+	LangCode         ug
+	QuoteStyle       english
+End
 
 Language vietnamese
 	GuiName          "Vietnamese"
diff --git a/lib/lyx2lyx/lyx2lyx_tools.py b/lib/lyx2lyx/lyx2lyx_tools.py
index 9b29b76747..2496ea7f99 100644
--- a/lib/lyx2lyx/lyx2lyx_tools.py
+++ b/lib/lyx2lyx/lyx2lyx_tools.py
@@ -666,7 +666,7 @@ singlepar_insets = [
 # print(singlepar_insets)
 
 
-def revert_language(document, lyxname, babelname="", polyglossianame=""):
+def revert_language(document, lyxname, babelname="", polyglossianame="", polyglossiaopts="", babelprovide=False):
     "Revert native language support"
 
     # Does the document use polyglossia?
@@ -791,15 +791,18 @@ def revert_language(document, lyxname, babelname="", polyglossianame=""):
             i -= 1
             continue
 
+
+        if polyglossiaopts != "":
+            polyglossiaopts = "[" + polyglossiaopts + "]"
         if singlepar:
             if with_polyglossia:
-                begin_cmd = "\\text%s{" % texname
+                begin_cmd = "\\text%s%s{" % (texname, polyglossiaopts)
             elif with_babel:
                 begin_cmd = "\\foreignlanguage{%s}{" % texname
             end_cmd = "}"
         else:
             if with_polyglossia:
-                begin_cmd = "\\begin{%s}" % texname
+                begin_cmd = "\\begin%s{%s}" % (polyglossiaopts, texname)
                 end_cmd = "\\end{%s}" % texname
             elif with_babel:
                 begin_cmd = "\\begin{otherlanguage}{%s}" % texname
@@ -822,6 +825,16 @@ def revert_language(document, lyxname, babelname="", polyglossianame=""):
     if with_babel:
         # add as global option
         insert_document_option(document, babelname)
+        # babelprovide
+        if babelprovide:
+           babelprovide = "\\babelprovide[import"
+           if primary:
+               babelprovide += ", main"
+           babelprovide += "]{%s}" % babelname
+           add_to_preamble(
+            document,
+            ["\\AddToHook{package/babel/after}{%s}" % babelprovide],
+           )
         # Since user options are appended to the document options,
         # Babel will treat `babelname` as primary language.
         if not primary:
diff --git a/lib/lyx2lyx/lyx_2_5.py b/lib/lyx2lyx/lyx_2_5.py
index 67d6519697..fa9641c5c9 100644
--- a/lib/lyx2lyx/lyx_2_5.py
+++ b/lib/lyx2lyx/lyx_2_5.py
@@ -23,19 +23,20 @@ import re
 #    convert_info_insets, get_ert, hex2ratio, insert_to_preamble,
 #    length_in_bp, lyx2verbatim,
 #    revert_flex_inset, revert_flex_inset, revert_font_attrs,
-#    revert_language, str2bool
+#    str2bool
 from lyx2lyx_tools import (
     add_to_preamble,
     latex_length,
     lyx2latex,
-    put_cmd_in_ert
+    put_cmd_in_ert,
+    revert_language
 )
 
 # Uncomment only what you need to import, please (parser_tools):
 #    check_token, count_pars_in_inset, del_complete_lines, 
 #    del_value, find_complete_lines, find_end_of, 
 #    find_re, find_token_backwards, find_token_exact,
-#    find_tokens, get_bool_value, 
+#    find_tokens,
 #    get_containing_layout, get_option_value,
 #    is_in_inset, set_bool_value
 from parser_tools import (
@@ -46,6 +47,7 @@ from parser_tools import (
     find_substring,
     find_token,
     get_containing_inset,
+    get_bool_value,
     get_quoted_value,
     get_value
 )
@@ -872,6 +874,142 @@ def revert_langopts(document):
         # remove header
         del document.header[i]
 
+
+def revert_new_polyglossia_languages(document):
+    """Emulate support for Simplified Chinese, Traditional Chinese, Japanese, Sorani Kurdish,
+       Classic, Ecclesiastic and Medieval Latin, N'ko, Odia, Punjabi, and Uyghur with polyglossia."""
+
+    # Does the document use polyglossia?
+    use_polyglossia = False
+    if get_bool_value(document.header, "\\use_non_tex_fonts"):
+        i = find_token(document.header, "\\language_package")
+        if i == -1:
+            document.warning("Malformed document! Missing \\language_package")
+        else:
+            pack = get_value(document.header, "\\language_package", i)
+            if pack in ("default", "auto"):
+                use_polyglossia = True
+
+    if not use_polyglossia:
+        return
+
+    #    lyxname:    (babelname, polyglossianame, polyglossiaopts)
+    new_languages = {
+        "chinese-simplified": ("", "chinese", "variant=simplified"),
+        "chinese-traditional": ("", "chinese", "variant=traditional"),
+        "japanese": ("", "japanese", ""),
+        "sorani": ("", "kurdish", "variant=sorani"),
+        "latin-classic": ("", "latin", "variant=classic"),
+        "latin-ecclesiastic": ("", "latin", "variant=ecclesiastic"),
+        "latin-medieval": ("", "latin", "variant=medieval"),
+        "nko": ("", "nko", ""),
+        "odia": ("", "odia", ""),
+        "punjabi": ("", "punjabi", ""),
+        "uyghur": ("", "uyghur", ""),
+    }
+    if document.language in new_languages:
+        used_languages = {document.language}
+    else:
+        used_languages = set()
+    i = 0
+    while True:
+        i = find_token(document.body, "\\lang", i + 1)
+        if i == -1:
+            break
+        val = get_value(document.body, "\\lang", i)
+        if val in new_languages:
+            used_languages.add(val)
+
+    for lang in used_languages:
+        revert_language(document, lang, *new_languages[lang])
+ 
+
+def revert_new_babel_languages(document):
+    """Emulate support for Amharic, Armenian, Asturian, Bengali, Church Slavonic,
+    Coptic, Divehi, Kannada, Kazakh, Khmer, Kurdish (Sorani), Lao, Latin (Classic),
+    Latin (Ecclesiastic), Latin (Medieval), Malayalam, Marathi, N'ko, Occitan, Odia,
+    Punjabi, Russian (Petrine orthography), Sanskrit, Syriac, Tamil, Telugu, Tibetan,
+    Urdu, and Uyghur with babel."""
+
+    # Does the document use polyglossia?
+    use_polyglossia = False
+    if get_bool_value(document.header, "\\use_non_tex_fonts"):
+        i = find_token(document.header, "\\language_package")
+        if i == -1:
+            document.warning("Malformed document! Missing \\language_package")
+        else:
+            pack = get_value(document.header, "\\language_package", i)
+            if pack in ("default", "auto"):
+                use_polyglossia = True
+
+    if use_polyglossia:
+        return
+
+    #    lyxname:    (babelname, polyglossianame, polyglossiaopts, babelprovide)
+    new_languages = {
+        "amharic": ("amharic", "", "", True),
+        "armenian": ("armenian", "", "", True),
+        "asturian": ("asturian", "", "", True),
+        "bengali": ("bengali", "", "", True),
+        "churchslavonic": ("churchslavic", "", "", True),
+        "coptic": ("coptic", "", "", True),
+        "divehi": ("divehi", "", "", True),
+        "hindi": ("hindi", "", "", True),
+        "kannada": ("kannada", "", "", True),
+        "kazakh": ("kazakh", "", "", True),
+        "khmer": ("khmer", "", "", True),
+        "lao": ("lao", "", "", True),
+        "latin-classic": ("classiclatin", "", "", False),
+        "latin-ecclesiastic": ("ecclesiasticlatin", "", "", False),
+        "latin-medieval": ("medievallatin", "", "", False),
+        "malayalam": ("malayalam", "", "", True),
+        "marathi": ("marathi", "", "", True),
+        "nko": ("nko", "", "", True),
+        "occitan": ("occitan", "", "", False),
+        "odia": ("odia", "", "", True),
+        "punjabi": ("punjabi", "", "", True),
+        "sanskrit": ("sanskrit", "", "", True),
+        "sorani": ("sorani", "", "", True),
+        "syriac": ("syriac", "", "", True),
+        "tamil": ("tamil", "", "", True),
+        "telugu": ("telugu", "", "", True),
+        "tibetan": ("tibetan", "", "", True),
+        "urdu": ("urdu", "", "", True),
+        "uyghur": ("uyghur", "", "", True),
+    }
+    if document.language in new_languages:
+        used_languages = {document.language}
+    else:
+        used_languages = set()
+    i = 0
+    while True:
+        i = find_token(document.body, "\\lang", i + 1)
+        if i == -1:
+            break
+        val = get_value(document.body, "\\lang", i)
+        if val in new_languages:
+            used_languages.add(val)
+
+    for lang in used_languages:
+        revert_language(document, lang, *new_languages[lang])
+
+    # revert oldrussian to russian
+    have_oldrussian = False
+    if document.language == "oldrussian":
+        document.language = "russian"
+        have_oldrussian = True
+
+    i = 0
+    while True:
+        i = find_token(document.body, "\\lang oldrussian", i + 1)
+        if i == -1:
+            break
+        have_oldrussian = True
+        document.body[i] = "\\lang russian"
+
+    if have_oldrussian:
+        add_to_preamble(document, ["\\AddToHook{package/babel/after}{\\languageattribute{russian}{ancient}}"])
+
 ##
 # Conversion hub
 #
@@ -886,11 +1024,13 @@ convert = [
     [626, []],
     [627, [convert_nomencl, convert_index_sc]],
     [628, []],
-    [629, []]
+    [629, []],
+    [630, []]
 ]
 
 
 revert = [
+    [629, [revert_new_polyglossia_languages, revert_new_babel_languages]],
     [628, [revert_langopts]],
     [627, [revert_nomentbl]],
     [626, [revert_nomencl, revert_index_sc]],
diff --git a/src/tex2lyx/Preamble.cpp b/src/tex2lyx/Preamble.cpp
index 05a80ef025..5f0043e042 100644
--- a/src/tex2lyx/Preamble.cpp
+++ b/src/tex2lyx/Preamble.cpp
@@ -50,19 +50,21 @@ namespace {
  * please keep this in sync with known_coded_languages line by line!
  */
 const char * const known_languages[] = {"acadian", "afrikaans", "albanian",
-"american", "ancientgreek", "arabic", "arabtex", "australian", "austrian", "azerbaijani", "bahasa", "bahasai",
-"bahasam", "basque", "belarusian", "bosnian", "brazil", "brazilian", "breton", "british",
-"bulgarian", "canadian", "canadien", "catalan", "croatian", "czech", "danish",
-"dutch", "english", "esperanto", "estonian", "farsi", "finnish", "francais",
-"french", "frenchb", "frenchle", "frenchpro", "friulan", "galician", "german", "germanb",
-"georgian", "greek", "hebrew", "hungarian", "icelandic", "indon", "indonesian",
-"interlingua", "irish", "italian", "japanese", "kazakh", "kurmanji", "latin",
-"latvian", "lithuanian", "lowersorbian", "lsorbian", "macedonian", "magyar", "malay", "meyalu",
-"mexican", "mongolian", "naustrian", "newzealand", "ngerman", "ngermanb", "norsk", "nswissgerman",
-"nynorsk", "piedmontese", "polutonikogreek", "polish", "portuges", "portuguese",
-"romanian", "romansh", "russian", "russianb", "samin", "scottish", "serbian", "serbian-latin",
-"slovak", "slovene", "spanish", "swedish", "swissgerman", "thai", "turkish", "turkmen",
-"ukraineb", "ukrainian", "uppersorbian", "UKenglish", "USenglish", "usorbian",
+"american", "amharic", "ancientgreek", "arabic", "arabtex", "armenian", "asturian",
+"australian", "austrian", "azerbaijani", "bahasa", "bahasai", "bahasam", "basque",
+"belarusian", "bengali", "bosnian", "brazil", "brazilian", "breton", "british",
+"bulgarian", "canadian", "canadien", "catalan", "churchslavic", "classiclatin", "coptic",
+"croatian", "czech", "danish", "divehi", "dutch", "ecclesiasticlatin", "english", "esperanto",
+"estonian", "farsi", "finnish", "francais", "french", "frenchb", "frenchle", "frenchpro", "friulan",
+"galician", "german", "germanb", "georgian", "greek", "hebrew", "hindi", "hungarian", "icelandic",
+"indon", "indonesian", "interlingua", "irish", "italian", "japanese", "kannada", "kazakh", "khmer",
+"kurmanji", "lao", "latin", "latvian", "lithuanian", "lowersorbian", "lsorbian", "macedonian", "magyar",
+"malay", "malayalam", "marathi", "medievallatin", "meyalu", "mexican", "mongolian", "naustrian", "newzealand",
+"ngerman", "ngermanb", "nko", "norsk", "nswissgerman", "nynorsk", "occitan", "odia", "piedmontese",
+"polutonikogreek", "polish", "portuges", "portuguese", "romanian", "romansh", "russian", "russianb",
+"samin", "scottish", "serbian", "serbian-latin", "punjabi", "sanskrit", "slovak", "slovene", "sorani",
+"spanish", "swedish", "swissgerman", "syriac", "tamil", "telugu", "thai", "tibetan", "turkish", "turkmen",
+"ukraineb", "ukrainian", "uppersorbian", "UKenglish", "urdu", "USenglish", "usorbian", "uyghur",
 "vietnam", "welsh",
 0};
 
@@ -71,19 +73,21 @@ const char * const known_languages[] = {"acadian", "afrikaans", "albanian",
  * please keep this in sync with known_languages line by line!
  */
 const char * const known_coded_languages[] = {"french", "afrikaans", "albanian",
-"american", "ancientgreek", "arabic_arabi", "arabic_arabtex", "australian", "austrian", "azerbaijani", "bahasa", "bahasa",
-"bahasam", "basque", "belarusian", "bosnian", "brazilian", "brazilian", "breton", "british",
-"bulgarian", "canadian", "canadien", "catalan", "croatian", "czech", "danish",
-"dutch", "english", "esperanto", "estonian", "farsi", "finnish", "french",
-"french", "french", "french", "french", "friulan", "galician", "german", "german",
-"georgian", "greek", "hebrew", "magyar", "icelandic", "bahasa", "bahasa",
-"interlingua", "irish", "italian", "japanese", "kazakh", "kurmanji", "latin",
-"latvian", "lithuanian", "lowersorbian", "lowersorbian", "macedonian", "magyar", "bahasam", "bahasam",
-"spanish-mexico", "mongolian", "naustrian", "newzealand", "ngerman", "ngerman", "norsk", "german-ch",
-"nynorsk", "piedmontese", "polutonikogreek", "polish", "portuguese", "portuguese",
-"romanian", "romansh", "russian", "russian", "samin", "scottish", "serbian", "serbian-latin",
-"slovak", "slovene", "spanish", "swedish", "german-ch-old", "thai", "turkish", "turkmen",
-"ukrainian", "ukrainian", "uppersorbian", "english", "english", "uppersorbian",
+"american", "amharic", "ancientgreek", "arabic_arabi", "arabic_arabtex", "armenian", "asturian",
+"australian", "austrian", "azerbaijani", "bahasa", "bahasa", "bahasam", "basque",
+"belarusian", "bengali", "bosnian", "brazilian", "brazilian", "breton", "british",
+"bulgarian", "canadian", "canadien", "catalan", "churchslavonic", "latin-classic", "coptic",
+"croatian", "czech", "danish", "divehi", "dutch", "latin-ecclesiastic", "english", "esperanto",
+"estonian", "farsi", "finnish", "french", "french", "french", "french", "french", "friulan",
+"galician", "german", "german", "georgian", "greek", "hebrew", "hindi", "magyar", "icelandic",
+"bahasa", "bahasa", "interlingua", "irish", "italian", "japanese", "kannada", "kazakh", "khmer",
+"kurmanji", "lao", "latin", "latvian", "lithuanian", "lowersorbian", "lowersorbian", "macedonian", "magyar",
+"bahasam", "malayalam", "marathi", "latin-medieval", "bahasam", "spanish-mexico", "mongolian", "naustrian", "newzealand",
+"ngerman", "ngerman", "nko", "norsk", "german-ch", "nynorsk", "occitan", "odia", "piedmontese",
+"polutonikogreek", "polish", "portuguese", "portuguese", "romanian", "romansh", "russian", "russian",
+"samin", "scottish", "serbian", "serbian-latin", "punjabi", "sanskrit", "slovak", "slovene", "sorani",
+"spanish", "swedish", "german-ch-old", "syriac", "tamil", "telugu", "thai", "tibetan", "turkish", "turkmen",
+"ukrainian", "ukrainian", "uppersorbian", "english", "urdu", "english", "uppersorbian", "uyghur",
 "vietnamese", "welsh",
 0};
 
@@ -326,17 +330,16 @@ string process_keyval_opt(vector<string> & options, string const & name)
 const char * const Preamble::polyglossia_languages[] = {
 "albanian", "american", "amharic", "ancient", "arabic", "armenian", "asturian", "australian",
 "bahasai", "bahasam", "basque", "bengali", "brazil", "brazilian", "breton", "british", "bulgarian",
-"catalan", "churchslavonic", "coptic", "croatian", "czech", "danish", "divehi", "dutch",
+"catalan", "chinese", "chinese", "churchslavonic", "coptic", "croatian", "czech", "danish", "divehi", "dutch",
 "english", "esperanto", "estonian", "farsi", "finnish", "french", "friulan",
 "galician", "greek", "monotonic", "hebrew", "hindi",
-"icelandic", "interlingua", "irish", "italian", "kannada", "khmer", "korean",
-"lao", "latin", "latvian", "lithuanian", "lsorbian", "magyar", "malayalam", "marathi",
-"austrian", "newzealand", "german", "norsk", "nynorsk", "occitan", "oldrussian",
-"piedmontese", "polish", "polytonic", "portuges", "romanian", "romansh", "russian",
+"icelandic", "interlingua", "irish", "italian", "japanese", "kannada", "khmer", "korean",
+"kurdish", "kurmanji", "lao", "latin", "latvian", "lithuanian", "lsorbian", "magyar", "malayalam", "marathi",
+"austrian", "newzealand", "german", "nko", "norsk", "nynorsk", "occitan", "odia", "oldrussian",
+"piedmontese", "polish", "polytonic", "portuguese", "punjabi", "romanian", "romansh", "russian",
 "samin", "sanskrit", "scottish", "serbian", "slovak", "slovenian", "spanish", "swedish", "syriac",
 "tamil", "telugu", "thai", "tibetan", "turkish", "turkmen",
-"ukrainian", "urdu", "usorbian", "vietnamese", "welsh", 0};
-// not yet supported by LyX: "korean", "nko"
+"ukrainian", "urdu", "usorbian", "uyghur", "vietnamese", "welsh", 0};
 
 /**
  * the same as polyglossia_languages with .lyx names
@@ -345,17 +348,17 @@ const char * const Preamble::polyglossia_languages[] = {
 const char * const Preamble::coded_polyglossia_languages[] = {
 "albanian", "american", "amharic", "ancientgreek", "arabic_arabi", "armenian", "asturian", "australian",
 "bahasa", "bahasam", "basque", "bengali", "brazilian", "brazilian", "breton", "british", "bulgarian",
-"catalan", "churchslavonic", "coptic", "croatian", "czech", "danish", "divehi", "dutch",
+"catalan", "chinese-simplified", "chinese-traditional", "churchslavonic", "coptic", "croatian", "czech",
+"danish", "divehi", "dutch",
 "english", "esperanto", "estonian", "farsi", "finnish", "french", "friulan",
 "galician", "greek", "greek", "hebrew", "hindi",
-"icelandic", "interlingua", "irish", "italian", "kannada", "khmer", "korean",
-"lao", "latin", "latvian", "lithuanian", "lowersorbian", "magyar", "malayalam", "marathi",
-"naustrian","newzealand", "ngerman", "norsk", "nynorsk", "occitan", "oldrussian",
-"piedmontese", "polish", "polutonikogreek", "portuges", "romanian", "romansh", "russian",
+"icelandic", "interlingua", "irish", "italian", "japanese", "kannada", "khmer", "korean",
+"sorani", "kurmanji", "lao", "latin", "latvian", "lithuanian", "lowersorbian", "magyar", "malayalam", "marathi",
+"naustrian","newzealand", "ngerman", "nko", "norsk", "nynorsk", "occitan", "odia", "oldrussian",
+"piedmontese", "polish", "polutonikogreek", "portuges", "punjabi", "romanian", "romansh", "russian",
 "samin", "sanskrit", "scottish", "serbian", "slovak", "slovene", "spanish", "swedish", "syriac",
 "tamil", "telugu", "thai", "tibetan", "turkish", "turkmen",
-"ukrainian", "urdu", "uppersorbian", "vietnamese", "welsh", 0};
-// not yet supported by LyX: "korean-polyglossia", "nko"
+"ukrainian", "urdu", "uppersorbian", "uyghur", "vietnamese", "welsh", 0};
 
 
 bool Preamble::usePolyglossia() const
diff --git a/src/version.h b/src/version.h
index 67ff1b79c6..1e18ff3816 100644
--- a/src/version.h
+++ b/src/version.h
@@ -32,8 +32,8 @@ extern char const * const lyx_version_info;
 
 // Do not remove the comment below, so we get merge conflict in
 // independent branches. Instead add your own.
-#define LYX_FORMAT_LYX 629 // spitz: language options
-#define LYX_FORMAT_TEX2LYX 629
+#define LYX_FORMAT_LYX 630 // spitz: language updates
+#define LYX_FORMAT_TEX2LYX 630
 
 #if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX
 #ifndef _MSC_VER


More information about the lyx-cvs mailing list