diff --git a/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java b/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java
index fa7faeaf1..22d9590b0 100644
--- a/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java
+++ b/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java
@@ -29,13 +29,16 @@ import java.util.Map;
/**
* Manages the state of APKs that are being installed or that have updates available.
+ * This also ensures the state is saved across F-Droid restarts, and repopulates
+ * based on {@link org.fdroid.fdroid.data.Schema.InstalledAppTable} data, APKs that
+ * are present in the cache, and the {@code apks-pending-install}
+ * {@link SharedPreferences} instance.
*
- * The full URL for the APK file to download is used as the unique ID to
- * represent the status of the APK throughout F-Droid. The full download URL is guaranteed
- * to be unique since it points to files on a filesystem, where there cannot be multiple files with
- * the same name. This provides a unique ID beyond just {@code packageName}
- * and {@code versionCode} since there could be different copies of the same
- * APK on different servers, signed by different keys, or even different builds.
+ * As defined in {@link org.fdroid.fdroid.installer.InstallManagerService}, the
+ * canonical URL for the APK file to download is used as the unique ID to represent
+ * the status of the APK throughout F-Droid.
+ *
+ * @see org.fdroid.fdroid.installer.InstallManagerService
*/
public final class AppUpdateStatusManager {
@@ -370,7 +373,7 @@ public final class AppUpdateStatusManager {
public void removeApk(String key) {
synchronized (appMapping) {
- AppUpdateStatus entry = appMapping.get(key);
+ AppUpdateStatus entry = appMapping.remove(key);
if (entry != null) {
Utils.debugLog(LOGTAG, "Remove APK " + entry.apk.apkName);
notifyRemove(entry);
@@ -556,8 +559,8 @@ public final class AppUpdateStatusManager {
*
* @see #isPendingInstall(String)
*/
- public void markAsPendingInstall(String uniqueKey) {
- AppUpdateStatus entry = get(uniqueKey);
+ public void markAsPendingInstall(String urlString) {
+ AppUpdateStatus entry = get(urlString);
if (entry != null) {
Utils.debugLog(TAG, "Marking " + entry.apk.packageName + " as pending install.");
apksPendingInstall.edit().putBoolean(entry.apk.hash, true).apply();
@@ -568,8 +571,8 @@ public final class AppUpdateStatusManager {
* @see #markAsNoLongerPendingInstall(AppUpdateStatus)
* @see #isPendingInstall(String)
*/
- public void markAsNoLongerPendingInstall(String uniqueKey) {
- AppUpdateStatus entry = get(uniqueKey);
+ public void markAsNoLongerPendingInstall(String urlString) {
+ AppUpdateStatus entry = get(urlString);
if (entry != null) {
markAsNoLongerPendingInstall(entry);
}
diff --git a/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusService.java b/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusService.java
index dc5740d0e..3179c7a65 100644
--- a/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusService.java
+++ b/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusService.java
@@ -20,13 +20,15 @@ import java.util.ArrayList;
import java.util.List;
/**
- * Scans the list of downloaded .apk files in the cache for each app which can be updated.
- * If a valid .apk file is found then it will tell the {@link AppUpdateStatusManager} that it is
- * {@link AppUpdateStatusManager.Status#ReadyToInstall}. This is an {@link IntentService} so as to
- * run on a background thread, as it hits the disk a bit to figure out the hash of each downloaded
- * file.
+ * Scans the list of downloaded .apk files in the cache. This info is used to
+ * determine if an APK is ready to install. When a valid .apk file is found,
+ * this checks whether that APK is already installed, and whether the user's
+ * install request is still active. If all those are true, then this tells the
+ * {@link AppUpdateStatusManager} that the APK is
+ * {@link AppUpdateStatusManager.Status#ReadyToInstall}. This is an
+ * {@link IntentService} so as to run on a background thread, as it hits the
+ * disk a bit to figure out the hash of each downloaded file.
*/
-@SuppressWarnings("LineLength")
public class AppUpdateStatusService extends IntentService {
private static final String TAG = "AppUpdateStatusService";
@@ -54,6 +56,7 @@ public class AppUpdateStatusService extends IntentService {
if (cacheDirList == null) {
return;
}
+ PackageManager packageManager = getPackageManager();
List apksReadyToInstall = new ArrayList<>();
for (String repoDirName : cacheDirList) {
File repoDir = new File(cacheDir, repoDirName);
@@ -64,14 +67,23 @@ public class AppUpdateStatusService extends IntentService {
for (String apkFileName : apks) {
Apk apk = processDownloadedApk(new File(repoDir, apkFileName));
if (apk != null) {
- Log.i(TAG, "Found downloaded apk " + apk.packageName + ". Notifying user that it should be installed.");
- apksReadyToInstall.add(apk);
+ PackageInfo packageInfo = null;
+ try {
+ packageInfo = packageManager.getPackageInfo(apk.packageName, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ // ignored
+ }
+ if (packageInfo == null || packageInfo.versionCode != apk.versionCode) {
+ Utils.debugLog(TAG, "Marking downloaded apk " + apk.apkName + " as ReadyToInstall");
+ apksReadyToInstall.add(apk);
+ }
}
}
}
if (apksReadyToInstall.size() > 0) {
- AppUpdateStatusManager.getInstance(this).addApks(apksReadyToInstall, AppUpdateStatusManager.Status.ReadyToInstall);
+ AppUpdateStatusManager.getInstance(this).addApks(apksReadyToInstall,
+ AppUpdateStatusManager.Status.ReadyToInstall);
InstallManagerService.managePreviouslyDownloadedApks(this);
}
}
@@ -100,21 +112,25 @@ public class AppUpdateStatusService extends IntentService {
return null;
}
- PackageInfo downloadedInfo = getPackageManager().getPackageArchiveInfo(apkPath.getAbsolutePath(), PackageManager.GET_GIDS);
+ PackageInfo downloadedInfo = getPackageManager().getPackageArchiveInfo(apkPath.getAbsolutePath(),
+ PackageManager.GET_GIDS);
if (downloadedInfo == null) {
Log.i(TAG, "Skipping " + apkPath + " because PackageManager was unable to read it.");
return null;
}
- Utils.debugLog(TAG, "Found package for " + downloadedInfo.packageName + ", checking its hash to see if it downloaded correctly.");
+ Utils.debugLog(TAG, "Found package for " + downloadedInfo.packageName + ':' + downloadedInfo.versionCode
+ + ", checking its hash to see if it downloaded correctly.");
Apk downloadedApk = findApkMatchingHash(apkPath);
if (downloadedApk == null) {
- Log.i(TAG, "Either the apk wasn't downloaded fully, or the repo it came from has been disabled. Either way, not notifying the user about it.");
+ Log.i(TAG, "Either the apk wasn't downloaded fully, or the repo it came from has been disabled. "
+ + "Either way, not notifying the user about it.");
return null;
}
if (!AppUpdateStatusManager.getInstance(this).isPendingInstall(downloadedApk.hash)) {
- Log.i(TAG, downloadedApk.packageName + " is NOT pending install, probably just left over from a previous install.");
+ Log.i(TAG, downloadedApk.packageName + ':' + downloadedApk.versionCode
+ + " is NOT pending install, probably just left over from a previous install.");
return null;
}
@@ -124,14 +140,16 @@ public class AppUpdateStatusService extends IntentService {
if (pathToInstalled != null && pathToInstalled.canRead() &&
pathToInstalled.length() == downloadedApk.size && // Check size before hash for performance.
TextUtils.equals(Utils.getBinaryHash(pathToInstalled, "sha256"), downloadedApk.hash)) {
- Log.i(TAG, downloadedApk.packageName + " is pending install, but we already have the correct version installed.");
+ Log.i(TAG, downloadedApk.packageName
+ + " is pending install, but we already have the correct version installed.");
AppUpdateStatusManager.getInstance(this).markAsNoLongerPendingInstall(downloadedApk.getUrl());
return null;
}
} catch (PackageManager.NameNotFoundException ignored) {
}
- Utils.debugLog(TAG, downloadedApk.packageName + " is pending install, so we need to notify the user about installing it.");
+ Utils.debugLog(TAG, downloadedApk.packageName + ':' + downloadedApk.versionCode
+ + " is pending install, so we need to notify the user about installing it.");
return downloadedApk;
}
diff --git a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java
index 654bbfc4f..f10754362 100644
--- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java
+++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java
@@ -40,7 +40,7 @@ import java.io.IOException;
* and then redeliver the {@link Intent} for us, which includes all of the data needed
* for {@code InstallManagerService} to do its job for the whole lifecycle of an install.
*
- * The full URL for the APK file to download is also used as the unique ID to
+ * The canonical URL for the APK file to download is also used as the unique ID to
* represent the download itself throughout F-Droid. This follows the model
* of {@link Intent#setData(Uri)}, where the core data of an {@code Intent} is
* a {@code Uri}. The full download URL is guaranteed to be unique since it
diff --git a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java
index 1c4a499f6..d6dea4384 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java
@@ -732,10 +732,11 @@ public class AppDetailsRecyclerViewAdapter
@Override
public void bindModel() {
+ Context context = headerView.getContext();
if (hasCompatibleApksDifferentSigs()) {
- headerView.setText("No versions with compatible signature");
+ headerView.setText(context.getString(R.string.app_details__no_versions__no_compatible_signatures));
} else {
- headerView.setText("No versions compatible with device");
+ headerView.setText(context.getString(R.string.app_details__no_versions__none_compatible_with_device));
}
}
diff --git a/app/src/main/java/org/fdroid/fdroid/views/updates/DismissResult.java b/app/src/main/java/org/fdroid/fdroid/views/updates/DismissResult.java
index c68870128..f37d58fb4 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/updates/DismissResult.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/updates/DismissResult.java
@@ -17,10 +17,6 @@ public class DismissResult {
this(null, false);
}
- public DismissResult(boolean requiresAdapterRefresh) {
- this(null, requiresAdapterRefresh);
- }
-
public DismissResult(@Nullable CharSequence message, boolean requiresAdapterRefresh) {
this.message = message;
this.requiresAdapterRefresh = requiresAdapterRefresh;
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 963cc14ef..aa2b6cb48 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -147,7 +147,7 @@
توافق التطبيق
إصدارات غير متوافقة
- إظهار إصدارات التطبيق غير متوافقة مع الجهاز
+ إظهار إصدارات التطبيق غير المتوافقة مع الجهاز
تجاهل صلاحيات الجذر
لا تخفي أصل التطبيقات التي تتطلب امتيازات الجذر
تجاهل الشاشات التي تعمل باللمس
@@ -518,4 +518,9 @@
إخفاء %s
التطبيق سوف يخفي نفسه
-
+Liberapay
+
+ تذكر كيفية الإسترجاع
+ الحاسبة
+ إخفاء %s الآن
+
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
index 21d71c93e..fea3a0a1c 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -587,4 +587,5 @@
Liberapay
-
+Ваша камеры не падтрымлівае аўтафокус. Сканаванне кода можа быць абцяжаранае.
+
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index cef3bbc4e..2b4bd81f5 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -557,4 +557,5 @@
Liberapay
-
+Vypadá to, že váš fotoaparát nemá automatické zaostřování. Oskenování kódu může být obtížné.
+
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index a09bd0281..3e1779617 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -552,4 +552,5 @@
Liberapay
Sicherungsmethode beibehalten
-
+Ihre Kamera scheint keinen Autofokus zu haben. Es könnte schwierig sein, den Code zu scannen.
+
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index 80432f4fa..c30e3d2ea 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -535,4 +535,5 @@
Liberapay
-
+Via fotilo ne havas memfokuson. Povas esti malfacile skani la kodon.
+
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 695c46e29..adaed1071 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -80,8 +80,7 @@
Buscar aplicaciones
Compatibilidad de aplicaciones
Versiones incompatibles
- Mostrar las versiones de aplicaciones incompatibles con el dispositivo
-
+ Mostrar las versiones incompatibles de las aplicaciones
Obviar permisos de administración
No marcar en gris las aplicaciones que piden permisos de administraciónroot)
Ignorar pantalla táctil
@@ -336,7 +335,7 @@
Escribir al autor por correo electrónico
Deteniendo la Wi-Fi…
Usar Tor
- Forzar el tráfico de bajada a través de Tor para mejorar la privacidad. Requiere Orbot
+ Forzar el tráfico de descarga a través de Tor para mejorar la privacidad. Requiere Orbot
Repositorio: %s
Obtenga actualizaciones automáticamente
@@ -540,4 +539,19 @@
Ocultar %s
La aplicación se ocultará
-
+Ordenar resultados
+
+ Liberapay
+
+ Recordar cómo restaurar
+ En un momento de pánico, se eliminará %1$s de la pantalla de inicio. Solo se restaurará escribiendo \"%2$d\" en la apli falsa %3$s.
+
+ Calculadora
+ Ocultar %s ahora
+ ¿Seguro que quieres eliminar %1$s de la pantalla de inicio? Solo se restaurará escribiendo \"%2$d\" en la apli falsa %3$s.
+ Atención: se eliminará también cualquier atajo de la aplicación en la pantalla de inicio y tendrá que añadirse manualmente.
+ Ocultar con el botón de búsqueda
+ Manteniendo pulsado el botón de búsqueda se ocultará la aplicación
+
+ Parece que tu cámara no tiene autoenfoque. Puede resultar difícil escanear el código.
+
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index 0e2980c28..e8cc56d90 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -546,4 +546,5 @@
Liberapay
-
+Su kaameral ei paista olevat automaatfokusseerimist. Koodi skannimine võib olla keeruline.
+
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index feb1b6dd7..65b85df54 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -573,4 +573,5 @@
Ordenatu bilaketa
Liberapay
-
+Zure kamerak ez du fokatze automatikorako gaitasunik. Kodea eskaneatzea zaila izan daiteke.
+
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 059819f01..e816871c1 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -517,4 +517,5 @@
لیبراپی
-
+به نظر نمیرسد دوربینتان از تمرکز خودکار پشتیبانی کند. ممکن است پویش رمز سخت باشد.
+
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index ff30f232f..0d9e72f14 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -557,4 +557,5 @@
Cacher à l\'aide du bouton de recherche
Appuyez longuement sur le bouton de recherche pour cacher l\'application
-
+Votre appareil-photo n’a pas de mise au point automatique. Il sera peut-être difficile de scanner le code.
+
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
index 1a093bb3e..db042bb4d 100644
--- a/app/src/main/res/values-he/strings.xml
+++ b/app/src/main/res/values-he/strings.xml
@@ -543,4 +543,5 @@
Liberapay
-
+כנראה שלמצלמה שלך אין מיקוד אוטומטי. סריקת הקוד עשויה להוות מכשול.
+
diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml
index 371340680..6702a349f 100644
--- a/app/src/main/res/values-is/strings.xml
+++ b/app/src/main/res/values-is/strings.xml
@@ -586,4 +586,5 @@
Raða leit
Liberapay
-
+Það lítur út eins og myndavélin þín sé ekki með sjálfvirkan fókus. Það gæti orðið vandkvæðum bundið að skanna kóðann.
+
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 633c8744f..df3f5d324 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -76,10 +76,10 @@
アプリの互換性
互換性の無いバージョン
端末と互換性のないバージョンを表示します
- rootアプリを無視する
+ rootアプリ
root権限を要求するアプリを表示します
- タッチスクリーンを無視する
- タッチスクリーンを要求するアプリを常に表示します
+ タッチスクリーンを使用するアプリ
+ ハードウェアでサポートされていない場合でも、タッチスクリーンの使用を要求するアプリを表示します
ローカルリポジトリ
F-Droidは交換の準備ができました
タッチすると詳細を表示し、アプリの交換ができるようになります。
@@ -143,8 +143,8 @@
セキュリティ
システム
root権限の要求中
- root権限での接続が拒絶されました
- この端末はroot化されていないか、F-Droidのrootアクセスが拒絶されました。
+ rootへのアクセスが拒否されました
+ この端末はroot化されていないか、F-Droidのrootへのアクセスが拒否されました。
友だちがF-DroidとNFCを持っているなら、一緒にお使いの端末をタッチしてください。
友達として同じWi-Fiに参加
アプリの交換
@@ -324,8 +324,8 @@
インストール中
アンインストール中
- 対策機能のアプリををグレーアウト
- 対策機能を必要とするアプリを隠します
+ 好ましくない機能を使用するアプリ
+ 好ましくない機能の使用を必要とするアプリを隠します
自動的に更新をインストール
バックグラウンドでアプリのアップデートをダウンロードしてインストールします
インストール履歴を保存する
@@ -402,7 +402,7 @@
バージョン%sの新機能
このアプリは好ましくない機能を含んでいるかもしれません。
- 対策機能
+ 好ましくない機能
- %1$d日前に更新しました
@@ -465,10 +465,10 @@
無視する
プライバシー
- スクリーンショットを防止
+ スクリーンショットの防止
スクリーンショットの撮影を防止するとともに、アプリ履歴にアプリの内容が表示されないようにします
- パニックボタンアプリ
+ パニックボタンのアプリ
不明のアプリ
アプリが設定されていません
なし
@@ -476,7 +476,7 @@
%1$sを破壊的なパニックボタンとして動作させることを許可してもよろしいですか?
許可
- パニックボタン設定
+ パニックボタンの設定
緊急時のアクション
アプリを終了
アプリを閉じます
@@ -497,4 +497,5 @@
Liberapay
-
+お使いのカメラはオートフォーカスがないようです。コードをスキャンするのが難しいことがあるかもしれません。
+
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index fe508e723..8e38930fd 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -544,4 +544,9 @@
Skjul med søke-knappen
Å trykke lenge på søkeknappen vil skjule programmet
-
+Sorter søk
+
+ Liberapay
+
+ Kameraet ditt mangler autofokus. Det kan vise seg vanskelig å skanne koden.
+
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 1f9d1bd87..851f8b5a6 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -534,4 +534,5 @@
Liberapay
-
+Je camera lijkt niet over autofocus te beschikken. Het scannen van de code kan moeilijk zijn.
+
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 9b45f4d7a..bf6fbb51a 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -564,4 +564,5 @@
Liberapay
-
+Twój aparat nie posiada autofokusu. Mogą wystąpić trudności ze zeskanowaniem kodu.
+
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 5431882d4..c7c9d5f00 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -560,4 +560,9 @@
Esconder o botão de busca
Pressionar o botão de busca por um tempo longo vai esconder o app
-
+Classificação da pesquisa
+
+ Liberapay
+
+ Sua câmera não parece ter focagem automática. Pode ser difícil escanear o código.
+
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 896b953cc..90dcb3439 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -510,4 +510,5 @@
Sigur doriți să eliminați %1$s din lansator? Doar scriind \"%2$d\" în aplicația falsă %3$s veți putea să o restaurați.
Atenție: Orice scurtătură din ecranul de pornire va fi de asemenea eliminată și va trebui adăugată din nou manual.
Aplicația va fi ascunsă dacă se apasă lung butonul de căutare
-
+Camera foto a dispozitivului nu pare să suporte focalizare automată. Ar putea fi dificil să se scaneze codul.
+
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index bae9ee11a..6506c2f07 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -545,4 +545,5 @@
Скрыть с помощью кнопки поиска
Длительное нажатие кнопки поиска скроет приложение
-
+Ваша камера не поддерживает автофокус. Сканирование кода может быть затруднено.
+
diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml
index e5f313732..7a15225c1 100644
--- a/app/src/main/res/values-sc/strings.xml
+++ b/app/src/main/res/values-sc/strings.xml
@@ -562,11 +562,11 @@
S\'aplicatzione s\'at a istichire
Ammenta comente ripristinare
- In casu de un\'eventu de pànicu, custu at a bogare %1$s dae su \"launcher\". Petzi incarchende \"%2$d\" in s\'aplicatzione frassa %3$s l\'as a pòdere ripristinare.
+ In casu de un\'eventu de pànicu, custu at a bogare %1$s dae su \"launcher\" (s\'afiladore). Petzi incarchende \"%2$d\" in s\'aplicatzione frassa %3$s l\'as a pòdere ripristinare.
Calcolatrice
Istichi %s como
- Seguru ses de chèrrere bogare %1$s dae su \"launcher\"? Petzi incarchende \"%2$d\" in s\'aplicatzione frassa %3$s l\'as a pòdere ripristinare.
+ Seguru ses de chèrrere bogare %1$s dae su \"launcher\" (s\'afiladore)? Petzi incarchende \"%2$d\" in s\'aplicatzione frassa %3$s l\'as a pòdere ripristinare.
Atentzione: Fintzas cale si siat incurtzada in s\'ischermada printzipale at a èssere bogada e b\'at a dèpere èssere torrada a pònnere manualmente.
Istichi cun su butone de chirca
Un\'incarcada longa in su butone de chirca at a istichire s\'aplicatzione
@@ -574,4 +574,5 @@
Liberapay
-
+Paret chi sa fotocàmera tua non tèngiat su focus automàticu. Diat pòdere èssere difìtzile a iscansire su còdighe.
+
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index e201fa089..aa07e5609 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -544,4 +544,5 @@
Liberapay
-
+Kameranızın kendiliğinden odaklanması yok gibi görünüyor. Kodu taramak zor olabilir.
+
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 96efff5a9..8315fd3a3 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -214,7 +214,7 @@
Вигляд
Несумісні версії
- Показувати версії застосунків, які несумісні з пристроєм
+ Показувати версії застосунків, які несумісні з цим пристроєм
F-Droid готовий до обміну
Запис підписаного файлу індексу (index.jar)…
Включення APK-файлів до репозиторію…
@@ -528,4 +528,22 @@
Вийти з додатку
Приховати %s
-
+Розсортувати за пошуком
+
+ Liberapay
+
+ Блокує знімки екрану та приховує вміст з останніх додатків
+
+ Вибір тривожної кнопки
+ Підтвердити тривожну кнопку
+ Ви впевнені, що бажаєте дозволити %1$s виконувати дію тривожної кнопки?
+ Налаштування тривожної кнопки
+ Заходи, які необхідно прийняти в екстерних випадках
+ Додаток буде закрито
+ Деструктивні дії
+ Додаток приховає себе
+ Запам\'ятайте, як відновити
+ Калькулятор
+ Приховати %s зараз
+ Приховати за допомогою кнопки пошуку
+
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index f58e03b1a..a840b4119 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -72,8 +72,8 @@
显示与该设备不兼容的应用程序版本
忽略 root
不以灰色显示需要 root 权限的应用程序
- 忽略触屏应用
- 总是包含需要触屏的应用程序
+ 包含触屏应用
+ 总是展示需要触屏的应用程序,无论硬件是否支持
本地软件源
正在删除当前软件源…
图标
@@ -346,7 +346,7 @@
可更新
安装失败
给%1$s的开发者买一杯咖啡吧!
- %2$s是%1$s的开发者,给他們买一杯咖啡吧!
+ %2$s 是 %1$s 的开发者,给他们买一杯咖啡吧!
版本%1$s可用
版本%1$s
@@ -485,13 +485,14 @@
确认紧急应用
危险动作
请记住如何还原
- 在紧急情况下,这从启动器中移除 %1$s。只有在假的 %3$s 应用中输入“%2$d”才能恢复它。
+ 在紧急情况下,这将从启动器中移除 %1$s。只有在假的 %3$s 应用中输入“%2$d”才能恢复它。
计算器
立即隐藏 %s
确定要从启动器中移除 %1$s 吗?只有在假的 %3$s 应用中输入“%2$d”才能恢复它。
- 警告:主屏幕上的任何应用捷径也将被移除,需要手动重新添加。
+ 警告:主屏幕上的任何应用快捷方式也将被移除,需要手动重新添加。
用搜索按钮隐藏
长按搜索按钮将隐藏此应用
-
+您的相机似乎没有自动对焦。扫描二维码可能较为困难。
+
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 8e0afeb6b..e2cb28416 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -510,4 +510,5 @@
Liberapay
-
+您的相機似乎沒有自動對焦。掃描代碼可能會很困難。
+