diff --git a/src/calibre/ebooks/mobi/debug/headers.py b/src/calibre/ebooks/mobi/debug/headers.py index 6aaafbffa3..5b80a46f1b 100644 --- a/src/calibre/ebooks/mobi/debug/headers.py +++ b/src/calibre/ebooks/mobi/debug/headers.py @@ -163,6 +163,7 @@ class EXTHRecord(object): 501 : 'cdetype', # 4 chars (PDOC or EBOK) 502 : 'lastupdatetime', 503 : 'updatedtitle', + 524 : 'language', }.get(self.type, repr(self.type)) if (self.name in {'coveroffset', 'thumboffset', 'hasfakecover', diff --git a/src/calibre/ebooks/mobi/reader/headers.py b/src/calibre/ebooks/mobi/reader/headers.py index 51da05ea83..bfbffe546e 100644 --- a/src/calibre/ebooks/mobi/reader/headers.py +++ b/src/calibre/ebooks/mobi/reader/headers.py @@ -13,6 +13,7 @@ from calibre.utils.date import parse_date from calibre.ebooks.mobi import MobiError from calibre.ebooks.metadata import MetaInformation, check_isbn from calibre.ebooks.mobi.langcodes import main_language, sub_language, mobi2iana +from calibre.utils.localization import canonicalize_lang NULL_INDEX = 0xffffffff @@ -68,6 +69,14 @@ class EXTHHeader(object): # {{{ title = content.decode(codec) except: pass + elif idx == 524: # Lang code + try: + lang = content.decode(codec) + lang = canonicalize_lang(lang) + if lang: + self.mi.language = lang + except: + pass #else: # print 'unknown record', idx, repr(content) if title: @@ -201,10 +210,11 @@ class BookHeader(object): self.exth = EXTHHeader(raw[16 + self.length:], self.codec, self.title) self.exth.mi.uid = self.unique_id - try: - self.exth.mi.language = mobi2iana(langid, sublangid) - except: - self.log.exception('Unknown language code') + if self.exth.mi.is_null('language'): + try: + self.exth.mi.language = mobi2iana(langid, sublangid) + except: + self.log.exception('Unknown language code') except: self.log.exception('Invalid EXTH header') self.exth_flag = 0 diff --git a/src/calibre/ebooks/mobi/writer8/exth.py b/src/calibre/ebooks/mobi/writer8/exth.py index daf6da62d6..72d1ce5a67 100644 --- a/src/calibre/ebooks/mobi/writer8/exth.py +++ b/src/calibre/ebooks/mobi/writer8/exth.py @@ -12,6 +12,7 @@ from struct import pack from io import BytesIO from calibre.ebooks.mobi.utils import utf8_text +from calibre.utils.localization import lang_as_iso639_1 EXTH_CODES = { 'creator': 100, @@ -35,6 +36,7 @@ EXTH_CODES = { 'hasfakecover': 203, 'lastupdatetime': 502, 'title': 503, + 'language': 524, } COLLAPSE_RE = re.compile(r'[ \t\r\n\v]+') @@ -68,6 +70,10 @@ def build_exth(metadata, prefer_author_sort=False, is_periodical=False, pass else: continue + if term == 'language': + d2 = lang_as_iso639_1(data) + if d2: + data = d2 data = utf8_text(data) exth.write(pack(b'>II', code, len(data) + 8)) exth.write(data)