Merge remote-tracking branch 'refs/remotes/commons-app/master'

This commit is contained in:
misaochan 2017-12-12 00:37:16 +10:00
commit 91bbb70240
41 changed files with 146 additions and 122 deletions

View file

@ -50,11 +50,6 @@ public class CommonsApplication extends DaggerApplication {
@Inject @Named("application_preferences") SharedPreferences applicationPrefs;
@Inject @Named("prefs") SharedPreferences otherPrefs;
public static final Object[] EVENT_UPLOAD_ATTEMPT = {"MobileAppUploadAttempts", 5334329L};
public static final Object[] EVENT_LOGIN_ATTEMPT = {"MobileAppLoginAttempts", 5257721L};
public static final Object[] EVENT_SHARE_ATTEMPT = {"MobileAppShareAttempts", 5346170L};
public static final Object[] EVENT_CATEGORIZATION_ATTEMPT = {"MobileAppCategorizationAttempts", 5359208L};
public static final String DEFAULT_EDIT_SUMMARY = "Uploaded using Android Commons app";
public static final String FEEDBACK_EMAIL = "commons-app-android@googlegroups.com";

View file

@ -8,6 +8,16 @@ public class License {
private String url;
private String name;
/**
* Constructs a new instance of License.
*
* @param key license key
* @param template license template
* @param url license URL
* @param name licence name
*
* @throws RuntimeException if License.key or Licence.template is null
*/
public License(String key, String template, String url, String name) {
if (key == null) {
throw new RuntimeException("License.key must not be null");
@ -21,10 +31,18 @@ public class License {
this.name = name;
}
/**
* Gets the license key.
* @return license key as a String.
*/
public String getKey() {
return key;
}
/**
* Gets the license template.
* @return license template as a String.
*/
public String getTemplate() {
return template;
}

View file

@ -128,89 +128,177 @@ public class Media implements Parcelable {
return imageUrl;
}
/**
* Gets the name of the file.
* @return file name as a string
*/
public String getFilename() {
return filename;
}
/**
* Sets the name of the file.
* @param filename the new name of the file
*/
public void setFilename(String filename) {
this.filename = filename;
}
/**
* Gets the file description.
* @return file description as a string
*/
public String getDescription() {
return description;
}
/**
* Sets the file description.
* @param description the new description of the file
*/
public void setDescription(String description) {
this.description = description;
}
/**
* Gets the datalength of the file.
* @return file datalength as a long
*/
public long getDataLength() {
return dataLength;
}
/**
* Sets the datalength of the file.
* @param dataLength as a long
*/
public void setDataLength(long dataLength) {
this.dataLength = dataLength;
}
/**
* Gets the creation date of the file.
* @return creation date as a Date
*/
public Date getDateCreated() {
return dateCreated;
}
/**
* Sets the creation date of the file.
* @param date creation date as a Date
*/
public void setDateCreated(Date date) {
this.dateCreated = date;
}
/**
* Gets the upload date of the file.
* Can be null.
* @return upload date as a Date
*/
public @Nullable
Date getDateUploaded() {
return dateUploaded;
}
/**
* Gets the name of the creator of the file.
* @return creator name as a String
*/
public String getCreator() {
return creator;
}
/**
* Sets the creator name of the file.
* @param creator creator name as a string
*/
public void setCreator(String creator) {
this.creator = creator;
}
/**
* Gets the width of the media.
* @return file width as an int
*/
public int getWidth() {
return width;
}
/**
* Sets the width of the media.
* @param width file width as an int
*/
public void setWidth(int width) {
this.width = width;
}
/**
* Gets the height of the media.
* @return file height as an int
*/
public int getHeight() {
return height;
}
/**
* Sets the height of the media.
* @param height file height as an int
*/
public void setHeight(int height) {
this.height = height;
}
/**
* Gets the license name of the file.
* @return license as a String
*/
public String getLicense() {
return license;
}
/**
* Sets the license name of the file.
* @param license license name as a String
*/
public void setLicense(String license) {
this.license = license;
}
/**
* Gets the coordinates of where the file was created.
* @return file coordinates as a LatLng
*/
public @Nullable
LatLng getCoordinates() {
return coordinates;
}
/**
* Sets the coordinates of where the file was created.
* @param coordinates file coordinates as a LatLng
*/
public void setCoordinates(@Nullable LatLng coordinates) {
this.coordinates = coordinates;
}
/**
* Gets the categories the file falls under.
* @return file categories as an ArrayList of Strings
*/
@SuppressWarnings("unchecked")
public ArrayList<String> getCategories() {
return (ArrayList<String>) categories.clone(); // feels dirty
}
/**
* Sets the categories the file falls under.
* </p>
* Does not append: i.e. will clear the current categories
* and then add the specified ones.
* @param categories file categories as a list of Strings
*/
public void setCategories(List<String> categories) {
this.categories.clear();
this.categories.addAll(categories);

View file

@ -84,6 +84,12 @@ public class PageTitle {
return titleKey;
}
/**
* Gets the canonicalized title for displaying (such as "File:My example.jpg").
* </p>
* Essentially equivalent to getPrefixedText
* @return canonical title as a String
*/
@Override
public String toString() {
return getPrefixedText();

View file

@ -51,6 +51,12 @@ public class Utils {
}
}
/**
* Capitalizes the first character of a string.
*
* @param string
* @return string with capitalized first character
*/
public static String capitalize(String string) {
return string.substring(0, 1).toUpperCase(Locale.getDefault()) + string.substring(1);
}

View file

@ -8,9 +8,7 @@ import android.os.Bundle;
import java.io.IOException;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.mwapi.EventLog;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import timber.log.Timber;
@ -27,7 +25,6 @@ class LoginTask extends AsyncTask<String, String, String> {
private String twoFactorCode = "";
private AccountUtil accountUtil;
private MediaWikiApi mwApi;
private SharedPreferences prefs;
public LoginTask(LoginActivity loginActivity, String username, String password,
String twoFactorCode, AccountUtil accountUtil,
@ -38,7 +35,6 @@ class LoginTask extends AsyncTask<String, String, String> {
this.twoFactorCode = twoFactorCode;
this.accountUtil = accountUtil;
this.mwApi = mwApi;
this.prefs = prefs;
}
@Override
@ -71,11 +67,6 @@ class LoginTask extends AsyncTask<String, String, String> {
super.onPostExecute(result);
Timber.d("Login done!");
EventLog.schema(CommonsApplication.EVENT_LOGIN_ATTEMPT, mwApi, prefs)
.param("username", username)
.param("result", result)
.log();
if (result.equals("PASS")) {
handlePassResult();
} else {

View file

@ -29,20 +29,17 @@ import javax.inject.Inject;
import javax.inject.Named;
import dagger.android.support.DaggerFragment;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.contributions.Contribution;
import fr.free.nrw.commons.contributions.ContributionsActivity;
import fr.free.nrw.commons.mwapi.EventLog;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.content.Context.DOWNLOAD_SERVICE;
import static android.content.Intent.ACTION_VIEW;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static fr.free.nrw.commons.CommonsApplication.EVENT_SHARE_ATTEMPT;
public class MediaDetailPagerFragment extends DaggerFragment implements ViewPager.OnPageChangeListener {
@ -110,12 +107,7 @@ public class MediaDetailPagerFragment extends DaggerFragment implements ViewPage
Media m = provider.getMediaAtPosition(pager.getCurrentItem());
switch (item.getItemId()) {
case R.id.menu_share_current_image:
// Share - this is just logs it, intent set in onCreateOptionsMenu, around line 252
CommonsApplication app = (CommonsApplication) getActivity().getApplication();
EventLog.schema(EVENT_SHARE_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("filename", m.getFilename())
.log();
// Share - intent set in onCreateOptionsMenu, around line 252
return true;
case R.id.menu_browser_current_image:
// View in browser

View file

@ -29,7 +29,6 @@ import javax.inject.Inject;
import javax.inject.Named;
import butterknife.ButterKnife;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.auth.AuthenticatedActivity;
@ -42,7 +41,6 @@ import fr.free.nrw.commons.modifications.CategoryModifier;
import fr.free.nrw.commons.modifications.ModificationsContentProvider;
import fr.free.nrw.commons.modifications.ModifierSequence;
import fr.free.nrw.commons.modifications.TemplateRemoveModifier;
import fr.free.nrw.commons.mwapi.EventLog;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import timber.log.Timber;
@ -181,13 +179,6 @@ public class MultipleShareActivity extends AuthenticatedActivity
// FIXME: Make sure that the content provider is up
// This is the wrong place for it, but bleh - better than not having it turned on by default for people who don't go throughl ogin
ContentResolver.setSyncAutomatically(sessionManager.getCurrentAccount(), ModificationsContentProvider.AUTHORITY, true); // Enable sync by default!
EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("categories-count", categories.size())
.param("files-count", photosList.size())
.param("source", Contribution.SOURCE_EXTERNAL)
.param("result", "queued")
.log();
finish();
}
@ -286,27 +277,6 @@ public class MultipleShareActivity extends AuthenticatedActivity
finish();
}
@Override
public void onBackPressed() {
super.onBackPressed();
if (categorizationFragment != null && categorizationFragment.isVisible()) {
EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("categories-count", categorizationFragment.getCurrentSelectedCount())
.param("files-count", photosList.size())
.param("source", Contribution.SOURCE_EXTERNAL)
.param("result", "cancelled")
.log();
} else {
EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("source", getIntent().getStringExtra(UploadService.EXTRA_SOURCE))
.param("multiple", true)
.param("result", "cancelled")
.log();
}
}
@Override
public void onBackStackChanged() {
getSupportActionBar().setDisplayHomeAsUpEnabled(mediaDetails != null && mediaDetails.isVisible()) ;

View file

@ -10,7 +10,6 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
@ -176,13 +175,6 @@ public class ShareActivity
// This is the wrong place for it, but bleh - better than not having it turned on by default for people who don't go throughl ogin
ContentResolver.setSyncAutomatically(sessionManager.getCurrentAccount(), ModificationsContentProvider.AUTHORITY, true); // Enable sync by default!
EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("categories-count", categories.size())
.param("files-count", 1)
.param("source", contribution.getSource())
.param("result", "queued")
.log();
finish();
}
@ -194,27 +186,6 @@ public class ShareActivity
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
if (categorizationFragment != null && categorizationFragment.isVisible()) {
EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("categories-count", categorizationFragment.getCurrentSelectedCount())
.param("files-count", 1)
.param("source", contribution.getSource())
.param("result", "cancelled")
.log();
} else {
EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("source", getIntent().getStringExtra(UploadService.EXTRA_SOURCE))
.param("multiple", true)
.param("result", "cancelled")
.log();
}
}
@Override
protected void onAuthCookieAcquired(String authCookie) {
mwApi.setAuthCookie(authCookie);

View file

@ -26,7 +26,6 @@ import java.util.regex.Pattern;
import javax.inject.Inject;
import javax.inject.Named;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.HandlerService;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
@ -35,7 +34,6 @@ import fr.free.nrw.commons.contributions.Contribution;
import fr.free.nrw.commons.contributions.ContributionsActivity;
import fr.free.nrw.commons.contributions.ContributionsContentProvider;
import fr.free.nrw.commons.modifications.ModificationsContentProvider;
import fr.free.nrw.commons.mwapi.EventLog;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import fr.free.nrw.commons.mwapi.UploadResult;
import timber.log.Timber;
@ -258,27 +256,12 @@ public class UploadService extends HandlerService<Contribution> {
String resultStatus = uploadResult.getResultStatus();
if (!resultStatus.equals("Success")) {
showFailedNotification(contribution);
EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("source", contribution.getSource())
.param("multiple", contribution.getMultiple())
.param("result", uploadResult.getErrorCode())
.param("filename", contribution.getFilename())
.log();
} else {
contribution.setFilename(uploadResult.getCanonicalFilename());
contribution.setImageUrl(uploadResult.getImageUrl());
contribution.setState(Contribution.STATE_COMPLETED);
contribution.setDateUploaded(uploadResult.getDateUploaded());
contribution.save();
EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("source", contribution.getSource()) //FIXME
.param("filename", contribution.getFilename())
.param("multiple", contribution.getMultiple())
.param("result", "success")
.log();
}
} catch (IOException e) {
Timber.d("I have a network fuckup");

View file

@ -203,4 +203,5 @@
<string name="login_to_your_account">Log ind på din konto</string>
<string name="nearby_location_has_not_changed">Sted er ikke ændret.</string>
<string name="nearby_location_not_available">Sted ikke tilgængeligt.</string>
<string name="location_permission_rationale_nearby">Tilladelse kræves for at vise en liste over steder i nærheden</string>
</resources>

View file

@ -203,4 +203,5 @@
<string name="login_to_your_account">Comezar sesión na súa conta</string>
<string name="nearby_location_has_not_changed">A localización non cambiou.</string>
<string name="nearby_location_not_available">A localización non está dispoñible.</string>
<string name="location_permission_rationale_nearby">Precísase permiso para amosar unha lista de lugares preto de aquí</string>
</resources>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" fuzzy="true">विकिमीडिया कमन्स</string>
<string name="app_name">कमन्स</string>
<string name="menu_settings">सेटिङ्गहरू</string>
<string name="username">प्रयोगकर्ता नाम</string>
<string name="password">पासवर्ड</string>
@ -43,7 +43,7 @@
<string name="categories_search_text_hint">खोज श्रेणीहरू</string>
<string name="menu_save_categories">संग्रह गर्ने</string>
<string name="categories_not_found">मिल्दो वर्ग %1$s फेला परेन</string>
<string name="categories_skip_explanation">विकिमडिया कमन्समा आफ्नो तस्वीरहरू थप भेट्टाउने बनाउन वर्नहरू थप्नुहोस।\n\nवर्गहरू थप्नको लागि टाइप गर्न सुरु गर्नुहोस्।\nयो चरण छोड्न यो सन्देशमा ट्याप गर्नुहोस् (वा पछाडि जाने थिच्नुहोस्)।</string>
<string name="categories_skip_explanation">विकिमिडिया कमन्समा आफ्नो तस्वीरहरू थप भेट्टाउने बनाउन श्रेणीहरू थप्नुहोस।\n\nश्रेणीहरू थप्नको लागि टाइप गर्न सुरु गर्नुहोस्।\nयो चरण छोड्न यो सन्देशमा ट्याप गर्नुहोस् (वा पछाडि जानेमा थिच्नुहोस्)।</string>
<string name="categories_activity_title">श्रेणीहरू</string>
<string name="title_activity_settings">सेटिङ्गहरू</string>
<string name="menu_about">बारेमा</string>
@ -76,8 +76,8 @@
<string name="license_name_cc_by_sa_3_0_ro">CC BY-SA ३. (रोमानिया)</string>
<string name="license_name_cc_by_3_0">CC BY-SA ३.</string>
<string name="license_name_cc_zero">CC शुन्य</string>
<string name="welcome_wikipedia_text">आफ्नो तस्वीरहरूको योगदान दिनुहोस्। विकिपीडिया लेखलाई जीवनमा आउन मद्दत गर्नुहोस्!</string>
<string name="welcome_wikipedia_subtext">विकिपीडियाका तस्वीरहरू विकिमीडिया कमन्सबाट आउँछन्।</string>
<string name="welcome_wikipedia_text">आफ्नो तस्वीरहरूको योगदान दिनुहोस्। विकिपिडियाका लेखलाई जीवनन्तता पाउन मद्दत गर्नुहोस्!</string>
<string name="welcome_wikipedia_subtext">विकिपिडियाका तस्विरहरू विकिमिडिया कमन्सबाट आउँछन्।</string>
<string name="welcome_copyright_text">तपाईंको तस्वीरहरूले संसारभरिका मानिसहरूलाई शिक्षित बनाउन मद्दत गर्छन्।</string>
<string name="welcome_copyright_subtext">तपाईंले इन्टरनेटमा भेट्टाउनुभएका कपिराइट भएका सामग्रीहरू साथै पोस्टरहरू, पुस्तक आवरणहरू, आदिका तस्वीरहरू रोक्नुहोस्।</string>
<string name="welcome_final_text">के तपाईंले कुरा बुझ्नु भए जस्तो लाग्छ ?</string>

View file

@ -116,12 +116,12 @@
<string name="license_name_cc_zero">CC Zero</string>
<string name="tutorial_1_text">Wikimedia Commons armazena a maioria das imagens que são usadas na Wikipédia.</string>
<string name="tutorial_1_subtext">As suas imagens ajudam a educar pessoas em todo o mundo!</string>
<string name="tutorial_2_text">Por favor, carregue apenas as imagens tiradas ou criadas por ti:</string>
<string name="tutorial_2_text">Por favor, carregue apenas imagens tiradas ou criadas exclusivamente por si:</string>
<string name="tutorial_2_subtext">- Objetos naturais (flores, animais, montanhas)\n- Objetos úteis (bicicletas, estações de comboio)\n- Pessoas famosas (o seu presidente da câmara, atletas olímpicos que conheça)</string>
<string name="tutorial_3_text">Por favor, NÃO carregue:</string>
<string name="tutorial_3_subtext">- Autorretratos ou imagens dos seus amigos\n- Imagens descarregadas da internet\n- Capturas de ecrã de aplicações com direitos de autor</string>
<string name="tutorial_3_subtext">- Autorretratos ou imagens dos seus amigos\n- Imagens descarregadas da Internet\n- Capturas de ecrã de aplicações com direitos de autor</string>
<string name="tutorial_4_text">Exemplo de carregamento:</string>
<string name="tutorial_4_subtext">- Título: Ópera de Sydney\n- Descrição: A Ópera de Sydney vista em toda a baía\n- Categorias: Sydney Opera House, Sydney Opera House from the west, Sydney Opera House remote views</string>
<string name="tutorial_4_subtext">- Título: Ópera de Sydney\n- Descrição: A Ópera de Sydney vista do outro lado da baía\n- Categorias: Ópera de Sydney, Ópera de Sydney vista de ocidente, Vistas à distância da Ópera de Sydney</string>
<string name="welcome_wikipedia_text">Contribua com as suas imagens. Ajude os artigos da Wikipédia a ganhar vida!</string>
<string name="welcome_wikipedia_subtext">As imagens na Wikipédia provêm do Wikimedia Commons.</string>
<string name="welcome_copyright_text">As suas imagens ajudam a educar as pessoas em todo o mundo.</string>
@ -134,32 +134,32 @@
<string name="detail_description_empty">Sem descrição</string>
<string name="detail_license_empty">Licença desconhecida</string>
<string name="menu_refresh">Actualizar</string>
<string name="read_storage_permission_rationale">Permissão necessária: Ler a armazenagem externa. A aplicação não pode funcionar sem isso.</string>
<string name="write_storage_permission_rationale">Permissão necessária: Escrever na armazenagem externa. A aplicação não pode funcionar sem isso.</string>
<string name="location_permission_rationale">Permissão opcional: Obter a localização atual para sugerir categorias</string>
<string name="read_storage_permission_rationale">Permissão necessária: Ler a armazenagem externa. A aplicação não pode funcionar sem isto.</string>
<string name="write_storage_permission_rationale">Permissão necessária: Escrever na armazenagem externa. A aplicação não pode funcionar sem isto.</string>
<string name="location_permission_rationale">Permissão opcional: Obter a localização atual para sugestões de categoria</string>
<string name="ok">OK</string>
<string name="title_activity_nearby">Locais Próximos</string>
<string name="no_nearby">Não foram encontrados locais próximos.</string>
<string name="warning">Aviso</string>
<string name="file_exists">Este ficheiro já existe no Commons. Tem certeza de que deseja continuar?</string>
<string name="file_exists">Este ficheiro já existe no Commons. Tem a certeza de que deseja continuar?</string>
<string name="yes">Sim</string>
<string name="no">Não</string>
<string name="media_detail_title">Título</string>
<string name="media_detail_media_title">Título do ficheiro multimédia</string>
<string name="media_detail_description">Descrição</string>
<string name="media_detail_description_explanation">Aqui vai a descrição do ficheiro multimédia. Potencialmente, pode ser demasiado longo, e precisará ser agrupado em várias linhas. Esperamos que seja agradável.</string>
<string name="media_detail_description_explanation">A descrição do ficheiro multimédia é colocada aqui. Ela pode ser bastante longa e precisar de ser dividida em várias linhas. No entanto, esperamos que tenha bom aspeto.</string>
<string name="media_detail_uploaded_date">Data de carregamento</string>
<string name="media_detail_license">Licença</string>
<string name="media_detail_coordinates">Coordenadas</string>
<string name="media_detail_coordinates_empty">Não fornecido</string>
<string name="become_a_tester_title">Torne-se um Testador Beta</string>
<string name="become_a_tester_description">Entre no nosso canal beta na Google Play e obtenha acesso rápido a novas funcionalidades e correções de erros</string>
<string name="become_a_tester_description">Opte pelo nosso canal beta no Google Play e obtenha acesso antecipado a novas funcionalidades e a correções de erros</string>
<string name="use_wikidata">Utilizar o Wikidata</string>
<string name="use_wikidata_summary">(Aviso: desabilitar isso pode causar um grande consumo de dados móveis)</string>
<string name="use_wikidata_summary">(Aviso: desativar isto pode causar um grande consumo de dados móveis)</string>
<string name="_2fa_code">Código de autenticação de dois fatores</string>
<string name="number_of_uploads">Meu limite de carregamentos recentes</string>
<string name="number_of_uploads">O meu limite de carregamentos recentes</string>
<string name="maximum_limit">Limite máximo</string>
<string name="maximum_limit_alert">Não é possível visualizar mais de 500.</string>
<string name="maximum_limit_alert">Não é possível apresentar mais de 500</string>
<string name="set_limit">Definir o limite de carregamentos recentes</string>
<string name="login_failed_2fa_not_supported">Atualmente, a autenticação de dois fatores não é suportada.</string>
<string name="logout_verification">Deseja realmente sair?</string>
@ -188,19 +188,20 @@
<string name="navigation_item_feedback">Comentários</string>
<string name="navigation_item_logout">Sair</string>
<string name="navigation_item_info">Tutorial</string>
<string name="nearby_needs_permissions">Os sítios próximos não podem ser visualizados sem permissões de localização</string>
<string name="no_description_found">descrição não encontrada</string>
<string name="nearby_needs_permissions">Os sítios aqui perto não podem ser apresentados sem permissões de localização</string>
<string name="no_description_found">não foi encontrada nenhuma descrição</string>
<string name="nearby_info_menu_commons_article">Página do ficheiro no Commons</string>
<string name="nearby_info_menu_wikidata_article">Item do Wikidata</string>
<string name="error_while_cache">Erro durante a cache de imagens</string>
<string name="error_while_cache">Erro ao colocar imagens na cache</string>
<string name="title_info">Um título descritivo exclusivo para o ficheiro, que servirá como um nome de ficheiro. Pode utilizar uma linguagem simples com espaços. Não inclua a extensão do ficheiro</string>
<string name="description_info">Por favor, descreva o ficheiro da melhor forma possível: Onde foi tirado? O que isso mostra? Qual é o contexto? Por favor, descreva os objetos ou as pessoas. Indique as informações que não podem ser facilmente adivinhadas, por exemplo, a hora do dia, se for uma paisagem. Se o ficheiro mostrar algo incomum, explique o que torna incomum.</string>
<string name="give_permission">Permitir</string>
<string name="use_external_storage">Utilizar a armazenagem externa</string>
<string name="use_external_storage_summary">Gravar as fotografias tiradas com a câmara na aplicação do seu dispositivo</string>
<string name="send_log_file">Carregar ficheiro de registo</string>
<string name="send_log_file_description">Carregar ficheiro de registo para programadores por correio eletrónico</string>
<string name="use_external_storage_summary">Gravar as fotografias tiradas com a câmara da aplicação no seu dispositivo</string>
<string name="send_log_file">Enviar ficheiro de registo</string>
<string name="send_log_file_description">Enviar o ficheiro de registo aos programadores por correio eletrónico</string>
<string name="login_to_your_account">Inicie sessão na sua conta</string>
<string name="nearby_location_has_not_changed">A localização não foi alterada.</string>
<string name="nearby_location_not_available">A localização não está disponível.</string>
<string name="location_permission_rationale_nearby">É necessária a permissão para mostrar uma lista dos sítios aqui perto</string>
</resources>

View file

@ -53,7 +53,7 @@
<string name="categories_search_text_hint">Пошук категорій</string>
<string name="menu_save_categories">Зберегти</string>
<string name="refresh_button">Оновити</string>
<string name="gps_disabled">GPS вимкнено на Вашому пристрої. Чи хотіли б Ви його увімкнути?</string>
<string name="gps_disabled">GPS вимкнено на Вашому пристрої. Бажаєте увімкнути його?</string>
<string name="enable_gps">Увімкнути GPS</string>
<string name="contributions_subtitle_zero">Ще нема завантажень</string>
<plurals name="contributions_subtitle">
@ -209,4 +209,5 @@
<string name="send_log_file">Надіслати лог-файл</string>
<string name="send_log_file_description">Надіслати лог-файл розробникам електронною поштою</string>
<string name="login_to_your_account">Увійдіть у свій обліковий запис</string>
<string name="nearby_location_has_not_changed">Розташування не змінено</string>
</resources>

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 763 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB