diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml index 88c8aae04..5ac2cd4d3 100644 --- a/assets/resources/application/en.xml +++ b/assets/resources/application/en.xml @@ -64,6 +64,7 @@ + diff --git a/assets/resources/zlibrary/en.xml b/assets/resources/zlibrary/en.xml index 67daa221d..26ee86b78 100644 --- a/assets/resources/zlibrary/en.xml +++ b/assets/resources/zlibrary/en.xml @@ -70,6 +70,7 @@ + @@ -78,6 +79,7 @@ + diff --git a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java index e0e58ac71..942b51657 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java @@ -30,6 +30,7 @@ import android.widget.BaseAdapter; import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.network.ZLNetworkException; +import org.geometerplus.zlibrary.core.language.ZLLanguageUtil; import org.geometerplus.zlibrary.ui.android.R; @@ -38,7 +39,6 @@ import org.geometerplus.android.util.AndroidUtil; import org.geometerplus.fbreader.network.NetworkTree; import org.geometerplus.fbreader.network.NetworkLibrary; - public class NetworkLibraryActivity extends NetworkBaseActivity { private NetworkTree myTree; @@ -206,6 +206,7 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { private static final int MENU_SEARCH = 1; private static final int MENU_REFRESH = 2; private static final int MENU_ADD_CATALOG = 3; + private static final int MENU_LANGUAGES = 4; @Override public boolean onCreateOptionsMenu(Menu menu) { @@ -213,6 +214,7 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { addMenuItem(menu, MENU_SEARCH, "networkSearch", R.drawable.ic_menu_networksearch); addMenuItem(menu, MENU_ADD_CATALOG, "addCustomCatalog", android.R.drawable.ic_menu_add); addMenuItem(menu, MENU_REFRESH, "refreshCatalogsList", R.drawable.ic_menu_refresh); + addMenuItem(menu, MENU_LANGUAGES, "languages", 0); return true; } @@ -235,6 +237,11 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { case MENU_REFRESH: refreshCatalogsList(); return true; + case MENU_LANGUAGES: + for (String langCode : NetworkLibrary.Instance().languages()) { + System.err.println("Language: " + ZLLanguageUtil.languageName(langCode)); + } + return true; default: return true; } diff --git a/src/org/geometerplus/android/fbreader/preferences/BookInfoActivity.java b/src/org/geometerplus/android/fbreader/preferences/BookInfoActivity.java index 130775e12..1373d2bf3 100644 --- a/src/org/geometerplus/android/fbreader/preferences/BookInfoActivity.java +++ b/src/org/geometerplus/android/fbreader/preferences/BookInfoActivity.java @@ -25,7 +25,7 @@ import java.util.TreeMap; import android.content.Context; import org.geometerplus.zlibrary.core.resources.ZLResource; -import org.geometerplus.zlibrary.core.language.ZLLanguageList; +import org.geometerplus.zlibrary.core.language.ZLLanguageUtil; import org.geometerplus.zlibrary.text.hyphenation.ZLTextHyphenator; @@ -53,8 +53,8 @@ class LanguagePreference extends ZLStringListPreference { super(context, rootResource, resourceKey); myBook = book; final TreeMap map = new TreeMap(); - for (String code : ZLLanguageList.languageCodes()) { - map.put(ZLLanguageList.languageName(code), code); + for (String code : ZLLanguageUtil.languageCodes()) { + map.put(ZLLanguageUtil.languageName(code), code); } final int size = map.size(); String[] codes = new String[size + 1]; @@ -65,15 +65,15 @@ class LanguagePreference extends ZLStringListPreference { names[index] = entry.getKey(); ++index; } - codes[size] = "other"; - names[size] = ZLLanguageList.languageName(codes[size]); + codes[size] = ZLLanguageUtil.OTHER_LANGUAGE_CODE; + names[size] = ZLLanguageUtil.languageName(codes[size]); setLists(codes, names); String language = myBook.getLanguage(); if (language == null) { - language = "other"; + language = ZLLanguageUtil.OTHER_LANGUAGE_CODE; } if (!setInitialValue(language)) { - setInitialValue("other"); + setInitialValue(ZLLanguageUtil.OTHER_LANGUAGE_CODE); } } diff --git a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java index 7a0f50617..285366e2a 100644 --- a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java @@ -25,15 +25,13 @@ import java.util.TreeMap; import org.geometerplus.zlibrary.core.util.ZLMiscUtil; - public abstract class AbstractNetworkLink implements INetworkLink { - protected String mySiteName; protected String myTitle; protected String mySummary; protected String myIcon; - protected TreeMap myLinks; - + protected final String myLanguage; + protected final TreeMap myLinks; /** * Creates new NetworkLink instance. @@ -42,13 +40,15 @@ public abstract class AbstractNetworkLink implements INetworkLink { * @param title title of the corresponding library item. Must be not null. * @param summary description of the corresponding library item. Can be null. * @param icon string contains link's icon data/url. Can be null. + * @param language language of the catalog. If null we assume this catalog is multilanguage. * @param links map contains URLs with their identifiers; must always contain one URL with URL_MAIN identifier */ - public AbstractNetworkLink(String siteName, String title, String summary, String icon, Map links) { + public AbstractNetworkLink(String siteName, String title, String summary, String icon, String language, Map links) { mySiteName = siteName; myTitle = title; mySummary = summary; myIcon = icon; + myLanguage = language != null ? language : "multi"; myLinks = new TreeMap(links); } @@ -68,6 +68,10 @@ public abstract class AbstractNetworkLink implements INetworkLink { return myIcon; } + public String getLanguage() { + return myLanguage; + } + public String getLink(String urlKey) { return myLinks.get(urlKey); } diff --git a/src/org/geometerplus/fbreader/network/INetworkLink.java b/src/org/geometerplus/fbreader/network/INetworkLink.java index a48d81b08..5b093aada 100644 --- a/src/org/geometerplus/fbreader/network/INetworkLink.java +++ b/src/org/geometerplus/fbreader/network/INetworkLink.java @@ -41,6 +41,7 @@ public interface INetworkLink { String getSummary(); String getIcon(); String getLink(String urlKey); + String getLanguage(); Set getLinkKeys(); diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index 5626acc1a..24423402f 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -26,6 +26,7 @@ import org.geometerplus.zlibrary.core.options.ZLStringOption; import org.geometerplus.zlibrary.core.network.ZLNetworkManager; import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; +import org.geometerplus.zlibrary.core.language.ZLLanguageUtil; import org.geometerplus.fbreader.tree.FBTree; import org.geometerplus.fbreader.network.tree.*; @@ -43,14 +44,11 @@ public class NetworkLibrary { } private static class CompositeList extends AbstractSequentialList { - private final ArrayList> myLists; - private Comparator myComparator; + private final Comparator myComparator = new LinksComparator(); - public CompositeList(ArrayList> lists, - Comparator comparator) { + public CompositeList(ArrayList> lists) { myLists = lists; - myComparator = comparator; } private class Iterator implements ListIterator { @@ -195,7 +193,22 @@ public class NetworkLibrary { return title; } + private static int languageOrder(String language) { + if (language == ZLLanguageUtil.MULTI_LANGUAGE_CODE) { + return 1; + } + if (language.equals(Locale.getDefault().getLanguage())) { + return 0; + } + return 2; + } + public int compare(INetworkLink link1, INetworkLink link2) { + final int languageOrder1 = languageOrder(link1.getLanguage()); + final int languageOrder2 = languageOrder(link2.getLanguage()); + if (languageOrder1 != languageOrder2) { + return languageOrder1 - languageOrder2; + } final String title1 = filterLinkTitle(link1.getTitle()); final String title2 = filterLinkTitle(link2.getTitle()); return title1.compareToIgnoreCase(title2); @@ -224,7 +237,7 @@ public class NetworkLibrary { ArrayList> linksList = new ArrayList>(); linksList.add(myLoadedLinks); linksList.add(myCustomLinks); - myLinks = new CompositeList(linksList, new LinksComparator()); + myLinks = new CompositeList(linksList); } private boolean myIsAlreadyInitialized; @@ -477,9 +490,7 @@ public class NetworkLibrary { public void synchronize() { if (myUpdateChildren || myInvalidateChildren) { if (myInvalidateChildren) { - final LinksComparator cmp = new LinksComparator(); - //Collections.sort(myLoadedLinks, cmp); // this collection is always sorted - Collections.sort(myCustomLinks, cmp); + Collections.sort(myCustomLinks, new LinksComparator()); } myUpdateChildren = false; myInvalidateChildren = false; @@ -553,7 +564,8 @@ public class NetworkLibrary { synchronized (myLinks) { final int index = Collections.binarySearch(list, link, comparator); if (index >= 0) { - throw new RuntimeException("Unable to add link with duplicated title to the library"); + return; + //throw new RuntimeException("Unable to add link with duplicated title to the library"); } final int insertAt = -index - 1; list.add(insertAt, link); @@ -599,4 +611,12 @@ public class NetworkLibrary { } return false; } + + public List languages() { + final TreeSet languageSet = new TreeSet(); + for (INetworkLink link : myLoadedLinks) { + languageSet.add(link.getLanguage()); + } + return new ArrayList(languageSet); + } } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java index 8804dd03d..a20322b82 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java @@ -42,7 +42,7 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { private boolean myHasChanges; OPDSCustomLink(int id, String siteName, String title, String summary, String icon, Map links) { - super(siteName, title, summary, icon, links, false); + super(siteName, title, summary, icon, null, links, false); myId = id; } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java b/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java index 88bd9c4d0..87e3c626b 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java @@ -39,7 +39,7 @@ import org.geometerplus.fbreader.network.atom.ATOMUpdated; public class OPDSLinkReader { - static final String CATALOGS_URL = "http://data.fbreader.org/catalogs/generic-1.0.xml"; + static final String CATALOGS_URL = "http://data.fbreader.org/catalogs/generic-1.1.xml"; public static ICustomNetworkLink createCustomLink(int id, String siteName, String title, String summary, String icon, Map links) { if (siteName == null || title == null || links.get(INetworkLink.URL_MAIN) == null) { diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java b/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java index efa9436aa..b61a39919 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java @@ -93,6 +93,7 @@ class OPDSLinkXMLReader extends OPDSXMLReader { final String siteName = id.substring(ENTRY_ID_PREFIX.length()); final String title = entry.Title; final String summary = entry.Content; + final String language = entry.DCLanguage; String icon = null; final HashMap links = new HashMap(); @@ -151,14 +152,14 @@ class OPDSLinkXMLReader extends OPDSXMLReader { sslCertificate = null; } - INetworkLink result = link(siteName, title, summary, icon, links, urlConditions, sslCertificate); + INetworkLink result = link(siteName, title, summary, icon, language, links, urlConditions, sslCertificate); if (result != null) { myListener.onNewLink(result); } return false; } - private INetworkLink link(String siteName, String title, String summary, String icon, + private INetworkLink link(String siteName, String title, String summary, String icon, String language, Map links, HashMap urlConditions, String sslCertificate) { if (siteName == null || title == null || links.get(INetworkLink.URL_MAIN) == null) { return null; @@ -169,6 +170,7 @@ class OPDSLinkXMLReader extends OPDSXMLReader { title, summary, icon, + language, links, myHasStableIdentifiers ); diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java index d2cbbf467..8ef6285e7 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java @@ -49,9 +49,9 @@ class OPDSNetworkLink extends AbstractNetworkLink { private final boolean myHasStableIdentifiers; - OPDSNetworkLink(String siteName, String title, String summary, String icon, + OPDSNetworkLink(String siteName, String title, String summary, String icon, String language, Map links, boolean hasStableIdentifiers) { - super(siteName, title, summary, icon, links); + super(siteName, title, summary, icon, language, links); myHasStableIdentifiers = hasStableIdentifiers; } diff --git a/src/org/geometerplus/zlibrary/core/language/ZLLanguageDetector.java b/src/org/geometerplus/zlibrary/core/language/ZLLanguageDetector.java index 3d151b455..a452e64fe 100644 --- a/src/org/geometerplus/zlibrary/core/language/ZLLanguageDetector.java +++ b/src/org/geometerplus/zlibrary/core/language/ZLLanguageDetector.java @@ -64,7 +64,7 @@ public class ZLLanguageDetector { }; public ZLLanguageDetector() { - for (ZLFile file : ZLLanguageList.patternsFile().children()) { + for (ZLFile file : ZLLanguageUtil.patternsFile().children()) { final String name = file.getName(true); final int index = name.indexOf('_'); if (index != -1) { diff --git a/src/org/geometerplus/zlibrary/core/language/ZLLanguageList.java b/src/org/geometerplus/zlibrary/core/language/ZLLanguageUtil.java similarity index 88% rename from src/org/geometerplus/zlibrary/core/language/ZLLanguageList.java rename to src/org/geometerplus/zlibrary/core/language/ZLLanguageUtil.java index 9c39e9f45..b9611b102 100644 --- a/src/org/geometerplus/zlibrary/core/language/ZLLanguageList.java +++ b/src/org/geometerplus/zlibrary/core/language/ZLLanguageUtil.java @@ -24,10 +24,13 @@ import java.util.*; import org.geometerplus.zlibrary.core.filesystem.*; import org.geometerplus.zlibrary.core.resources.ZLResource; -public abstract class ZLLanguageList { +public abstract class ZLLanguageUtil { + public static final String OTHER_LANGUAGE_CODE = "other"; + public static final String MULTI_LANGUAGE_CODE = "multi"; + private static ArrayList ourLanguageCodes = new ArrayList(); - private ZLLanguageList() { + private ZLLanguageUtil() { } public static List languageCodes() { @@ -54,7 +57,7 @@ public abstract class ZLLanguageList { return ZLResource.resource("language").getResource(code).getValue(); } - public static ZLFile patternsFile() { + public static ZLFile patternsFile() { return ZLResourceFile.createResourceFile("languagePatterns"); } }