diff --git a/src/calibre/srv/cdb.py b/src/calibre/srv/cdb.py index 62d0ea328d..f940e3bd86 100644 --- a/src/calibre/srv/cdb.py +++ b/src/calibre/srv/cdb.py @@ -17,6 +17,7 @@ from calibre.srv.metadata import book_as_json from calibre.srv.routes import endpoint, json, msgpack_or_json from calibre.srv.utils import get_db, get_library_data from calibre.utils.imghdr import what +from calibre.utils.localization import canonicalize_lang, reverse_lang_map_for_ui from calibre.utils.serialize import MSGPACK_MIME, json_loads, msgpack_loads from calibre.utils.speedups import ReadOnlyFileBuffer from polyglot.binary import from_base64_bytes @@ -206,6 +207,11 @@ def cdb_set_fields(ctx, rd, book_id, library_id): dirtied.add(book_id) for field, value in iteritems(changes): + if field == 'languages' and value: + rmap = reverse_lang_map_for_ui() + def to_lang_code(x): + return rmap.get(x, canonicalize_lang(x)) + value = list(filter(None, map(to_lang_code, value))) dirtied |= db.set_field(field, {book_id: value}) ctx.notify_changes(db.backend.library_path, metadata(dirtied)) all_ids = dirtied if all_dirtied else (dirtied & loaded_book_ids) diff --git a/src/calibre/utils/localization.py b/src/calibre/utils/localization.py index e62b457fa5..75bb53936a 100644 --- a/src/calibre/utils/localization.py +++ b/src/calibre/utils/localization.py @@ -505,6 +505,13 @@ def lang_map_for_ui(): return ans +def reverse_lang_map_for_ui(): + ans = getattr(reverse_lang_map_for_ui, 'ans', None) + if ans is None: + ans = reverse_lang_map_for_ui.ans = {v: k for k, v in lang_map_for_ui().items()} + return ans + + def langnames_to_langcodes(names): ''' Given a list of localized language names return a mapping of the names to 3 diff --git a/src/pyj/book_list/edit_metadata.pyj b/src/pyj/book_list/edit_metadata.pyj index a1e182bf6c..f2ceb8ce78 100644 --- a/src/pyj/book_list/edit_metadata.pyj +++ b/src/pyj/book_list/edit_metadata.pyj @@ -367,7 +367,8 @@ def multiple_line_edit(list_to_ui, ui_to_list, container_id, book_id, field, fm, ) val = (resolved_metadata(mi, field) or v'[]') if field is 'languages': - val = [mi.lang_names[l] or l for l in val] + ln = mi.lang_names or {} + val = [ln[l] or l for l in val] if list_to_ui: val = val.join(list_to_ui) le.value = val