Merge branch 'master' into login-screen-improvement

This commit is contained in:
Paul Hawke 2017-10-09 21:40:30 -05:00
commit bcf6511d13
19 changed files with 159 additions and 16 deletions

View file

@ -12,22 +12,25 @@ dependencies {
compile 'ch.acra:acra:4.7.0'
compile 'org.mediawiki:api:1.3'
compile 'commons-codec:commons-codec:1.10'
compile 'com.github.pedrovgs:renderers:3.3.3'
compile 'com.google.code.gson:gson:2.8.1'
compile 'com.jakewharton.timber:timber:4.5.1'
compile 'info.debatty:java-string-similarity:0.24'
compile ('com.mapbox.mapboxsdk:mapbox-android-sdk:5.1.0@aar'){
transitive=true
}
compile "com.android.support:support-v4:${project.supportLibVersion}"
compile "com.android.support:appcompat-v7:${project.supportLibVersion}"
compile "com.android.support:design:${project.supportLibVersion}"
compile "com.android.support:cardview-v7:${project.supportLibVersion}"
compile 'com.google.code.gson:gson:2.8.0'
compile "com.jakewharton:butterknife:$BUTTERKNIFE_VERSION"
compile 'com.github.pedrovgs:renderers:3.3.3'
annotationProcessor "com.jakewharton:butterknife-compiler:$BUTTERKNIFE_VERSION"
compile 'com.jakewharton.timber:timber:4.5.1'
compile 'com.squareup.okhttp3:okhttp:3.8.1'
compile 'com.squareup.okio:okio:1.13.0'
compile ('com.mapbox.mapboxsdk:mapbox-android-sdk:5.1.0@aar'){
transitive=true
}
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
// Because RxAndroid releases are few and far between, it is recommended you also
@ -42,12 +45,12 @@ dependencies {
compile 'com.facebook.stetho:stetho:1.5.0'
testCompile 'junit:junit:4.12'
testCompile 'org.robolectric:robolectric:3.3.2'
testCompile 'org.robolectric:robolectric:3.4'
testCompile 'com.squareup.okhttp3:mockwebserver:3.8.1'
androidTestCompile 'com.squareup.okhttp3:mockwebserver:3.8.1'
androidTestCompile "com.android.support:support-annotations:${project.supportLibVersion}"
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
androidTestCompile 'com.android.support.test.espresso:espresso-core:3.0.1'
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'

View file

@ -25,6 +25,7 @@ import com.pedrogomez.renderers.RVRendererAdapter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@ -36,6 +37,7 @@ import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.data.Category;
import fr.free.nrw.commons.upload.MwVolleyApi;
import fr.free.nrw.commons.utils.StringSortingUtils;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
@ -107,7 +109,7 @@ public class CategorizationFragment extends Fragment {
RxTextView.textChanges(categoriesFilter)
.takeUntil(RxView.detaches(categoriesFilter))
.debounce(300, TimeUnit.MILLISECONDS)
.debounce(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(filter -> updateCategoryList(filter.toString()));
return rootView;
@ -200,6 +202,7 @@ public class CategorizationFragment extends Fragment {
)
.filter(categoryItem -> !containsYear(categoryItem.getName()))
.distinct()
.sorted(sortBySimilarity(filter))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
s -> categoriesAdapter.add(s), Timber::e, () -> {
@ -221,6 +224,12 @@ public class CategorizationFragment extends Fragment {
);
}
private Comparator<CategoryItem> sortBySimilarity(final String filter) {
Comparator<String> stringSimilarityComparator = StringSortingUtils.sortBySimilarity(filter);
return (firstItem, secondItem) -> stringSimilarityComparator
.compare(firstItem.getName(), secondItem.getName());
}
private List<String> getStringList(List<CategoryItem> input) {
List<String> output = new ArrayList<>();
for (CategoryItem item : input) {

View file

@ -0,0 +1,46 @@
package fr.free.nrw.commons.utils;
import java.util.Comparator;
import info.debatty.java.stringsimilarity.Levenshtein;
public class StringSortingUtils {
private StringSortingUtils() {
//no-op
}
/**
* Returns Comparator for sorting strings by its similarity with Levenshtein
* algorithm. By using this Comparator we get results from the highest to
* the lowest match.
*
* @param filter pattern to compare similarity
* @return Comparator with string similarity
*/
public static Comparator<String> sortBySimilarity(final String filter) {
return (firstItem, secondItem) -> {
double firstItemSimilarity = calculateSimilarity(firstItem, filter);
double secondItemSimilarity = calculateSimilarity(secondItem, filter);
return (int) Math.signum(secondItemSimilarity - firstItemSimilarity);
};
}
private static double calculateSimilarity(String firstString, String secondString) {
String longer = firstString.toLowerCase();
String shorter = secondString.toLowerCase();
if (firstString.length() < secondString.length()) {
longer = secondString;
shorter = firstString;
}
int longerLength = longer.length();
if (longerLength == 0) {
return 1.0;
}
double distanceBetweenStrings = new Levenshtein().distance(longer, shorter);
return (longerLength - distanceBetweenStrings) / (double) longerLength;
}
}

View file

@ -135,6 +135,7 @@
<string name="detail_license_empty">Llicencia desconocida</string>
<string name="menu_refresh">Refrescar</string>
<string name="read_storage_permission_rationale">Permisu riquíu: llectura d\'almacenamientu esternu. L\'aplicación nun puede funcionar ensin él.</string>
<string name="write_storage_permission_rationale">Permisu riquíu: escritura d\'almacenamientu esternu. L\'aplicación nun puede funcionar ensin él.</string>
<string name="location_permission_rationale">Permisu opcional: llograr l\'allugamientu actual pa suxerir categoríes</string>
<string name="ok">Aceutar</string>
<string name="title_activity_nearby">Llugares cercanos</string>
@ -194,4 +195,6 @@
<string name="error_while_cache">Error al poner les fotos na caché</string>
<string name="title_info">Un títulu descriptivu únicu pal ficheru, que sirvirá para da-y nome al ficheru. Se pue usar llinguax normal con espacios. Nun amiestes la estensión del ficheru</string>
<string name="description_info">Por favor, describi l\'elementu multimedia tantu como sía posible: ¿ónde se tomó?, ¿qué amuesa?, ¿cuál ye\'l contestu? Por favor, describi los oxetos o persones. Revela la información que nun pueda aldovinase de mou cenciellu, por casu el momentu del día si ye un paisaxe. Si\'l mediu amuesa daqué desacostumao, esplica qué lo fai raro.</string>
<string name="use_external_storage">Usar almacenamientu esternu</string>
<string name="use_external_storage_summary">Guardar nel preséu les imaxes tomaes cola cámara de la app</string>
</resources>

View file

@ -8,10 +8,10 @@
<string name="signup">Regístrate</string>
<string name="logging_in_title">Accediendo</string>
<string name="logging_in_message">Espera un momento…</string>
<string name="login_success">¡Inicio de sesión exitoso!</string>
<string name="login_failed">¡Inicio de sesión fallido!</string>
<string name="login_success">Acceso correcto.</string>
<string name="login_failed">Acceso fallido.</string>
<string name="upload_failed">No se encontró el archivo. Prueba con otro.</string>
<string name="authentication_failed">¡Autentificación fallida!</string>
<string name="authentication_failed">Falló la autenticación.</string>
<string name="uploading_started">¡Empenzando a subir!</string>
<string name="upload_completed_notification_title">¡Se subieron %1$s!</string>
<string name="upload_completed_notification_text">Pulsa para ver tu subida</string>
@ -78,7 +78,7 @@
<string name="about_privacy_policy">&lt;a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\"&gt;Normativa de privacidad&lt;/a&gt;</string>
<string name="about_credits">&lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\"&gt;Créditos&lt;/a&gt;</string>
<string name="title_activity_about">Acerca de</string>
<string name="menu_feedback">Enviar comentarios (por e-mail)</string>
<string name="menu_feedback">Enviar comentarios (por correo)</string>
<string name="no_email_client">No se ha instalado ningún cliente de correo</string>
<string name="provider_categories">Categorías usadas recientemente</string>
<string name="waiting_first_sync">Esperando la primera sincronización…</string>
@ -135,6 +135,7 @@
<string name="detail_license_empty">Licencia desconocida</string>
<string name="menu_refresh">Actualizar</string>
<string name="read_storage_permission_rationale">Permiso obligatorio: lectura de almacenamiento externo. La aplicación no puede funcionar sin él.</string>
<string name="write_storage_permission_rationale">Permiso necesario: Escribir en almacenamiento externo. La aplicación no puede funcionar sin él.</string>
<string name="location_permission_rationale">Permiso opcional: obtener la ubicación actual para sugerir categorías</string>
<string name="ok">Aceptar</string>
<string name="title_activity_nearby">Lugares cercanos</string>
@ -194,4 +195,6 @@
<string name="error_while_cache">Error mientras se guardaban imágenes en la caché</string>
<string name="title_info">Un título único descriptivo para el archivo, que servirá como un nombre de archivo. Puede usar un lenguaje claro con espacios. No incluya la extensión del archivo.</string>
<string name="description_info">Por favor, describa el elemento multimedia tanto como sea posible: ¿dónde fue tomado?, ¿qué muestra?, ¿cuál es el contexto? Por favor, describa los objetos o personas. Ofrezca la información que no puede ser inferida tan facilmente, por ejemplo el momento del día si es un paisaje. Si el medio muestra algo inusual, explique qué lo hace insual.</string>
<string name="use_external_storage">Utilizar almacenamiento externo</string>
<string name="use_external_storage_summary">Guardar en el dispositivo imágenes capturadas con la cámara de la aplicación</string>
</resources>

View file

@ -135,6 +135,7 @@
<string name="detail_license_empty">مجوز ناشناخته</string>
<string name="menu_refresh">تازه‌کردن</string>
<string name="read_storage_permission_rationale">اجازه‌های مورد نیاز: مطالعهٔ حافظهٔ خارجی. اپلیکیشن بدون آن نمی‌تواند کار کند.</string>
<string name="write_storage_permission_rationale">اجازه‌های مورد نیاز: نوشتن حافظهٔ خارجی. اپلیکیشن بدون آن نمی‌تواند کار کند.</string>
<string name="location_permission_rationale">اجازه‌های اختیاری: دریافت موقعیت برای پیشنهاد رده</string>
<string name="ok">تأیید</string>
<string name="title_activity_nearby">مکان‌‌های اطراف</string>
@ -194,4 +195,6 @@
<string name="error_while_cache">خطا در زمان دریافت تصاویر</string>
<string name="title_info">عنوانی توصیفی و یکتا برای پرونده که به عنوان نام پرونده در نظر گرفته خواهد شد. ترجیحاً به زبان ساده باشد، می‌توانید فاصله هم به کار ببرید. پسوند پرونده را ننویسید.</string>
<string name="description_info">لطفاً تصویر را تا حد توان شرح دهید. کجا گرفته شده‌است؟ شامل چه چیزی می‌شود؟ لطفاً اشیا یا افراد را شرح دهید. اطلاعاتی که به راحتی قابل مشاهده هستند را صرفه‌نظر کنید. اگر چیزی در تصویر غیر طبیعی به نظر می‌رسد آن را شرح دهید.</string>
<string name="use_external_storage">استفاده از حافظهٔ خارجی</string>
<string name="use_external_storage_summary">ذخیرهٔ تصویرهای گرفته شده توسط دوربین درونکار اپلیکیشن بر روی دستگاه شما</string>
</resources>

View file

@ -135,6 +135,7 @@
<string name="detail_license_empty">Licenza descoñecida</string>
<string name="menu_refresh">Refrescar</string>
<string name="read_storage_permission_rationale">Permiso necesarioː ler un almacenamento externo. A aplicación non pode funcionar sen isto.</string>
<string name="write_storage_permission_rationale">Permiso necesario: Escribir en almacenamento externo. A aplicación non pode funcionar sen el.</string>
<string name="location_permission_rationale">Permiso opcionalː obter a localización actual para suxerir categorías</string>
<string name="ok">Aceptar</string>
<string name="title_activity_nearby">Lugares próximos</string>
@ -194,4 +195,6 @@
<string name="error_while_cache">Erro mentras se gardaban as imaxes na caché</string>
<string name="title_info">Un título único descritivo para o ficheiro, que servirá como un nome de ficheiro. Pode usar unha linguaxe clara con espazos. Non inclúa a extensión do ficheiro</string>
<string name="description_info">Por favor, describa o ficheiro todo o posibleː Onde se gravou? Cal é o contexto? Por favor, describa os obxectos ou persoas. Indique información que non pode ser adiviñada de forma doada, por exemplo, a hora do día se é unha paisaxe. Se o ficheiro amosa algo pouco habitual, por favor, explique que é o que o fai excepcional.</string>
<string name="use_external_storage">Usar o almacenamento externo</string>
<string name="use_external_storage_summary">Gardar as imaxes capturadas coa cámara do seu dispositivo</string>
</resources>

View file

@ -131,6 +131,7 @@
<string name="detail_license_empty">अज्ञात लाइसेन्स</string>
<string name="menu_refresh">ताजा करें</string>
<string name="read_storage_permission_rationale">अनिवार्य अनुमति: बाहरी स्मृति पढ़ें। एप इसके बिना कार्य नहीं करेगा।</string>
<string name="write_storage_permission_rationale">अनिवार्य अनुमति:बाहरी कंप्यूटर स्टोरेज लिखना|इसके बिना एप कार्य नहीं करेगा।</string>
<string name="location_permission_rationale">वैकल्पिक अनुमति: श्रेणी सुझाव हेतु वर्तमान स्थान ज्ञात करें</string>
<string name="ok">ठीक है</string>
<string name="title_activity_nearby">आसपास के स्थान</string>
@ -190,4 +191,6 @@
<string name="error_while_cache">चित्र कैशिंग करते समय त्रुटि</string>
<string name="title_info">फ़ाइल के लिए एक अद्वितीय वर्णनात्मक शीर्षक, जो एक फ़ाइल नाम के रूप में काम करेगा। आप रिक्त स्थान के साथ सादे भाषा का उपयोग कर सकते हैं। फ़ाइल विस्तार शामिल न करें</string>
<string name="description_info">कृपया मीडिया जितना संभव हो उतना बताएं: यह कहां लिया गया? यह क्या दिखाता है? संदर्भ क्या है? कृपया वस्तुओं या व्यक्तियों का वर्णन करें। ऐसी जानकारी का खुलासा करें जिसे आसानी से अनुमानित नहीं किया जा सकता, उदाहरण के लिए दिन का समय यदि यह परिदृश्य है। अगर मीडिया कुछ असामान्य दिखाता है, तो कृपया बताएं कि इसे क्या असामान्य बनाता है।</string>
<string name="use_external_storage">बाहरी स्टॉरज का पृयोग करे।</string>
<string name="use_external_storage_summary">आप अपने डिवाइस के इन-ऐप कैमरा से ली गई तस्वीरों को सहेजें।</string>
</resources>

View file

@ -134,6 +134,7 @@
<string name="detail_license_empty">רישיון לא ידוע</string>
<string name="menu_refresh">רענון</string>
<string name="read_storage_permission_rationale">הרשאה מחייבת: אחסון. היישום לא יכול לעבוד בלי זה.</string>
<string name="write_storage_permission_rationale">נדרשת הרשאה: כתיבה לאחסון חיצוני. היישום לא יכול לעבוד בלי זה.</string>
<string name="location_permission_rationale">הרשאה לא מחייבת: קבלת מיקום נוכחי בשביל הצעות קטגוריות</string>
<string name="ok">אישור</string>
<string name="title_activity_nearby">מקומות בסביבה</string>
@ -190,4 +191,6 @@
<string name="error_while_cache">שגיאה במשירת תמונות במטמון</string>
<string name="title_info">כותרת מתארת ייחודית לקובץ, שתשמש שם קובץ. אפשר להשתמש בשפה פשוטה עם רווחים. אין לכלול סיומת קובץ</string>
<string name="description_info">נא לתאר את המדיה כמה שיותר: איפה היא נוצרה? מה היא מראה? מה ההקשר? נא לתאר את העצמים או את האנשים. נא לחשוף מידע שאי־אפשר לנחש בקלות, למשל, הזמן ביום אם זאת תמונת נוף. אם המדיה מציגה משהו בלתי־רגיל, נא להסביר מה מיוחד בה.</string>
<string name="use_external_storage">להשתמש באחסון חיצוני</string>
<string name="use_external_storage_summary">שמירת תמונות שצולמו באמצעות מצלמה בתוך היישום במכשיר שלך</string>
</resources>

View file

@ -167,4 +167,5 @@
<string name="navigation_item_info">チュートリアル</string>
<string name="no_description_found">説明がありません</string>
<string name="nearby_info_menu_wikidata_article">ウィキデータ項目</string>
<string name="use_external_storage">外部ストレージを使用</string>
</resources>

View file

@ -185,4 +185,6 @@
<string name="no_description_found">keng Beschreiwung fonnt</string>
<string name="nearby_info_menu_commons_article">Commons-Fichierssäit</string>
<string name="nearby_info_menu_wikidata_article">Wikidata-Element</string>
<string name="use_external_storage">Externe Späicher benotzen</string>
<string name="use_external_storage_summary">Biller späicheren déi mat der in-app Kamera vun Ärem Apparat gemaach goufen</string>
</resources>

View file

@ -55,6 +55,11 @@
<string name="preference_license">Licence</string>
<string name="preference_theme">Nakts režīms</string>
<string name="license_name_cc0">CC0</string>
<string name="license_name_cc_by_sa_3_0">CC BY-SA 3.0</string>
<string name="license_name_cc_by_3_0">CC BY 3.0</string>
<string name="license_name_cc_by_sa_4_0">CC BY-SA 4.0</string>
<string name="license_name_cc_by_4_0">CC BY 4.0</string>
<string name="license_name_cc_zero">CC Zero</string>
<string name="welcome_final_text">Jums šķiet, ka sapratāt?</string>
<string name="welcome_final_button_text">Jā!</string>
<string name="detail_panel_cats_label">Kategorijas</string>
@ -67,6 +72,7 @@
<string name="yes"></string>
<string name="no"></string>
<string name="media_detail_title">Nosaukums</string>
<string name="media_detail_description">Apraksts</string>
<string name="media_detail_uploaded_date">Augšupielādēšanas datums</string>
<string name="media_detail_license">Licence</string>
<string name="media_detail_coordinates">Koordinātas</string>
@ -75,6 +81,7 @@
<string name="upload_image">Augšupielādēt attēlu</string>
<string name="welcome_image_llamas">Lama</string>
<string name="welcome_image_tulip">Tulpe</string>
<string name="welcome_image_no_selfies">Nekādu pašbilžu</string>
<string name="cancel">Atcelt</string>
<string name="navigation_drawer_open">Atvērt</string>
<string name="navigation_drawer_close">Aizvērt</string>
@ -85,6 +92,7 @@
<string name="navigation_item_settings">Iestatījumi</string>
<string name="navigation_item_feedback">Atsauksmes</string>
<string name="navigation_item_logout">Iziet</string>
<string name="navigation_item_info" fuzzy="true">Ievads</string>
<string name="navigation_item_info">Apmācība</string>
<string name="no_description_found">apraksts nav atrasts</string>
<string name="use_external_storage">Izmantot ārējo krātuvi</string>
</resources>

View file

@ -24,7 +24,7 @@
<item quantity="one">१ संचिका अपभारीत आहे</item>
<item quantity="other">%d संचिका अपभारीत आहे</item>
</plurals>
<string name="title_activity_contributions" fuzzy="true">माझी अपभारणे</string>
<string name="title_activity_contributions">माझी अपभारणे</string>
<string name="contribution_state_queued">प्रतिक्षावलीत ठेवले</string>
<string name="contribution_state_failed">अपयशी</string>
<string name="contribution_state_in_progress">%1$d%% पूर्ण</string>
@ -42,6 +42,7 @@
<string name="login_failed_password">सनोंद प्रवेश अशक्य - कृपया आपला परवलीचा शब्द तपासा</string>
<string name="login_failed_throttled">अनेक अयशस्वी प्रयत्न.काही मिनीटांनंतर पुन्हा प्रयत्न करा.</string>
<string name="login_failed_blocked">माफ करा,कॉमन्सवर हा सदस्य प्रतिबंधित आहे</string>
<string name="login_failed_2fa_needed">आपण आपल्या दोन कारक प्रमाणिकरण कोड प्रदान करणे आवश्यक आहे.</string>
<string name="login_failed_generic">सनोंद प्रवेश अयशस्वी!</string>
<string name="share_upload_button">अपभारण करा</string>
<string name="multiple_share_base_title">या संचास नाव द्या</string>

View file

@ -135,6 +135,7 @@
<string name="detail_license_empty">Licensa sconossùa</string>
<string name="menu_refresh">Rinfrësché</string>
<string name="read_storage_permission_rationale">Autorisassion necessaria: Lese n\'anmagasinament estern. L\'aplicassion a peul pa marcé sensa lòn.</string>
<string name="write_storage_permission_rationale">Autorisassion necessaria: Scrive n\'anmagasinament estern. L\'aplicassion a peul pa marcé sensa \'d lòn.</string>
<string name="location_permission_rationale">Autorisassion facoltativa: Oten-e la posission atual për dij sugeriment ëd categorìa</string>
<string name="ok">Va bin</string>
<string name="title_activity_nearby">Pòst davzin</string>
@ -194,4 +195,6 @@
<string name="error_while_cache">Eror antramentre ch\'as butavo le plance an memòria local</string>
<string name="title_info">Un tìtol dëscritiv ùnich për l\'archivi, che a servirà com nòm d\'archivi. A peul dovré un lengagi sempi con djë spassi. Ch\'a ancluda pa l\'estension dl\'archivi</string>
<string name="description_info">Për piasì, ch\'a descriva ël mojen mej ch\'a peul: Andoa a l\'é stàit fàit? Për piasì, ch\'a descriva j\'oget o le përson-e. Ch\'a arvela j\'anformassion ch\'a l\'é nen belfé andviné, për esempi l\'ora dël dì, s\'a l\'é un panorama. Si ël mojen a smon cheicòs ëd foravìa, për piasì ch\'a spiega lòn ch\'a lo rend foravìa.</string>
<string name="use_external_storage">Dovré n\'anmagasinament estern</string>
<string name="use_external_storage_summary">Argistré le plance pijà con la màchina fòto ëd sò angign</string>
</resources>

View file

@ -135,6 +135,7 @@
<string name="detail_license_empty">Licença desconhecida</string>
<string name="menu_refresh">Atualizar</string>
<string name="read_storage_permission_rationale">Permissão necessária: Ler armazenamento externo. O aplicativo não pode funcionar sem isso.</string>
<string name="write_storage_permission_rationale">Permissão necessária: Escreva armazenamento externo. A aplicação não pode funcionar sem isso.</string>
<string name="location_permission_rationale">Permissão opcional: Obter a localização atual de sugestões de categoria</string>
<string name="ok">OK</string>
<string name="title_activity_nearby">Lugares próximos</string>
@ -194,4 +195,6 @@
<string name="error_while_cache">Erro durante o cache de imagens</string>
<string name="title_info">Um título descritivo exclusivo para o arquivo, que servirá como um nome de arquivo. Você pode usar linguagem simples com espaços. Não inclua a extensão do arquivo</string>
<string name="description_info">Por favor, descreva a mídia tanto quanto possível: onde foi tomada? O que isso mostra? Qual é o contexto? Descreva os objetos ou pessoas. Revelar informações que não podem ser facilmente adivinhadas, por exemplo, a hora do dia, se for uma paisagem. Se a mídia mostrar algo incomum, explique o que torna incomum.</string>
<string name="use_external_storage">Usar o armazenamento externo</string>
<string name="use_external_storage_summary">Salvar as fotos tiradas com a câmera no aplicativo no seu dispositivo</string>
</resources>

View file

@ -137,7 +137,8 @@
<string name="detail_description_empty">Нет описания</string>
<string name="detail_license_empty">Неизвестная лицензия</string>
<string name="menu_refresh">Обновить</string>
<string name="read_storage_permission_rationale">Требуемые разрешения: чтение с внешнего накопителя. Приложение не сможет функционировать без этого.</string>
<string name="read_storage_permission_rationale">Требуемые разрешения: чтение с внешнего хранилища. Приложение не сможет функционировать без этого.</string>
<string name="write_storage_permission_rationale">Требуемые разрешения: запись на внешнее хранилище. Приложение не сможет функционировать без этого.</string>
<string name="location_permission_rationale">Необязательное разрешение: получение текущего местоположения для предложения категорий</string>
<string name="ok">OK</string>
<string name="title_activity_nearby">Места поблизости</string>
@ -195,4 +196,6 @@
<string name="nearby_info_menu_commons_article">Страница файла на Викискладе</string>
<string name="nearby_info_menu_wikidata_article">Элемент Викиданных</string>
<string name="error_while_cache">Ошибка при кэшировании картинок</string>
<string name="use_external_storage">Использовать внешнее хранилище</string>
<string name="use_external_storage_summary">Сохранять изображения, сделанные с помощью встроенной камеры на устройстве</string>
</resources>

View file

@ -135,6 +135,7 @@
<string name="detail_license_empty">Okänd licens</string>
<string name="menu_refresh">Uppdatera</string>
<string name="read_storage_permission_rationale">Nödvändig behörighet: Läsa extern lagring. Appen fungerar inte utan detta.</string>
<string name="write_storage_permission_rationale">Nödvändig behörighet: Skriva till extern lagring. Appen kan inte fungera så här.</string>
<string name="location_permission_rationale">Valfri behörighet: Hämta aktuell plats för kategoriförslag</string>
<string name="ok">OK</string>
<string name="title_activity_nearby">Platser i närheten</string>
@ -194,4 +195,6 @@
<string name="error_while_cache">Fel uppstod när bilder cachelagras</string>
<string name="title_info">En unik beskrivande titel för filen, som kommer att fungera som ett filnamn. Du kan använda klarspråk med mellanslag. Ta inte med filändelsen</string>
<string name="description_info">Beskriv mediafilen så mycket som möjligt. Var togs den? Vad visar den? Vad är sammanhanget? Beskriv föremålen eller personerna. Ge information som inte kan gissas fram, t.ex. tidpunkten om det är ett landskap. Om mediafilen visar någonting ovanligt, förklara vad som gör den ovanlig.</string>
<string name="use_external_storage">Använd extern lagring</string>
<string name="use_external_storage_summary">Spara bilder som tas med kameran i appen på din enhet</string>
</resources>

View file

@ -125,6 +125,7 @@
<string name="detail_license_empty">Giấy phép không rõ</string>
<string name="menu_refresh">Làm tươi</string>
<string name="read_storage_permission_rationale">Yêu cầu cấp phép: Đọc thiết bị lưu trữ bên ngoài. Ứng dụng cần được phép đọc thiết bị lưu trữ bên ngoài để hoạt động.</string>
<string name="write_storage_permission_rationale">Yêu cầu cấp phép: Ghi vào thiết bị lưu trữ bên ngoài. Ứng dụng cần được phép ghi vào thiết bị lưu trữ bên ngoài để hoạt động.</string>
<string name="location_permission_rationale">Tùy chọn cấp phép: Định vị hiện tại để nhận gợi ý thể loại</string>
<string name="ok">OK</string>
<string name="title_activity_nearby">Nơi Lân cận</string>
@ -184,4 +185,6 @@
<string name="error_while_cache">Xuất hiện lỗi khi đưa hình ảnh vào vùng nhớ đệm</string>
<string name="title_info">Tên ngắn và duy nhất cho tập tin sẽ được dùng làm tên tập tin. Có thể dùng thuật ngữ bình thường với khoảng cách. Đừng bao gồm phần mở rộng tập tin.</string>
<string name="description_info">Xin vui lòng miêu tả phương tiện càng đầy đủ càng tốt: Chụp ở đâu? Trong hình có gì? Bối cảnh làm sao? Xin vui lòng miêu tả các đối tượng và người trong hình. Cho biết những thông tin khó đoán ra, chẳng hạn giờ trong ngày nếu là phong cảnh. Nếu phương tiện có gì kỳ lạ, xin vui lòng giải thích tại sao nó kỳ lạ.</string>
<string name="use_external_storage">Sử dụng thiết bị lưu trữ bên ngoài</string>
<string name="use_external_storage_summary">Lưu các hình ảnh được chụp bằng máy chụp hình trong ứng dụng vào thiết bị của bạn</string>
</resources>

View file

@ -0,0 +1,40 @@
package fr.free.nrw.commons.utils;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
public class StringSortingUtilsTest {
@Test
public void testSortingNumbersBySimilarity() throws Exception {
List<String> actualList = Arrays.asList("1234567", "4567", "12345", "123", "1234");
List<String> expectedList = Arrays.asList("1234", "12345", "123", "1234567", "4567");
Collections.sort(actualList, StringSortingUtils.sortBySimilarity("1234"));
Assert.assertEquals(expectedList, actualList);
}
@Test
public void testSortingTextBySimilarity() throws Exception {
List<String> actualList = Arrays.asList("The quick brown fox",
"quick brown fox",
"The",
"The quick ",
"The fox",
"brown fox",
"fox");
List<String> expectedList = Arrays.asList("The",
"The fox",
"The quick ",
"The quick brown fox",
"quick brown fox",
"brown fox",
"fox");
Collections.sort(actualList, StringSortingUtils.sortBySimilarity("The"));
Assert.assertEquals(expectedList, actualList);
}
}