Due to a bug in calibre the language metadata field in saved or converted mobi and epub files is overwritten with the current GUI language (see
https://bugs.launchpad.net/calibre/+bug/809771).
As the correct language is needed for dictionary lookups in the Kindle App, I created a hack which stores the language value in an identifier named 'language'.
This fixes the language field bug and also gives the user a way to control and change the value in the calibre GUI.
I'm rather sure that this patch depends on my previous patch found in
https://www.mobileread.com/forums/sho...58&postcount=1, so please apply both when you're interested in this patch.
The patch was created against calibre 0.8.8.
Ciao,
Steffen
Code:
diff --git a/src/calibre/ebooks/metadata/epub.py b/src/calibre/ebooks/metadata/epub.py
index 27fa94e..d46c160 100644
--- a/src/calibre/ebooks/metadata/epub.py
+++ b/src/calibre/ebooks/metadata/epub.py
@@ -186,6 +186,8 @@ def get_metadata(stream, extract_cover=True):
except:
import traceback
traceback.print_exc()
+ if mi.language is not None and not mi.has_identifier('language'):
+ mi.set_identifier('language', mi.language)
mi.timestamp = None
return mi
diff --git a/src/calibre/ebooks/metadata/mobi.py b/src/calibre/ebooks/metadata/mobi.py
index fe4950c..98a3d50 100644
--- a/src/calibre/ebooks/metadata/mobi.py
+++ b/src/calibre/ebooks/metadata/mobi.py
@@ -404,6 +404,8 @@ class MetadataUpdater(object):
if getattr(self, 'exth', None) is None:
raise MobiError('No existing EXTH record. Cannot update metadata.')
+ if mi.has_identifier('language'):
+ mi.language = mi.get_identifiers()['language']
if not mi.is_null('language'):
self.record0[92:96] = iana2mobi(mi.language)
self.create_exth(exth=exth, new_title=mi.title)
diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py
index 186821b..9dc1630 100644
--- a/src/calibre/ebooks/metadata/opf2.py
+++ b/src/calibre/ebooks/metadata/opf2.py
@@ -1044,7 +1044,10 @@ class OPF(object): # {{{
val = getattr(mi, attr, None)
if val is not None and val != [] and val != (None, None):
setattr(self, attr, val)
- lang = getattr(mi, 'language', None)
+ if mi.has_identifier('language'):
+ lang = mi.get_identifiers()['language']
+ else:
+ lang = getattr(mi, 'language', None)
if lang and lang != 'und':
self.language = lang
temp = self.to_book_metadata()
@@ -1281,7 +1284,10 @@ def metadata_to_opf(mi, as_string=True):
'[http://calibre-ebook.com]'
if not mi.language:
- mi.language = 'UND'
+ if mi.has_identifier('language'):
+ mi.language = mi.get_identifiers()['language']
+ else:
+ mi.language = 'UND'
root = etree.fromstring(textwrap.dedent(
'''
@@ -1331,7 +1337,11 @@ def metadata_to_opf(mi, as_string=True):
factory(DC('identifier'), val, scheme=icu_upper(key))
if mi.rights:
factory(DC('rights'), mi.rights)
- factory(DC('language'), mi.language if mi.language and mi.language.lower()
+ if mi.has_identifier('language'):
+ lang = mi.get_identifiers()['language']
+ else:
+ lang = mi.language
+ factory(DC('language'), lang if lang and lang.lower()
!= 'und' else get_lang().replace('_', '-'))
if mi.tags:
for tag in mi.tags:
diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py
index 1173b84..9c04009 100644
--- a/src/calibre/ebooks/mobi/reader.py
+++ b/src/calibre/ebooks/mobi/reader.py
@@ -1000,4 +1000,6 @@ def get_metadata(stream):
obuf = cStringIO.StringIO()
im.convert('RGB').save(obuf, format='JPEG')
mi.cover_data = ('jpg', obuf.getvalue())
+ if mi.language is not None and not mi.has_identifier('language'):
+ mi.set_identifier('language', mi.language)
return mi
diff --git a/src/calibre/ebooks/oeb/reader.py b/src/calibre/ebooks/oeb/reader.py
index 422252f..dc558df 100644
--- a/src/calibre/ebooks/oeb/reader.py
+++ b/src/calibre/ebooks/oeb/reader.py
@@ -131,7 +131,10 @@ class OEBReader(object):
stream = cStringIO.StringIO(etree.tostring(opf))
mi = OPF(stream).to_book_metadata()
if not mi.language:
- mi.language = get_lang().replace('_', '-')
+ if mi.has_identifier('language'):
+ mi.language = mi.get_identifiers()['language']
+ else:
+ mi.language = get_lang().replace('_', '-')
self.oeb.metadata.add('language', mi.language)
if not mi.book_producer:
mi.book_producer = '%(a)s (%(v)s) [http://%(a)s-ebook.com]'%\
diff --git a/src/calibre/ebooks/oeb/transforms/metadata.py b/src/calibre/ebooks/oeb/transforms/metadata.py
index 3980c21..a75ae5a 100644
--- a/src/calibre/ebooks/oeb/transforms/metadata.py
+++ b/src/calibre/ebooks/oeb/transforms/metadata.py
@@ -60,7 +60,14 @@ def meta_info_to_oeb_metadata(mi, m, log, override_input_metadata=False):
m.add('identifier', mi.isbn, scheme='ISBN')
elif override_input_metadata:
m.filter('identifier', lambda x: x.scheme.lower() == 'isbn')
- if not mi.is_null('language'):
+ has = False
+ for x in m.identifier:
+ if x.scheme.lower() == 'language':
+ m.clear('language')
+ m.add('language', x.content)
+ has = True
+ break
+ if not has and not mi.is_null('language'):
m.clear('language')
m.add('language', mi.language)
if not mi.is_null('series_index'):