diff --git a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java index 1a0a915bc..0b6d1831c 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java @@ -223,9 +223,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { final String twoFactorCode = Objects.requireNonNull(binding.loginTwoFactor.getText()).toString(); showLoggingProgressBar(); - String fullCode = Locale.getDefault().getLanguage(); - String mainCode = fullCode.contains(",") ? fullCode.substring(0, fullCode.indexOf(',')).trim() : fullCode; - loginClient.doLogin(username, password, twoFactorCode, mainCode, + loginClient.doLogin(username, password, twoFactorCode, Locale.getDefault().getLanguage(), new LoginCallback() { @Override public void success(@NonNull LoginResult loginResult) { diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java index 4e9aa2a67..54d3e9681 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java @@ -490,7 +490,7 @@ public class MainActivity extends BaseActivity Activity.MODE_PRIVATE); final String language = preferences.getString("language", ""); final SettingsFragment settingsFragment = new SettingsFragment(); - settingsFragment.setLocale(this, language, true); + settingsFragment.setLocale(this, language); } public NavTabLayout.OnNavigationItemSelectedListener getNavListener() { diff --git a/app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.java b/app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.java index a49a65340..6aef8d323 100644 --- a/app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.java +++ b/app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.java @@ -345,8 +345,6 @@ public class NetworkingModule { @Singleton @Named(NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE) public WikiSite provideLanguageWikipediaSite() { - String fullCode = Locale.getDefault().getLanguage(); - String mainCode = fullCode.contains(",") ? fullCode.substring(0, fullCode.indexOf(',')).trim() : fullCode; - return WikiSite.forLanguageCode(mainCode); + return WikiSite.forLanguageCode(Locale.getDefault().getLanguage()); } } diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index 52dec9ae1..384e7f1a9 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -1367,10 +1367,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements } private String chooseDescription(Media media) { - String fullCode = Locale.getDefault().getLanguage(); - String mainCode = fullCode.contains(",") ? fullCode.substring(0, fullCode.indexOf(',')).trim() : fullCode; final Map descriptions = media.getDescriptions(); - final String multilingualDesc = descriptions.get(mainCode); + final String multilingualDesc = descriptions.get(Locale.getDefault().getLanguage()); if (multilingualDesc != null) { return multilingualDesc; } diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/OkHttpJsonApiClient.java b/app/src/main/java/fr/free/nrw/commons/mwapi/OkHttpJsonApiClient.java index b1563cef8..dd041d8bc 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/OkHttpJsonApiClient.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/OkHttpJsonApiClient.java @@ -409,15 +409,55 @@ public class OkHttpJsonApiClient { */ @Nullable public List getPlaces( - final List placeList, final String language) throws IOException { + final List placeList, final String language, final String secondaryLanguages) throws IOException { final String wikidataQuery = FileUtils.readFromResource("/queries/query_for_item.rq"); + final String[] secondaryLanguageArray = secondaryLanguages.split(",\\s*"); // could be used to generate backup SparQL Queries + String qids = ""; for (final Place place : placeList) { qids += "\n" + ("wd:" + place.getWikiDataEntityId()); } + + StringBuilder fallBackDescription = new StringBuilder(); + for (int i = 0; i < secondaryLanguageArray.length; i++) { + fallBackDescription.append("OPTIONAL {?item schema:description ?itemDescriptionPreferredLanguage_") + .append(i + 1) + .append(". FILTER (lang(?itemDescriptionPreferredLanguage_") + .append(i + 1) + .append(") = \"") + .append(secondaryLanguageArray[i]) + .append("\")}\n"); + } + + StringBuilder fallbackLabel = new StringBuilder(); + for (int i = 0; i < secondaryLanguageArray.length; i++) { + fallbackLabel.append("OPTIONAL {?item rdfs:label ?itemLabelPreferredLanguage_") + .append(i + 1) + .append(". FILTER (lang(?itemLabelPreferredLanguage_") + .append(i + 1) + .append(") = \"") + .append(secondaryLanguageArray[i]) + .append("\")}\n"); + } + + StringBuilder fallbackClassLabel = new StringBuilder(); + for (int i = 0; i < secondaryLanguageArray.length; i++) { + fallbackClassLabel.append("OPTIONAL {?class rdfs:label ?classLabelPreferredLanguage_") + .append(i + 1) + .append(". FILTER (lang(?classLabelPreferredLanguage_") + .append(i + 1) + .append(") = \"") + .append(secondaryLanguageArray[i]) + .append("\")}\n"); + } + final String query = wikidataQuery .replace("${ENTITY}", qids) - .replace("${LANG}", language); + .replace("${LANG}", language) + .replace("${SECONDARYDESCRIPTION}", fallBackDescription.toString()) + .replace("${SECONDARYLABEL}", fallbackLabel.toString()) + .replace("${SECONDARYCLASSLABEL}", fallbackClassLabel.toString()); + final HttpUrl.Builder urlBuilder = HttpUrl .parse(sparqlQueryUrl) .newBuilder() @@ -640,17 +680,13 @@ public class OkHttpJsonApiClient { } }).doOnError(Timber::e)); } - String fullCode = Locale.getDefault().getLanguage(); - String mainCode = fullCode.contains(",") ? fullCode.substring(0, fullCode.indexOf(',')).trim() : fullCode; @NotNull private Request sparqlQuery(String qid, int startPosition, int limit, String fileName) throws IOException { - String fullCode = Locale.getDefault().getLanguage(); - String mainCode = fullCode.contains(",") ? fullCode.substring(0, fullCode.indexOf(',')).trim() : fullCode; String query = FileUtils.readFromResource(fileName) .replace("${QID}", qid) - .replace("${LANG}", "\"" + mainCode + "\"") + .replace("${LANG}", "\"" + Locale.getDefault().getLanguage() + "\"") .replace("${LIMIT}", "" + limit) .replace("${OFFSET}", "" + startPosition); HttpUrl.Builder urlBuilder = HttpUrl diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java index d86e99226..d5f551e27 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java @@ -8,6 +8,8 @@ import androidx.annotation.Nullable; import fr.free.nrw.commons.BaseMarker; import fr.free.nrw.commons.MapController; import fr.free.nrw.commons.location.LatLng; +import fr.free.nrw.commons.kvstore.JsonKvStore; +import fr.free.nrw.commons.settings.Prefs; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -16,6 +18,7 @@ import java.util.ListIterator; import java.util.Locale; import java.util.Map; import javax.inject.Inject; +import javax.inject.Named; import timber.log.Timber; public class NearbyController extends MapController { @@ -34,6 +37,9 @@ public class NearbyController extends MapController { this.nearbyPlaces = nearbyPlaces; } + @Inject + @Named("default_preferences") + JsonKvStore defaultKvStore; /** * Prepares Place list to make their distance information update later. @@ -56,10 +62,9 @@ public class NearbyController extends MapController { Timber.d("Loading attractions nearby, but currentLatLng is null"); return null; } - String fullCode = Locale.getDefault().getLanguage(); - String mainCode = fullCode.contains(",") ? fullCode.substring(0, fullCode.indexOf(',')).trim() : fullCode; + List places = nearbyPlaces - .radiusExpander(searchLatLng, mainCode, returnClosestResult, + .radiusExpander(searchLatLng, Locale.getDefault().getLanguage(), returnClosestResult, customQuery); if (null != places && places.size() > 0) { @@ -141,9 +146,10 @@ public class NearbyController extends MapController { * @throws Exception If an error occurs during the retrieval process. */ public List getPlaces(List placeList) throws Exception { - String fullCode = Locale.getDefault().getLanguage(); - String mainCode = fullCode.contains(",") ? fullCode.substring(0, fullCode.indexOf(',')).trim() : fullCode; - return nearbyPlaces.getPlaces(placeList, mainCode); + + String secondaryLanguages = defaultKvStore.getString(Prefs.SECONDARY_LANGUAGE, ""); + + return nearbyPlaces.getPlaces(placeList, Locale.getDefault().getLanguage(), secondaryLanguages); } public static LatLng calculateNorthEast(double latitude, double longitude, double distance) { @@ -200,11 +206,8 @@ public class NearbyController extends MapController { return null; } - String fullCode = Locale.getDefault().getLanguage(); - String mainCode = fullCode.contains(",") ? fullCode.substring(0, fullCode.indexOf(',')).trim() : fullCode; - List places = nearbyPlaces.getFromWikidataQuery(screenTopRight, screenBottomLeft, - mainCode, shouldQueryForMonuments, customQuery); + Locale.getDefault().getLanguage(), shouldQueryForMonuments, customQuery); if (null != places && places.size() > 0) { LatLng[] boundaryCoordinates = { diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java index 46f0a2a9e..cfc45945e 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java @@ -131,9 +131,9 @@ public class NearbyPlaces { * @throws Exception If an error occurs during the retrieval process. */ public List getPlaces(final List placeList, - final String lang) throws Exception { + final String lang, final String lang2) throws Exception { return okHttpJsonApiClient - .getPlaces(placeList, lang); + .getPlaces(placeList, lang, lang2); } /** diff --git a/app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.java b/app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.java index cf3d257ab..de0154947 100644 --- a/app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.java +++ b/app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.java @@ -373,11 +373,9 @@ public class UploadRepository { @Nullable public Place checkNearbyPlaces(final double decLatitude, final double decLongitude) { try { - String fullCode = Locale.getDefault().getLanguage(); - String mainCode = fullCode.contains(",") ? fullCode.substring(0, fullCode.indexOf(',')).trim() : fullCode; final List fromWikidataQuery = nearbyPlaces.getFromWikidataQuery(new LatLng( decLatitude, decLongitude, 0.0f), - mainCode, + Locale.getDefault().getLanguage(), NEARBY_RADIUS_IN_KILO_METERS, null); return (fromWikidataQuery != null && fromWikidataQuery.size() > 0) ? fromWikidataQuery .get(0) : null; diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java index 8fb7e04a9..01224b22c 100644 --- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java @@ -190,18 +190,11 @@ public class SettingsFragment extends PreferenceFragmentCompat { keyLanguageListPreference = descriptionSecondaryLanguageListPreference.getKey(); languageCode = getCurrentLanguageCode(keyLanguageListPreference); assert languageCode != null; - if (languageCode.equals("")) { - // If current language code is empty, means none selected by user yet so use phone local - descriptionSecondaryLanguageListPreference.setSummary(Locale.getDefault().getDisplayLanguage()); - } else { - // If any language is selected by user previously, use it - Locale defLocale = createLocale(languageCode); - descriptionSecondaryLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale)); - } + descriptionSecondaryLanguageListPreference.setSummary("List additional languages."); + descriptionSecondaryLanguageListPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { - System.out.println("click recieved"); prepareSecondaryLanguageDialog(); return true; } @@ -323,19 +316,22 @@ public class SettingsFragment extends PreferenceFragmentCompat { private void prepareSecondaryLanguageDialog() { final String languageCode = getCurrentLanguageCode("descriptionSecondaryLanguagePref"); - System.out.println("before"); - System.out.println(languageCode); HashMap selectedLanguages = new HashMap<>(); assert languageCode != null; - String fullCode = Locale.getDefault().getLanguage(); - String mainCode = fullCode.contains(",") ? fullCode.substring(0, fullCode.indexOf(',')).trim() : fullCode; - selectedLanguages.put(0, mainCode); + selectedLanguages.put(0, Locale.getDefault().getLanguage()); + System.out.println(Locale.getDefault().getLanguage()); + System.out.println(languageCode); // Deserializing saved language codes to Language objects - ArrayList Saved_Languages = new ArrayList<>(); + ArrayList savedLanguages = new ArrayList<>(); for (String code : deSerialise(languageCode)) { + System.out.println(code); + if(code.equals(Locale.getDefault().getLanguage())){ + System.out.println("match"); + continue; + } Locale locale = new Locale(code); - Saved_Languages.add(new Language(locale.getDisplayLanguage(locale), code)); + savedLanguages.add(new Language(locale.getDisplayLanguage(locale), code)); } // Create the new dialog for secondary language @@ -355,29 +351,27 @@ public class SettingsFragment extends PreferenceFragmentCompat { View separator = dialog.findViewById(R.id.separator); // Setup saved languages with the new SavedLanguagesAdapter - updateSavedLanguages(savedLanguageListView, Saved_Languages, selectedLanguages); + updateSavedLanguages(savedLanguageListView, savedLanguages, selectedLanguages); // Set an onItemClickListener to remove a language when clicked savedLanguageListView.setOnItemClickListener((adapterView, view, position, id) -> { // Remove the clicked language from Saved_Languages - Saved_Languages.remove(position); + savedLanguages.remove(position); // Update the saved language list view after removing the language - updateSavedLanguages(savedLanguageListView, Saved_Languages, selectedLanguages); + updateSavedLanguages(savedLanguageListView, savedLanguages, selectedLanguages); // Update the shared preferences to reflect the removal String updatedLanguageCodes = ""; - for (Language language : Saved_Languages) { + for (Language language : savedLanguages) { updatedLanguageCodes += language.getLanguageCode() + ", "; } // Remove the trailing comma and space if present if (!updatedLanguageCodes.isEmpty()) { updatedLanguageCodes = updatedLanguageCodes.substring(0, updatedLanguageCodes.length() - 2); } - saveLanguageValue(updatedLanguageCodes, "descriptionSecondaryLanguagePref"); - System.out.println("after removal"); - System.out.println(getCurrentLanguageCode("descriptionSecondaryLanguagePref")); +// descriptionSecondaryLanguageListPreference.setSummary(getCurrentLanguageCode("descriptionSecondaryLanguagePref")); }); // Set up the adapter for new languages using the selectedLanguages map @@ -411,22 +405,36 @@ public class SettingsFragment extends PreferenceFragmentCompat { return; } - Saved_Languages.add(new Language(selectedLanguageName, selectedLanguageCode)); - updateSavedLanguages(savedLanguageListView, Saved_Languages, selectedLanguages); + savedLanguages.add(new Language(selectedLanguageName, selectedLanguageCode)); + updateSavedLanguages(savedLanguageListView, savedLanguages, selectedLanguages); - - // Save the language - if (getCurrentLanguageCode("descriptionSecondaryLanguagePref").isEmpty()) { - saveLanguageValue(selectedLanguageCode, "descriptionSecondaryLanguagePref"); - } else { - saveLanguageValue(getCurrentLanguageCode("descriptionSecondaryLanguagePref") + ", " - + selectedLanguageCode, "descriptionSecondaryLanguagePref"); + // Update the shared preferences to reflect the addition + String updatedLanguageCodes = ""; + for (Language language : savedLanguages) { + updatedLanguageCodes += language.getLanguageCode() + ", "; } - descriptionSecondaryLanguageListPreference.setSummary(getCurrentLanguageCode("descriptionSecondaryLanguagePref")); + // Remove the trailing comma and space if present + if (!updatedLanguageCodes.isEmpty()) { + updatedLanguageCodes = updatedLanguageCodes.substring(0, updatedLanguageCodes.length() - 2); + } + + saveLanguageValue(updatedLanguageCodes, "descriptionSecondaryLanguagePref"); + +// descriptionSecondaryLanguageListPreference.setSummary(getCurrentLanguageCode("descriptionSecondaryLanguagePref")); }); dialog.setOnDismissListener(dialogInterface -> { - setLocale(requireActivity(), languageCode, false); + // Update the shared preferences to reflect changes + String updatedLanguageCodes = ""; + for (Language language : savedLanguages) { + updatedLanguageCodes += language.getLanguageCode() + ", "; + } + // Remove the trailing comma and space if present + if (!updatedLanguageCodes.isEmpty()) { + updatedLanguageCodes = updatedLanguageCodes.substring(0, updatedLanguageCodes.length() - 2); + } + saveLanguageValue(updatedLanguageCodes, "descriptionSecondaryLanguagePref"); + }); } @@ -454,9 +462,7 @@ public class SettingsFragment extends PreferenceFragmentCompat { assert languageCode != null; if (languageCode.equals("")) { - String fullCode = Locale.getDefault().getLanguage(); - String mainCode = fullCode.contains(",") ? fullCode.substring(0, fullCode.indexOf(',')).trim() : fullCode; - selectedLanguages.put(0, mainCode); + selectedLanguages.put(0, Locale.getDefault().getLanguage()); } else { selectedLanguages.put(0, languageCode); } @@ -464,9 +470,7 @@ public class SettingsFragment extends PreferenceFragmentCompat { assert languageCode != null; if (languageCode.equals("")) { - String fullCode = Locale.getDefault().getLanguage(); - String mainCode = fullCode.contains(",") ? fullCode.substring(0, fullCode.indexOf(',')).trim() : fullCode; - selectedLanguages.put(0, mainCode); + selectedLanguages.put(0, Locale.getDefault().getLanguage()); } else { selectedLanguages.put(0, languageCode); @@ -475,9 +479,7 @@ public class SettingsFragment extends PreferenceFragmentCompat { assert languageCode != null; if (languageCode.equals("")) { - String fullCode = Locale.getDefault().getLanguage(); - String mainCode = fullCode.contains(",") ? fullCode.substring(0, fullCode.indexOf(',')).trim() : fullCode; - selectedLanguages.put(0, mainCode); + selectedLanguages.put(0, Locale.getDefault().getLanguage()); } else { selectedLanguages.put(0, languageCode); @@ -547,16 +549,13 @@ public class SettingsFragment extends PreferenceFragmentCompat { Locale defLocale = createLocale(languageCode); if(keyListPreference.equals("appUiDefaultLanguagePref")) { appUiLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale)); - setLocale(requireActivity(), languageCode, true); + setLocale(requireActivity(), languageCode); getActivity().recreate(); final Intent intent = new Intent(getActivity(), MainActivity.class); startActivity(intent); }else if(keyListPreference.equals("descriptionDefaultLanguagePref")){ descriptionLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale)); } - else{ - descriptionSecondaryLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale)); - } dialog.dismiss(); } }); @@ -615,7 +614,7 @@ public class SettingsFragment extends PreferenceFragmentCompat { final Locale defLocale = createLocale(recentLanguageCode); if (keyListPreference.equals("appUiDefaultLanguagePref")) { appUiLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale)); - setLocale(requireActivity(), recentLanguageCode, true); + setLocale(requireActivity(), recentLanguageCode); getActivity().recreate(); final Intent intent = new Intent(getActivity(), MainActivity.class); startActivity(intent); @@ -642,28 +641,34 @@ public class SettingsFragment extends PreferenceFragmentCompat { /** * Changing the default app language with selected one and save it to SharedPreferences */ - public void setLocale(final Activity activity, String userSelectedValue, boolean appUI) { - - if (userSelectedValue.equals("")) { - userSelectedValue = Locale.getDefault().getLanguage(); - } - - String current = Locale.getDefault().getLanguage(); - ArrayList languageCodes = deSerialise(current); - if(appUI) { - languageCodes.set(0, userSelectedValue); - userSelectedValue = reSerialise(languageCodes); - } - else{ - ArrayList newLanguageCodes = new ArrayList<>(); - ArrayList userSelctedCode = deSerialise(userSelectedValue); - - newLanguageCodes.add(languageCodes.get(0)); - for(String code : userSelctedCode){ - newLanguageCodes.add(code); - } - userSelectedValue = reSerialise(newLanguageCodes); - } + public void setLocale(final Activity activity, String userSelectedValue) { +// if (userSelectedValue.equals("")) { +// userSelectedValue = Locale.getDefault().getLanguage(); +// } +// +// String current = Locale.getDefault().getLanguage(); +// ArrayList languageCodes = deSerialise(current); +// if(appUI) { +// languageCodes.set(0, userSelectedValue); +// userSelectedValue = reSerialise(languageCodes); +// } +// else{ +// ArrayList newLanguageCodes = new ArrayList<>(); +// ArrayList userSelctedCode = deSerialise(userSelectedValue); +// +// newLanguageCodes.add(languageCodes.get(0)); +// for(String code : userSelctedCode){ +// newLanguageCodes.add(code); +// } +// userSelectedValue = reSerialise(newLanguageCodes); +// } +// +// System.out.println("Final locale"); +// System.out.println(userSelectedValue); +// +// System.out.println("vs"); +// System.out.println(getCurrentLanguageCode("appUiDefaultLanguagePref")); +// System.out.println(getCurrentLanguageCode("descriptionSecondaryLanguagePref")); final Locale locale = createLocale(userSelectedValue); Locale.setDefault(locale); diff --git a/app/src/main/resources/queries/query_for_item.rq b/app/src/main/resources/queries/query_for_item.rq index 1a5210e04..563f3d084 100644 --- a/app/src/main/resources/queries/query_for_item.rq +++ b/app/src/main/resources/queries/query_for_item.rq @@ -18,12 +18,14 @@ WHERE { } # Get the label in the preferred language of the user, or any other language if no label is available in that language. - OPTIONAL {?item rdfs:label ?itemLabelPreferredLanguage. FILTER (lang(?itemLabelPreferredLanguage) = "en")} + OPTIONAL {?item rdfs:label ?itemLabelPreferredLanguage. FILTER (lang(?itemLabelPreferredLanguage) = "${LANG}")} + ${SECONDARYLABEL} OPTIONAL {?item rdfs:label ?itemLabelAnyLanguage} BIND(COALESCE(?itemLabelPreferredLanguage, ?itemLabelAnyLanguage, "?") as ?label) # Get the description in the preferred language of the user, or any other language if no description is available in that language. OPTIONAL {?item schema:description ?itemDescriptionPreferredLanguage. FILTER (lang(?itemDescriptionPreferredLanguage) = "${LANG}")} + ${SECONDARYDESCRIPTION} OPTIONAL {?item schema:description ?itemDescriptionAnyLanguage} BIND(COALESCE(?itemDescriptionPreferredLanguage, ?itemDescriptionAnyLanguage, "?") as ?description) @@ -31,6 +33,7 @@ WHERE { OPTIONAL { ?item p:P31/ps:P31 ?class. OPTIONAL {?class rdfs:label ?classLabelPreferredLanguage. FILTER (lang(?classLabelPreferredLanguage) = "${LANG}")} + ${SECONDARYCLASSLABEL} OPTIONAL {?class rdfs:label ?classLabelAnyLanguage} BIND(COALESCE(?classLabelPreferredLanguage, ?classLabelAnyLanguage, "?") as ?classLabel) }