diff --git a/include/library.h b/include/library.h
index 856a3a9e..fa8f2426 100644
--- a/include/library.h
+++ b/include/library.h
@@ -106,7 +106,15 @@ class Filter {
Filter& rejectTags(const Tags& tags);
Filter& category(std::string category);
+
+ /**
+ * Set the filter to only accept books in the specified language.
+ *
+ * Multiple languages can be specified as a comma-separated list (in
+ * which case a book in any of those languages will match).
+ */
Filter& lang(std::string lang);
+
Filter& publisher(std::string publisher);
Filter& creator(std::string creator);
Filter& maxSize(size_t size);
diff --git a/src/library.cpp b/src/library.cpp
index 508d7c8e..fb9fc035 100644
--- a/src/library.cpp
+++ b/src/library.cpp
@@ -535,9 +535,20 @@ Xapian::Query categoryQuery(const std::string& category)
return Xapian::Query("XC" + normalizeText(category));
}
-Xapian::Query langQuery(const std::string& lang)
+Xapian::Query langQuery(const std::string& commaSeparatedLanguageList)
{
- return Xapian::Query("L" + normalizeText(lang));
+ Xapian::Query q;
+ bool firstIteration = true;
+ for ( const auto& lang : kiwix::split(commaSeparatedLanguageList, ",") ) {
+ const Xapian::Query singleLangQuery("L" + normalizeText(lang));
+ if ( firstIteration ) {
+ q = singleLangQuery;
+ firstIteration = false;
+ } else {
+ q = Xapian::Query(Xapian::Query::OP_OR, q, singleLangQuery);
+ }
+ }
+ return q;
}
Xapian::Query publisherQuery(const std::string& publisher)
diff --git a/test/library_server.cpp b/test/library_server.cpp
index e5e330d6..ee20b954 100644
--- a/test/library_server.cpp
+++ b/test/library_server.cpp
@@ -344,10 +344,12 @@ TEST_F(LibraryServerTest, catalog_search_by_language)
"