Compare commits

..

No commits in common. "master" and "1.13-alpha0" have entirely different histories.

137 changed files with 3830 additions and 1986 deletions

View File

@ -1,11 +1,3 @@
### 1.13-alpha1 (2021-06-02)
* Stop repeated updates of Trichrome Library
* More changes to follow Material Design (@proletarius101)
* Improve OpenCollective badge (@ConnyDuck)
### 1.13-alpha0 (2021-04-22) ### 1.13-alpha0 (2021-04-22)
* Theme support tied to built-in Android themes (@proletarius101) * Theme support tied to built-in Android themes (@proletarius101)

View File

@ -1,6 +1,6 @@
# F-Droid Client # F-Droid Client
[![build status](https://gitlab.com/fdroid/fdroidclient/badges/master/pipeline.svg)](https://gitlab.com/fdroid/fdroidclient/-/jobs) [![build status](https://gitlab.com/fdroid/fdroidclient/badges/master/build.svg)](https://gitlab.com/fdroid/fdroidclient/builds)
[![Translation status](https://hosted.weblate.org/widgets/f-droid/-/svg-badge.svg)](https://hosted.weblate.org/engage/f-droid/) [![Translation status](https://hosted.weblate.org/widgets/f-droid/-/svg-badge.svg)](https://hosted.weblate.org/engage/f-droid/)
Client for [F-Droid](https://f-droid.org), the Free Software repository system Client for [F-Droid](https://f-droid.org), the Free Software repository system

View File

@ -21,16 +21,16 @@ def basicApplicationId = "org.fdroid.basic"
def privilegedExtensionApplicationId = '"org.fdroid.fdroid.privileged"' def privilegedExtensionApplicationId = '"org.fdroid.fdroid.privileged"'
android { android {
compileSdkVersion 30 compileSdkVersion 29
defaultConfig { defaultConfig {
versionCode 1013001 versionCode 1013000
versionName getVersionName() versionName getVersionName()
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
minSdkVersion 24 minSdkVersion 22
//noinspection ExpiredTargetSdkVersion //noinspection ExpiredTargetSdkVersion
targetSdkVersion 28 targetSdkVersion 25
/* /*
The Android Testing Support Library collects analytics to continuously improve the testing The Android Testing Support Library collects analytics to continuously improve the testing
experience. More specifically, it uploads a hash of the package name of the application experience. More specifically, it uploads a hash of the package name of the application
@ -142,9 +142,10 @@ android {
} }
dependencies { dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.preference:preference:1.1.1' implementation 'androidx.preference:preference:1.1.1'
implementation 'androidx.gridlayout:gridlayout:1.0.0' implementation 'androidx.gridlayout:gridlayout:1.0.0'
implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.vectordrawable:vectordrawable:1.1.0' implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
@ -152,19 +153,18 @@ dependencies {
implementation 'androidx.palette:palette:1.0.0' implementation 'androidx.palette:palette:1.0.0'
implementation 'androidx.work:work-runtime:2.4.0' implementation 'androidx.work:work-runtime:2.4.0'
implementation 'com.google.android.material:material:1.3.0' implementation 'com.google.android.material:material:1.1.0'
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
implementation 'com.google.zxing:core:3.3.3' implementation 'com.google.zxing:core:3.3.3'
implementation 'info.guardianproject.netcipher:netcipher:2.2.0-alpha' implementation 'info.guardianproject.netcipher:netcipher:2.0.0-beta1'
implementation 'info.guardianproject.panic:panic:1.0' implementation 'info.guardianproject.panic:panic:1.0'
implementation 'commons-io:commons-io:2.6' implementation 'commons-io:commons-io:2.6'
implementation 'commons-net:commons-net:3.6' implementation 'commons-net:commons-net:3.6'
implementation 'ch.acra:acra:4.9.1' implementation 'ch.acra:acra:4.9.1'
implementation 'io.reactivex:rxjava:1.1.0'
implementation 'com.hannesdorfmann:adapterdelegates3:3.0.1' implementation 'com.hannesdorfmann:adapterdelegates3:3.0.1'
implementation 'com.ashokvarma.android:bottom-navigation-bar:2.0.5'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
implementation 'io.reactivex.rxjava3:rxjava:3.0.9'
implementation 'com.fasterxml.jackson.core:jackson-core:2.11.1' implementation 'com.fasterxml.jackson.core:jackson-core:2.11.1'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.11.1' implementation 'com.fasterxml.jackson.core:jackson-annotations:2.11.1'

View File

@ -31,6 +31,13 @@
public *; public *;
} }
# The rxjava library depends on sun.misc.Unsafe, which is unavailable on Android
# The rxjava team is aware of this, and mention in the docs that they only use
# the unsafe functionality if the platform supports it.
# - https://github.com/ReactiveX/RxJava/issues/1415#issuecomment-48390883
# - https://github.com/ReactiveX/RxJava/blob/1.x/src/main/java/rx/internal/util/unsafe/UnsafeAccess.java#L23
-dontwarn rx.internal.util.**
-keepattributes *Annotation*,EnclosingMethod,Signature -keepattributes *Annotation*,EnclosingMethod,Signature
-keepnames class com.fasterxml.jackson.** { *; } -keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.ext.** -dontwarn com.fasterxml.jackson.databind.ext.**

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -28,7 +28,7 @@ import org.fdroid.fdroid.nearby.peers.Peer;
import java.util.ArrayList; import java.util.ArrayList;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.material.switchmaterial.SwitchMaterial; import androidx.appcompat.widget.SwitchCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import cc.mvdan.accesspoint.WifiApControl; import cc.mvdan.accesspoint.WifiApControl;
@ -79,7 +79,7 @@ public class StartSwapView extends SwapView {
@Nullable /* Emulators typically don't have bluetooth adapters */ @Nullable /* Emulators typically don't have bluetooth adapters */
private final BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter(); private final BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
private SwitchMaterial bluetoothSwitch; private SwitchCompat bluetoothSwitch;
private TextView viewBluetoothId; private TextView viewBluetoothId;
private TextView textBluetoothVisible; private TextView textBluetoothVisible;
private TextView viewWifiId; private TextView viewWifiId;
@ -175,7 +175,7 @@ public class StartSwapView extends SwapView {
textBluetoothVisible = findViewById(R.id.bluetooth_visible); textBluetoothVisible = findViewById(R.id.bluetooth_visible);
bluetoothSwitch = (SwitchMaterial) findViewById(R.id.switch_bluetooth); bluetoothSwitch = (SwitchCompat) findViewById(R.id.switch_bluetooth);
bluetoothSwitch.setOnCheckedChangeListener(onBluetoothSwitchToggled); bluetoothSwitch.setOnCheckedChangeListener(onBluetoothSwitchToggled);
bluetoothSwitch.setChecked(SwapService.getBluetoothVisibleUserPreference()); bluetoothSwitch.setChecked(SwapService.getBluetoothVisibleUserPreference());
bluetoothSwitch.setEnabled(true); bluetoothSwitch.setEnabled(true);

View File

@ -1,5 +1,6 @@
package org.fdroid.fdroid.nearby; package org.fdroid.fdroid.nearby;
import android.annotation.SuppressLint;
import android.app.Notification; import android.app.Notification;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.app.Service; import android.app.Service;
@ -12,17 +13,11 @@ import android.content.IntentFilter;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.net.Uri; import android.net.Uri;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.IBinder; import android.os.IBinder;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import androidx.core.app.ServiceCompat;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.NotificationHelper; import org.fdroid.fdroid.NotificationHelper;
import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Preferences;
@ -35,6 +30,7 @@ import org.fdroid.fdroid.data.Schema;
import org.fdroid.fdroid.nearby.peers.Peer; import org.fdroid.fdroid.nearby.peers.Peer;
import org.fdroid.fdroid.net.Downloader; import org.fdroid.fdroid.net.Downloader;
import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
@ -45,11 +41,13 @@ import java.util.Set;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import androidx.core.app.ServiceCompat;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import cc.mvdan.accesspoint.WifiApControl; import cc.mvdan.accesspoint.WifiApControl;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
/** /**
* Central service which manages all of the different moving parts of swap which are required * Central service which manages all of the different moving parts of swap which are required
@ -111,6 +109,46 @@ public class SwapService extends Service {
UpdateService.updateRepoNow(this, peer.getRepoAddress()); UpdateService.updateRepoNow(this, peer.getRepoAddress());
} }
@SuppressLint("StaticFieldLeak")
private void askServerToSwapWithUs(final Repo repo) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... args) {
String swapBackUri = Utils.getLocalRepoUri(FDroidApp.repo).toString();
HttpURLConnection conn = null;
try {
URL url = new URL(repo.address.replace("/fdroid/repo", "/request-swap"));
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream outputStream = conn.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(outputStream);
writer.write("repo=" + swapBackUri);
writer.flush();
writer.close();
outputStream.close();
int responseCode = conn.getResponseCode();
Utils.debugLog(TAG, "Asking server at " + repo.address + " to swap with us in return (by " +
"POSTing to \"/request-swap\" with repo \"" + swapBackUri + "\"): " + responseCode);
} catch (IOException e) {
Log.e(TAG, "Error while asking server to swap with us", e);
Intent intent = new Intent(Downloader.ACTION_INTERRUPTED);
intent.setData(Uri.parse(repo.address));
intent.putExtra(Downloader.EXTRA_ERROR_MESSAGE, e.getLocalizedMessage());
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
} finally {
if (conn != null) {
conn.disconnect();
}
}
return null;
}
}.execute();
}
private Repo ensureRepoExists(@NonNull Peer peer) { private Repo ensureRepoExists(@NonNull Peer peer) {
// TODO: newRepoConfig.getParsedUri() will include a fingerprint, which may not match with // TODO: newRepoConfig.getParsedUri() will include a fingerprint, which may not match with
// the repos address in the database. Not sure on best behaviour in this situation. // the repos address in the database. Not sure on best behaviour in this situation.
@ -304,15 +342,12 @@ public class SwapService extends Service {
@Nullable @Nullable
private Timer timer; private Timer timer;
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
public class Binder extends android.os.Binder { public class Binder extends android.os.Binder {
public SwapService getService() { public SwapService getService() {
return SwapService.this; return SwapService.this;
} }
} }
@Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
startForeground(NOTIFICATION, createNotification()); startForeground(NOTIFICATION, createNotification());
@ -362,45 +397,6 @@ public class SwapService extends Service {
BonjourManager.setVisible(this, getWifiVisibleUserPreference() || getHotspotActivatedUserPreference()); BonjourManager.setVisible(this, getWifiVisibleUserPreference() || getHotspotActivatedUserPreference());
} }
private void askServerToSwapWithUs(final Repo repo) {
compositeDisposable.add(
Completable.fromAction(() -> {
String swapBackUri = Utils.getLocalRepoUri(FDroidApp.repo).toString();
HttpURLConnection conn = null;
try {
URL url = new URL(repo.address.replace("/fdroid/repo", "/request-swap"));
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
try (OutputStream outputStream = conn.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(outputStream)) {
writer.write("repo=" + swapBackUri);
writer.flush();
}
int responseCode = conn.getResponseCode();
Utils.debugLog(TAG, "Asking server at " + repo.address + " to swap with us in return (by " +
"POSTing to \"/request-swap\" with repo \"" + swapBackUri + "\"): " + responseCode);
} finally {
if (conn != null) {
conn.disconnect();
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(e -> {
Intent intent = new Intent(Downloader.ACTION_INTERRUPTED);
intent.setData(Uri.parse(repo.address));
intent.putExtra(Downloader.EXTRA_ERROR_MESSAGE, e.getLocalizedMessage());
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
})
.subscribe()
);
}
/** /**
* This is for setting things up for when the {@code SwapService} was * This is for setting things up for when the {@code SwapService} was
* started by the user clicking on the initial start button. The things * started by the user clicking on the initial start button. The things
@ -424,8 +420,6 @@ public class SwapService extends Service {
@Override @Override
public void onDestroy() { public void onDestroy() {
compositeDisposable.dispose();
Utils.debugLog(TAG, "Destroying service, will disable swapping if required, and unregister listeners."); Utils.debugLog(TAG, "Destroying service, will disable swapping if required, and unregister listeners.");
Preferences.get().unregisterLocalRepoHttpsListeners(httpsEnabledListener); Preferences.get().unregisterLocalRepoHttpsListeners(httpsEnabledListener);
localBroadcastManager.unregisterReceiver(onWifiChange); localBroadcastManager.unregisterReceiver(onWifiChange);

View File

@ -34,18 +34,7 @@ import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.switchmaterial.SwitchMaterial;
import com.google.zxing.integration.android.IntentIntegrator; import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult; import com.google.zxing.integration.android.IntentResult;
@ -65,6 +54,7 @@ import org.fdroid.fdroid.net.BluetoothDownloader;
import org.fdroid.fdroid.net.Downloader; import org.fdroid.fdroid.net.Downloader;
import org.fdroid.fdroid.net.HttpDownloader; import org.fdroid.fdroid.net.HttpDownloader;
import org.fdroid.fdroid.qr.CameraCharacteristicsChecker; import org.fdroid.fdroid.qr.CameraCharacteristicsChecker;
import org.fdroid.fdroid.qr.QrGenAsyncTask;
import org.fdroid.fdroid.views.main.MainActivity; import org.fdroid.fdroid.views.main.MainActivity;
import java.util.Date; import java.util.Date;
@ -75,8 +65,17 @@ import java.util.Set;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.SwitchCompat;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import cc.mvdan.accesspoint.WifiApControl; import cc.mvdan.accesspoint.WifiApControl;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import static org.fdroid.fdroid.views.main.MainActivity.ACTION_REQUEST_SWAP; import static org.fdroid.fdroid.views.main.MainActivity.ACTION_REQUEST_SWAP;
@ -119,8 +118,6 @@ public class SwapWorkflowActivity extends AppCompatActivity {
@LayoutRes @LayoutRes
private int currentSwapViewLayoutRes = STEP_INTRO; private int currentSwapViewLayoutRes = STEP_INTRO;
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
public static void requestSwap(Context context, String repo) { public static void requestSwap(Context context, String repo) {
requestSwap(context, Uri.parse(repo)); requestSwap(context, Uri.parse(repo));
} }
@ -238,7 +235,6 @@ public class SwapWorkflowActivity extends AppCompatActivity {
@Override @Override
protected void onDestroy() { protected void onDestroy() {
compositeDisposable.dispose();
localBroadcastManager.unregisterReceiver(downloaderInterruptedReceiver); localBroadcastManager.unregisterReceiver(downloaderInterruptedReceiver);
unbindService(serviceConnection); unbindService(serviceConnection);
super.onDestroy(); super.onDestroy();
@ -779,7 +775,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
private final BroadcastReceiver bluetoothScanModeChanged = new BroadcastReceiver() { private final BroadcastReceiver bluetoothScanModeChanged = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
SwitchMaterial bluetoothSwitch = container.findViewById(R.id.switch_bluetooth); SwitchCompat bluetoothSwitch = container.findViewById(R.id.switch_bluetooth);
TextView textBluetoothVisible = container.findViewById(R.id.bluetooth_visible); TextView textBluetoothVisible = container.findViewById(R.id.bluetooth_visible);
if (bluetoothSwitch == null || textBluetoothVisible == null if (bluetoothSwitch == null || textBluetoothVisible == null
|| !BluetoothManager.ACTION_STATUS.equals(intent.getAction())) { || !BluetoothManager.ACTION_STATUS.equals(intent.getAction())) {
@ -933,14 +929,11 @@ public class SwapWorkflowActivity extends AppCompatActivity {
ImageView qrImage = container.findViewById(R.id.wifi_qr_code); ImageView qrImage = container.findViewById(R.id.wifi_qr_code);
if (qrUriString != null && qrImage != null) { if (qrUriString != null && qrImage != null) {
Utils.debugLog(TAG, "Encoded swap URI in QR Code: " + qrUriString); Utils.debugLog(TAG, "Encoded swap URI in QR Code: " + qrUriString);
new QrGenAsyncTask(SwapWorkflowActivity.this, R.id.wifi_qr_code).execute(qrUriString);
compositeDisposable.add(Utils.generateQrBitmap(this, qrUriString)
.subscribe(qrBitmap -> {
qrImage.setImageBitmap(qrBitmap);
// Replace all blacks with the background blue. // Replace all blacks with the background blue.
qrImage.setColorFilter(new LightingColorFilter(0xffffffff, qrImage.setColorFilter(new LightingColorFilter(0xffffffff, ContextCompat.getColor(this,
ContextCompat.getColor(this, R.color.swap_blue))); R.color.swap_blue)));
final View qrWarningMessage = container.findViewById(R.id.warning_qr_scanner); final View qrWarningMessage = container.findViewById(R.id.warning_qr_scanner);
if (CameraCharacteristicsChecker.getInstance(this).hasAutofocus()) { if (CameraCharacteristicsChecker.getInstance(this).hasAutofocus()) {
@ -948,8 +941,6 @@ public class SwapWorkflowActivity extends AppCompatActivity {
} else { } else {
qrWarningMessage.setVisibility(View.VISIBLE); qrWarningMessage.setVisibility(View.VISIBLE);
} }
})
);
} }
} }
@ -996,7 +987,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
} }
}); });
SwitchMaterial wifiSwitch = findViewById(R.id.switch_wifi); SwitchCompat wifiSwitch = findViewById(R.id.switch_wifi);
wifiSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { wifiSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override @Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
@ -1120,7 +1111,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
private final BroadcastReceiver bluetoothStatus = new BroadcastReceiver() { private final BroadcastReceiver bluetoothStatus = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
SwitchMaterial bluetoothSwitch = container.findViewById(R.id.switch_bluetooth); SwitchCompat bluetoothSwitch = container.findViewById(R.id.switch_bluetooth);
TextView textBluetoothVisible = container.findViewById(R.id.bluetooth_visible); TextView textBluetoothVisible = container.findViewById(R.id.bluetooth_visible);
TextView textDeviceIdBluetooth = container.findViewById(R.id.device_id_bluetooth); TextView textDeviceIdBluetooth = container.findViewById(R.id.device_id_bluetooth);
TextView peopleNearbyText = container.findViewById(R.id.text_people_nearby); TextView peopleNearbyText = container.findViewById(R.id.text_people_nearby);

View File

@ -13,10 +13,6 @@ import android.os.Build;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.apache.commons.net.util.SubnetUtils; import org.apache.commons.net.util.SubnetUtils;
import org.fdroid.fdroid.BuildConfig; import org.fdroid.fdroid.BuildConfig;
import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.FDroidApp;
@ -35,8 +31,10 @@ import java.security.cert.Certificate;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Locale; import java.util.Locale;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import cc.mvdan.accesspoint.WifiApControl; import cc.mvdan.accesspoint.WifiApControl;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
/** /**
* Handle state changes to the device's wifi, storing the required bits. * Handle state changes to the device's wifi, storing the required bits.
@ -72,8 +70,6 @@ public class WifiStateChangeService extends IntentService {
private static int previousWifiState = Integer.MIN_VALUE; private static int previousWifiState = Integer.MIN_VALUE;
private static int wifiState; private static int wifiState;
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
public WifiStateChangeService() { public WifiStateChangeService() {
super("WifiStateChangeService"); super("WifiStateChangeService");
} }
@ -86,12 +82,6 @@ public class WifiStateChangeService extends IntentService {
context.startService(intent); context.startService(intent);
} }
@Override
public void onDestroy() {
compositeDisposable.dispose();
super.onDestroy();
}
@Override @Override
protected void onHandleIntent(Intent intent) { protected void onHandleIntent(Intent intent) {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_LOWEST); android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_LOWEST);
@ -119,7 +109,7 @@ public class WifiStateChangeService extends IntentService {
} }
if (Build.VERSION.SDK_INT < 21 && wifiState == WifiManager.WIFI_STATE_ENABLED) { if (Build.VERSION.SDK_INT < 21 && wifiState == WifiManager.WIFI_STATE_ENABLED) {
compositeDisposable.add(UpdateService.scheduleIfStillOnWifi(this).subscribe()); UpdateService.scheduleIfStillOnWifi(this);
} }
} }
} }

View File

@ -53,7 +53,7 @@
</LinearLayout> </LinearLayout>
<com.google.android.material.switchmaterial.SwitchMaterial <androidx.appcompat.widget.SwitchCompat
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:enabled="false" android:enabled="false"
@ -110,7 +110,7 @@
</LinearLayout> </LinearLayout>
<com.google.android.material.switchmaterial.SwitchMaterial <androidx.appcompat.widget.SwitchCompat
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/switch_wifi"/> android:id="@+id/switch_wifi"/>
@ -155,7 +155,7 @@
<Button <Button
android:id="@+id/btn_send_fdroid" android:id="@+id/btn_send_fdroid"
style="@style/Widget.App.Button.TextButton" style="@style/Widget.MaterialComponents.Button.TextButton"
android:layout_width="wrap_content" android:layout_width="wrap_content"
swap:icon="@drawable/ic_fdroid_grey" swap:icon="@drawable/ic_fdroid_grey"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -163,7 +163,7 @@
<Button <Button
android:id="@+id/btn_scan_qr" android:id="@+id/btn_scan_qr"
style="@style/Widget.App.Button.TextButton" style="@style/Widget.MaterialComponents.Button.TextButton"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/swap_scan_qr" android:text="@string/swap_scan_qr"

View File

@ -5,38 +5,18 @@
tools:ignore="MenuTitle"> tools:ignore="MenuTitle">
<!-- android:title and android:icon are set dynamically in MainActivity --> <!-- android:title and android:icon are set dynamically in MainActivity -->
<item <item
android:id="@+id/latest" app:showAsAction="ifRoom|withText"
android:enabled="true" android:id="@+id/latest"/>
android:icon="@drawable/ic_latest"
android:orderInCategory="0"
android:title="@string/main_menu__latest_apps"
app:showAsAction="ifRoom|withText" />
<item <item
android:id="@+id/categories" app:showAsAction="ifRoom|withText"
android:enabled="true" android:id="@+id/categories"/>
android:icon="@drawable/ic_categories"
android:orderInCategory="1"
android:title="@string/main_menu__categories"
app:showAsAction="ifRoom|withText" />
<item <item
android:id="@+id/nearby" app:showAsAction="ifRoom|withText"
android:enabled="true" android:id="@+id/nearby"/>
android:icon="@drawable/ic_nearby"
android:orderInCategory="2"
android:title="@string/main_menu__swap_nearby"
app:showAsAction="ifRoom|withText" />
<item <item
android:id="@+id/updates" app:showAsAction="ifRoom|withText"
android:enabled="true" android:id="@+id/updates"/>
android:icon="@drawable/ic_updates"
android:orderInCategory="3"
android:title="@string/main_menu__updates"
app:showAsAction="ifRoom|withText" />
<item <item
android:id="@+id/settings" app:showAsAction="ifRoom|withText"
android:enabled="true" android:id="@+id/settings"/>
android:icon="@drawable/ic_settings"
android:orderInCategory="4"
android:title="@string/menu_settings"
app:showAsAction="ifRoom|withText" />
</menu> </menu>

View File

@ -60,7 +60,7 @@
android:description="@string/app_description" android:description="@string/app_description"
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
android:icon="@drawable/ic_launcher" android:icon="@drawable/ic_launcher"
android:label="BobStore" android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config" android:networkSecurityConfig="@xml/network_security_config"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.App"> android:theme="@style/Theme.App">

View File

@ -160,7 +160,6 @@ public class FDroidApp extends Application implements androidx.work.Configuratio
/** /**
* Apply pure black background in dark theme setting. Must be called in every activity's * Apply pure black background in dark theme setting. Must be called in every activity's
* {@link AppCompatActivity#onCreate()}, before super.onCreate(). * {@link AppCompatActivity#onCreate()}, before super.onCreate().
*
* @param activity The activity to apply the setting. * @param activity The activity to apply the setting.
*/ */
public void applyPureBlackBackgroundInDarkTheme(AppCompatActivity activity) { public void applyPureBlackBackgroundInDarkTheme(AppCompatActivity activity) {
@ -213,8 +212,7 @@ public class FDroidApp extends Application implements androidx.work.Configuratio
private static int getCurDialogThemeResId() { private static int getCurDialogThemeResId() {
switch (curTheme) { switch (curTheme) {
case dark: case dark: case night:
case night:
return R.style.MinWithDialogBaseThemeDark; return R.style.MinWithDialogBaseThemeDark;
default: default:
return R.style.MinWithDialogBaseThemeLight; return R.style.MinWithDialogBaseThemeLight;
@ -652,7 +650,7 @@ public class FDroidApp extends Application implements androidx.work.Configuratio
/** /**
* Put proxy settings (or Tor settings) globally into effect based on whats configured in Preferences. * Put proxy settings (or Tor settings) globally into effect based on whats configured in Preferences.
* <p> *
* Must be called on App startup and after every proxy configuration change. * Must be called on App startup and after every proxy configuration change.
*/ */
public static void configureProxy(Preferences preferences) { public static void configureProxy(Preferences preferences) {

View File

@ -24,7 +24,7 @@ class ProgressBufferedInputStream extends BufferedInputStream {
} }
@Override @Override
public synchronized int read(@NonNull byte[] buffer, int byteOffset, int byteCount) throws IOException { public int read(@NonNull byte[] buffer, int byteOffset, int byteCount) throws IOException {
if (progressListener != null) { if (progressListener != null) {
currentBytes += byteCount; currentBytes += byteCount;
/* don't send every change to keep things efficient. 333333 bytes to keep all /* don't send every change to keep things efficient. 333333 bytes to keep all

View File

@ -30,6 +30,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.net.Uri; import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build; import android.os.Build;
import android.os.Process; import android.os.Process;
import android.os.SystemClock; import android.os.SystemClock;
@ -50,18 +51,15 @@ import org.fdroid.fdroid.installer.InstallManagerService;
import org.fdroid.fdroid.net.BluetoothDownloader; import org.fdroid.fdroid.net.BluetoothDownloader;
import org.fdroid.fdroid.net.ConnectivityMonitorService; import org.fdroid.fdroid.net.ConnectivityMonitorService;
import java.lang.ref.WeakReference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.app.JobIntentService; import androidx.core.app.JobIntentService;
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.schedulers.Schedulers;
public class UpdateService extends JobIntentService { public class UpdateService extends JobIntentService {
@ -83,13 +81,6 @@ public class UpdateService extends JobIntentService {
public static final int STATUS_ERROR_LOCAL_SMALL = 4; public static final int STATUS_ERROR_LOCAL_SMALL = 4;
public static final int STATUS_INFO = 5; public static final int STATUS_INFO = 5;
/**
* This number should never change, it is used by ROMs to trigger
* the first background update of F-Droid during setup.
*
* @see <a href="https://gitlab.com/fdroid/fdroidclient/-/issues/2147">Add a way to trigger an index update externally</a>
* @see <a href="https://review.calyxos.org/c/CalyxOS/platform_packages_apps_SetupWizard/+/3461"/>Schedule F-Droid index update on initialization and network connection</a>
*/
private static final int JOB_ID = 0xfedcba; private static final int JOB_ID = 0xfedcba;
private static final int NOTIFY_ID_UPDATING = 0; private static final int NOTIFY_ID_UPDATING = 0;
@ -217,30 +208,42 @@ public class UpdateService extends JobIntentService {
* unlimited networks over metered networks for index updates and auto * unlimited networks over metered networks for index updates and auto
* downloads of app updates. Starting with {@code android-21}, this uses * downloads of app updates. Starting with {@code android-21}, this uses
* {@link android.app.job.JobScheduler} instead. * {@link android.app.job.JobScheduler} instead.
*
* @return a {@link Completable} that schedules the update. If this process is already running,
* a {@code Completable} that completes immediately is returned.
*/ */
@NonNull public static void scheduleIfStillOnWifi(Context context) {
public static Completable scheduleIfStillOnWifi(Context context) {
if (Build.VERSION.SDK_INT >= 21) { if (Build.VERSION.SDK_INT >= 21) {
throw new IllegalStateException("This should never be used on android-21 or newer!"); throw new IllegalStateException("This should never be used on android-21 or newer!");
} }
if (isScheduleIfStillOnWifiRunning || !Preferences.get().isBackgroundDownloadAllowed()) { if (isScheduleIfStillOnWifiRunning || !Preferences.get().isBackgroundDownloadAllowed()) {
return Completable.complete(); return;
} }
isScheduleIfStillOnWifiRunning = true; isScheduleIfStillOnWifiRunning = true;
new StillOnWifiAsyncTask(context).execute();
}
return Completable.timer(2, TimeUnit.MINUTES) private static final class StillOnWifiAsyncTask extends AsyncTask<Void, Void, Void> {
.andThen(Completable.fromAction(() -> {
private final WeakReference<Context> contextWeakReference;
private StillOnWifiAsyncTask(Context context) {
this.contextWeakReference = new WeakReference<>(context);
}
@Override
protected Void doInBackground(Void... voids) {
Context context = contextWeakReference.get();
try {
Thread.sleep(120000);
if (Preferences.get().isBackgroundDownloadAllowed()) { if (Preferences.get().isBackgroundDownloadAllowed()) {
Utils.debugLog(TAG, "scheduling update because there is good internet"); Utils.debugLog(TAG, "scheduling update because there is good internet");
schedule(context); schedule(context);
} }
} catch (Throwable e) { // NOPMD
Utils.debugLog(TAG, e.getMessage());
}
isScheduleIfStillOnWifiRunning = false; isScheduleIfStillOnWifiRunning = false;
})) return null;
.subscribeOn(Schedulers.computation()) }
.observeOn(AndroidSchedulers.mainThread());
} }
public static void stopNow(Context context) { public static void stopNow(Context context) {

View File

@ -27,7 +27,6 @@ import android.content.pm.Signature;
import android.content.res.Resources; import android.content.res.Resources;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.Rect; import android.graphics.Rect;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
@ -45,15 +44,11 @@ import android.text.style.TypefaceSpan;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.Display;
import android.view.View; import android.view.View;
import android.view.ViewTreeObserver; import android.view.ViewTreeObserver;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.Toast; import android.widget.Toast;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.encode.Contents;
import com.google.zxing.encode.QRCodeEncoder;
import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.assist.ImageScaleType;
@ -100,11 +95,7 @@ import java.util.regex.Pattern;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.schedulers.Schedulers;
public final class Utils { public final class Utils {
@ -492,7 +483,12 @@ public final class Utils {
*/ */
public static DisplayImageOptions.Builder getDefaultDisplayImageOptionsBuilder() { public static DisplayImageOptions.Builder getDefaultDisplayImageOptionsBuilder() {
if (defaultDisplayImageOptionsBuilder == null) { if (defaultDisplayImageOptionsBuilder == null) {
defaultDisplayImageOptionsBuilder = createDefaultDisplayImageOptionsBuilder(); defaultDisplayImageOptionsBuilder = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(false)
.bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(ImageScaleType.EXACTLY);
} }
return defaultDisplayImageOptionsBuilder; return defaultDisplayImageOptionsBuilder;
} }
@ -504,7 +500,7 @@ public final class Utils {
*/ */
public static DisplayImageOptions getRepoAppDisplayImageOptions() { public static DisplayImageOptions getRepoAppDisplayImageOptions() {
if (repoAppDisplayImageOptions == null) { if (repoAppDisplayImageOptions == null) {
repoAppDisplayImageOptions = createDefaultDisplayImageOptionsBuilder() repoAppDisplayImageOptions = getDefaultDisplayImageOptionsBuilder()
.showImageOnLoading(R.drawable.ic_repo_app_default) .showImageOnLoading(R.drawable.ic_repo_app_default)
.showImageForEmptyUri(R.drawable.ic_repo_app_default) .showImageForEmptyUri(R.drawable.ic_repo_app_default)
.showImageOnFail(R.drawable.ic_repo_app_default) .showImageOnFail(R.drawable.ic_repo_app_default)
@ -514,15 +510,6 @@ public final class Utils {
return repoAppDisplayImageOptions; return repoAppDisplayImageOptions;
} }
private static DisplayImageOptions.Builder createDefaultDisplayImageOptionsBuilder() {
return new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(false)
.bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(ImageScaleType.EXACTLY);
}
/** /**
* If app has an iconUrl we feed that to UIL, otherwise we ask the PackageManager which will * If app has an iconUrl we feed that to UIL, otherwise we ask the PackageManager which will
* return the app's icon directly when the app is installed. * return the app's icon directly when the app is installed.
@ -995,27 +982,6 @@ public final class Utils {
} }
} }
@NonNull
public static Single<Bitmap> generateQrBitmap(@NonNull final AppCompatActivity activity,
@NonNull final String qrData) {
return Single.fromCallable(() -> {
Display display = activity.getWindowManager().getDefaultDisplay();
Point outSize = new Point();
display.getSize(outSize);
final int x = outSize.x;
final int y = outSize.y;
final int qrCodeDimension = Math.min(x, y);
debugLog(TAG, "generating QRCode Bitmap of " + qrCodeDimension + "x" + qrCodeDimension);
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(qrData, null,
Contents.Type.TEXT, BarcodeFormat.QR_CODE.toString(), qrCodeDimension);
return qrCodeEncoder.encodeAsBitmap();
})
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(throwable -> Log.e(TAG, "Could not encode QR as bitmap", throwable));
}
/** /**
* Keep an instance of this class as an field in an AppCompatActivity for figuring out whether the on * Keep an instance of this class as an field in an AppCompatActivity for figuring out whether the on
* screen keyboard is currently visible or not. * screen keyboard is currently visible or not.

View File

@ -9,8 +9,6 @@ import org.fdroid.fdroid.R;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import com.google.android.material.textfield.TextInputLayout;
public class CrashReportActivity extends BaseCrashReportDialog public class CrashReportActivity extends BaseCrashReportDialog
implements DialogInterface.OnDismissListener, DialogInterface.OnClickListener { implements DialogInterface.OnDismissListener, DialogInterface.OnClickListener {
@ -32,8 +30,7 @@ public class CrashReportActivity extends BaseCrashReportDialog
dialog.setOnDismissListener(this); dialog.setOnDismissListener(this);
dialog.show(); dialog.show();
TextInputLayout commentLayout = dialog.findViewById(android.R.id.input); comment = (EditText) dialog.findViewById(android.R.id.input);
comment = commentLayout.getEditText();
if (savedInstanceState != null) { if (savedInstanceState != null) {
comment.setText(savedInstanceState.getString(STATE_COMMENT)); comment.setText(savedInstanceState.getString(STATE_COMMENT));
} }

View File

@ -322,16 +322,16 @@ public class DBHelper extends SQLiteOpenHelper {
/** /**
* Look for additional, initial repositories from the device's filesystem. * Look for additional, initial repositories from the device's filesystem.
* These can be added as part of the ROM ({@code /system} or {@code /product} * These can be added as part of the ROM ({@code /system} or included later
* or included later by vendors/OEMs ({@code /vendor}, {@code /odm}, {@code /oem}). * by vendors/OEMs ({@code /vendor}, {@code /odm}, {@code /oem}). These are
* These are always added at a lower priority than the repos embedded in the APK via * always added at a lower priority than the repos embedded in the APK via
* {@code default_repos.xml}. * {@code default_repos.xml}.
* <p> * <p>
* ROM (System) has the lowest priority, then Product, Vendor, ODM, and OEM. * ROM has the lowest priority, then Vendor, ODM, and OEM.
*/ */
private static List<String> loadAdditionalRepos(String packageName) { private static List<String> loadAdditionalRepos(String packageName) {
List<String> repoItems = new LinkedList<>(); List<String> repoItems = new LinkedList<>();
for (String root : Arrays.asList("/system", "/product", "/vendor", "/odm", "/oem")) { for (String root : Arrays.asList("/system", "/vendor", "/odm", "/oem")) {
File additionalReposFile = new File(root + "/etc/" + packageName + "/additional_repos.xml"); File additionalReposFile = new File(root + "/etc/" + packageName + "/additional_repos.xml");
try { try {
if (additionalReposFile.isFile()) { if (additionalReposFile.isFile()) {

View File

@ -23,17 +23,18 @@ import org.fdroid.fdroid.privileged.IPrivilegedService;
import java.io.File; import java.io.File;
import java.io.FilenameFilter; import java.io.FilenameFilter;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeSet;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.app.JobIntentService; import androidx.core.app.JobIntentService;
import io.reactivex.rxjava3.disposables.CompositeDisposable; import rx.functions.Action1;
import io.reactivex.rxjava3.schedulers.Schedulers; import rx.schedulers.Schedulers;
import io.reactivex.rxjava3.subjects.PublishSubject; import rx.subjects.PublishSubject;
/** /**
* Handles all updates to {@link InstalledAppProvider}, whether checking the contents * Handles all updates to {@link InstalledAppProvider}, whether checking the contents
@ -65,15 +66,13 @@ public class InstalledAppProviderService extends JobIntentService {
private static final String EXTRA_PACKAGE_INFO = "org.fdroid.fdroid.data.extra.PACKAGE_INFO"; private static final String EXTRA_PACKAGE_INFO = "org.fdroid.fdroid.data.extra.PACKAGE_INFO";
/** /**
* This is for notifying the users of this {@link android.content.ContentProvider} * This is for notifing the users of this {@link android.content.ContentProvider}
* that the contents have changed. Since {@link Intent}s can come in slow * that the contents has changed. Since {@link Intent}s can come in slow
* or fast, and this can trigger a lot of UI updates, the actual * or fast, and this can trigger a lot of UI updates, the actual
* notifications are rate limited to one per second. * notifications are rate limited to one per second.
*/ */
private PublishSubject<String> packageChangeNotifier; private PublishSubject<String> packageChangeNotifier;
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
@ -83,16 +82,17 @@ public class InstalledAppProviderService extends JobIntentService {
// only emit an event to the subscriber after it has not received any new events for one second. // only emit an event to the subscriber after it has not received any new events for one second.
// This ensures that we don't constantly ask our lists of apps to update as we iterate over // This ensures that we don't constantly ask our lists of apps to update as we iterate over
// the list of installed apps and insert them to the database... // the list of installed apps and insert them to the database...
compositeDisposable.add(
packageChangeNotifier packageChangeNotifier
.subscribeOn(Schedulers.newThread()) .subscribeOn(Schedulers.newThread())
.debounce(3, TimeUnit.SECONDS) .debounce(3, TimeUnit.SECONDS)
.subscribe(packageName -> { .subscribe(new Action1<String>() {
Utils.debugLog(TAG, "Notifying content providers to update relevant views."); @Override
public void call(String packageName) {
Utils.debugLog(TAG, "Notifying content providers (so they can update the relevant views).");
getContentResolver().notifyChange(AppProvider.getContentUri(), null); getContentResolver().notifyChange(AppProvider.getContentUri(), null);
getContentResolver().notifyChange(ApkProvider.getContentUri(), null); getContentResolver().notifyChange(ApkProvider.getContentUri(), null);
}) }
); });
// ...alternatively, this non-debounced version will instantly emit an event about the // ...alternatively, this non-debounced version will instantly emit an event about the
// particular package being updated. This is required so that our AppDetails view can update // particular package being updated. This is required so that our AppDetails view can update
@ -101,18 +101,14 @@ public class InstalledAppProviderService extends JobIntentService {
// only for changes to specific URIs in the AppProvider. These are triggered when a more // only for changes to specific URIs in the AppProvider. These are triggered when a more
// general notification (e.g. to AppProvider.getContentUri()) is fired, but not when a // general notification (e.g. to AppProvider.getContentUri()) is fired, but not when a
// sibling such as AppProvider.getHighestPriorityMetadataUri() is fired. // sibling such as AppProvider.getHighestPriorityMetadataUri() is fired.
compositeDisposable.add( packageChangeNotifier.subscribeOn(Schedulers.newThread())
packageChangeNotifier .subscribe(new Action1<String>() {
.subscribeOn(Schedulers.newThread())
.subscribe(packageName -> getContentResolver()
.notifyChange(AppProvider.getHighestPriorityMetadataUri(packageName), null))
);
}
@Override @Override
public void onDestroy() { public void call(String packageName) {
compositeDisposable.dispose(); getContentResolver()
super.onDestroy(); .notifyChange(AppProvider.getHighestPriorityMetadataUri(packageName), null);
}
});
} }
/** /**
@ -225,9 +221,13 @@ public class InstalledAppProviderService extends JobIntentService {
packageInfoList = context.getPackageManager().getInstalledPackages(PackageManager.GET_SIGNATURES); packageInfoList = context.getPackageManager().getInstalledPackages(PackageManager.GET_SIGNATURES);
} }
Map<String, Long> cachedInfo = InstalledAppProvider.Helper.lastUpdateTimes(context); Map<String, Long> cachedInfo = InstalledAppProvider.Helper.lastUpdateTimes(context);
TreeSet<PackageInfo> packageInfoSet = new TreeSet<>((o1, o2) -> o1.packageName.compareTo(o2.packageName)); Collections.sort(packageInfoList, new Comparator<PackageInfo>() {
packageInfoSet.addAll(packageInfoList); @Override
for (PackageInfo packageInfo : packageInfoSet) { public int compare(PackageInfo o1, PackageInfo o2) {
return o1.packageName.compareTo(o2.packageName);
}
});
for (PackageInfo packageInfo : packageInfoList) {
if (cachedInfo.containsKey(packageInfo.packageName)) { if (cachedInfo.containsKey(packageInfo.packageName)) {
if (packageInfo.lastUpdateTime < 1262300400000L // 2010-01-01 00:00 if (packageInfo.lastUpdateTime < 1262300400000L // 2010-01-01 00:00
|| packageInfo.lastUpdateTime > cachedInfo.get(packageInfo.packageName)) { || packageInfo.lastUpdateTime > cachedInfo.get(packageInfo.packageName)) {
@ -248,7 +248,12 @@ public class InstalledAppProviderService extends JobIntentService {
public static File getPathToInstalledApk(PackageInfo packageInfo) { public static File getPathToInstalledApk(PackageInfo packageInfo) {
File apk = new File(packageInfo.applicationInfo.publicSourceDir); File apk = new File(packageInfo.applicationInfo.publicSourceDir);
if (apk.isDirectory()) { if (apk.isDirectory()) {
FilenameFilter filter = (dir, name) -> name.endsWith(".apk"); FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".apk");
}
};
File[] files = apk.listFiles(filter); File[] files = apk.listFiles(filter);
if (files == null) { if (files == null) {
String msg = packageInfo.packageName + " sourceDir has no APKs: " + apk.getAbsolutePath(); String msg = packageInfo.packageName + " sourceDir has no APKs: " + apk.getAbsolutePath();

View File

@ -128,7 +128,6 @@ public class FileInstallerActivity extends FragmentActivity {
@Override @Override
public void onRequestPermissionsResult(int requestCode, public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions, @NonNull int[] grantResults) { @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) { switch (requestCode) {
case MY_PERMISSIONS_REQUEST_STORAGE: case MY_PERMISSIONS_REQUEST_STORAGE:
// If request is cancelled, the result arrays are empty. // If request is cancelled, the result arrays are empty.

View File

@ -256,7 +256,7 @@ public abstract class Downloader {
} }
@Override @Override
public synchronized void mark(int readlimit) { public void mark(int readlimit) {
toWrap.mark(readlimit); toWrap.mark(readlimit);
} }

View File

@ -0,0 +1,74 @@
package org.fdroid.fdroid.qr;
import android.annotation.TargetApi;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.os.AsyncTask;
import android.util.Log;
import android.view.Display;
import android.widget.ImageView;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.encode.Contents;
import com.google.zxing.encode.QRCodeEncoder;
import org.fdroid.fdroid.Utils;
import androidx.appcompat.app.AppCompatActivity;
public class QrGenAsyncTask extends AsyncTask<String, Void, Void> {
private static final String TAG = "QrGenAsyncTask";
private final AppCompatActivity activity;
private final int viewId;
private Bitmap qrBitmap;
public QrGenAsyncTask(AppCompatActivity activity, int viewId) {
this.activity = activity;
this.viewId = viewId;
}
/*
* The method for getting screen dimens changed, so this uses both the
* deprecated one and the 13+ one, and supports all Android versions.
*/
@SuppressWarnings("deprecation")
@TargetApi(13)
@Override
protected Void doInBackground(String... s) {
String qrData = s[0];
Display display = activity.getWindowManager().getDefaultDisplay();
Point outSize = new Point();
int x, y, qrCodeDimension;
display.getSize(outSize);
x = outSize.x;
y = outSize.y;
if (x < y) {
qrCodeDimension = x;
} else {
qrCodeDimension = y;
}
Utils.debugLog(TAG, "generating QRCode Bitmap of " + qrCodeDimension + "x" + qrCodeDimension);
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(qrData, null,
Contents.Type.TEXT, BarcodeFormat.QR_CODE.toString(), qrCodeDimension);
try {
qrBitmap = qrCodeEncoder.encodeAsBitmap();
} catch (WriterException e) {
Log.e(TAG, "Could not encode QR as bitmap", e);
}
return null;
}
@Override
protected void onPostExecute(Void v) {
ImageView qrCodeImageView = (ImageView) activity.findViewById(viewId);
// If the generation takes too long for whatever reason, then this view, and indeed the entire
// activity may not be around any more.
if (qrCodeImageView != null) {
qrCodeImageView.setImageBitmap(qrBitmap);
}
}
}

View File

@ -3,12 +3,10 @@ package org.fdroid.fdroid.receiver;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Build;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import org.fdroid.fdroid.data.InstalledAppProviderService; import org.fdroid.fdroid.data.InstalledAppProviderService;
import org.fdroid.fdroid.installer.PrivilegedInstaller;
/** /**
* Receive {@link Intent#ACTION_PACKAGE_ADDED} and {@link Intent#ACTION_PACKAGE_REMOVED} * Receive {@link Intent#ACTION_PACKAGE_ADDED} and {@link Intent#ACTION_PACKAGE_REMOVED}
@ -34,15 +32,6 @@ public class PackageManagerReceiver extends BroadcastReceiver {
} else { } else {
InstalledAppProviderService.delete(context, intent.getData()); InstalledAppProviderService.delete(context, intent.getData());
} }
} else if (Intent.ACTION_PACKAGE_CHANGED.equals(action) && Build.VERSION.SDK_INT >= 29 &&
PrivilegedInstaller.isExtensionInstalledCorrectly(context) ==
PrivilegedInstaller.IS_EXTENSION_INSTALLED_YES) {
String[] allowList = new String[]{"org.chromium.chrome"};
for (String allowed : allowList) {
if (allowed.equals(intent.getData().getSchemeSpecificPart())) {
InstalledAppProviderService.compareToPackageManager(context);
}
}
} else { } else {
Log.i(TAG, "unsupported action: " + action + " " + intent); Log.i(TAG, "unsupported action: " + action + " " + intent);
} }

View File

@ -262,8 +262,7 @@ public class AppDetailsRecyclerViewAdapter
uriIsSetAndCanBeOpened(app.getBitcoinUri()) || uriIsSetAndCanBeOpened(app.getBitcoinUri()) ||
uriIsSetAndCanBeOpened(app.getLitecoinUri()) || uriIsSetAndCanBeOpened(app.getLitecoinUri()) ||
uriIsSetAndCanBeOpened(app.getFlattrUri()) || uriIsSetAndCanBeOpened(app.getFlattrUri()) ||
uriIsSetAndCanBeOpened(app.getLiberapayUri()) || uriIsSetAndCanBeOpened(app.getLiberapayUri());
uriIsSetAndCanBeOpened(app.getOpenCollectiveUri());
} }
private void notifyVersionViewsChanged() { private void notifyVersionViewsChanged() {

View File

@ -19,6 +19,7 @@
package org.fdroid.fdroid.views; package org.fdroid.fdroid.views;
import android.annotation.SuppressLint;
import android.content.ClipData; import android.content.ClipData;
import android.content.ClipboardManager; import android.content.ClipboardManager;
import android.content.ContentResolver; import android.content.ContentResolver;
@ -31,13 +32,13 @@ import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.net.wifi.WifiInfo; import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.Editable; import android.text.Editable;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.util.Log; import android.util.Log;
import android.util.Pair;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
@ -51,7 +52,6 @@ import android.widget.Toast;
import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textfield.TextInputLayout;
import org.fdroid.fdroid.AddRepoIntentService; import org.fdroid.fdroid.AddRepoIntentService;
import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.FDroidApp;
@ -85,11 +85,6 @@ import androidx.core.content.ContextCompat;
import androidx.loader.app.LoaderManager; import androidx.loader.app.LoaderManager;
import androidx.loader.content.CursorLoader; import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader; import androidx.loader.content.Loader;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
public class ManageReposActivity extends AppCompatActivity public class ManageReposActivity extends AppCompatActivity
implements LoaderManager.LoaderCallbacks<Cursor>, RepoAdapter.EnabledListener { implements LoaderManager.LoaderCallbacks<Cursor>, RepoAdapter.EnabledListener {
@ -111,8 +106,6 @@ public class ManageReposActivity extends AppCompatActivity
*/ */
private boolean finishAfterAddingRepo; private boolean finishAfterAddingRepo;
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
FDroidApp fdroidApp = (FDroidApp) getApplication(); FDroidApp fdroidApp = (FDroidApp) getApplication();
@ -160,12 +153,6 @@ public class ManageReposActivity extends AppCompatActivity
}); });
} }
@Override
protected void onDestroy() {
compositeDisposable.dispose();
super.onDestroy();
}
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater(); MenuInflater menuInflater = getMenuInflater();
@ -309,10 +296,8 @@ public class ManageReposActivity extends AppCompatActivity
final View view = getLayoutInflater().inflate(R.layout.addrepo, null); final View view = getLayoutInflater().inflate(R.layout.addrepo, null);
MaterialAlertDialogBuilder addRepoDialogBuilder = new MaterialAlertDialogBuilder(context); MaterialAlertDialogBuilder addRepoDialogBuilder = new MaterialAlertDialogBuilder(context);
addRepoDialogBuilder.setView(view); addRepoDialogBuilder.setView(view);
final TextInputLayout uriEditTextLayout = view.findViewById(R.id.edit_uri); final EditText uriEditText = (EditText) view.findViewById(R.id.edit_uri);
final TextInputLayout fingerprintEditTextLayout = view.findViewById(R.id.edit_fingerprint); final EditText fingerprintEditText = (EditText) view.findViewById(R.id.edit_fingerprint);
final EditText uriEditText = uriEditTextLayout.getEditText();
final EditText fingerprintEditText = fingerprintEditTextLayout.getEditText();
addRepoDialogBuilder.setTitle(R.string.repo_add_title); addRepoDialogBuilder.setTitle(R.string.repo_add_title);
addRepoDialogBuilder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { addRepoDialogBuilder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
@ -583,8 +568,10 @@ public class ManageReposActivity extends AppCompatActivity
/** /**
* Adds a new repo to the database. * Adds a new repo to the database.
*/ */
@SuppressLint("StaticFieldLeak")
private void prepareToCreateNewRepo(final String originalAddress, final String fingerprint, private void prepareToCreateNewRepo(final String originalAddress, final String fingerprint,
final String username, final String password) { final String username, final String password) {
final View addRepoForm = addRepoDialog.findViewById(R.id.add_repo_form); final View addRepoForm = addRepoDialog.findViewById(R.id.add_repo_form);
addRepoForm.setVisibility(View.GONE); addRepoForm.setVisibility(View.GONE);
final View positiveButton = addRepoDialog.getButton(AlertDialog.BUTTON_POSITIVE); final View positiveButton = addRepoDialog.getButton(AlertDialog.BUTTON_POSITIVE);
@ -596,65 +583,84 @@ public class ManageReposActivity extends AppCompatActivity
final Button skip = addRepoDialog.getButton(AlertDialog.BUTTON_NEGATIVE); final Button skip = addRepoDialog.getButton(AlertDialog.BUTTON_NEGATIVE);
skip.setText(R.string.skip); skip.setText(R.string.skip);
final int refreshDialog = Integer.MAX_VALUE; final AsyncTask<String, String, String> checker = new AsyncTask<String, String, String>() {
final Disposable disposable = Single.fromCallable(() -> {
int statusCode = -1; private int statusCode = -1;
private static final int REFRESH_DIALOG = Integer.MAX_VALUE;
@Override
protected String doInBackground(String... params) {
final String originalAddress = params[0];
if (fingerprintRepoMap.containsKey(fingerprint)) { if (fingerprintRepoMap.containsKey(fingerprint)) {
statusCode = refreshDialog; statusCode = REFRESH_DIALOG;
return Pair.create(statusCode, originalAddress); return originalAddress;
} }
if (originalAddress.startsWith(ContentResolver.SCHEME_CONTENT) if (originalAddress.startsWith(ContentResolver.SCHEME_CONTENT)
|| originalAddress.startsWith(ContentResolver.SCHEME_FILE)) { || originalAddress.startsWith(ContentResolver.SCHEME_FILE)) {
// TODO check whether there is read access // TODO check whether there is read access
return Pair.create(statusCode, originalAddress); return originalAddress;
} }
final String[] pathsToCheck = {"", "fdroid/repo", "repo"}; final String[] pathsToCheck = {"", "fdroid/repo", "repo"};
for (final String path : pathsToCheck) { for (final String path : pathsToCheck) {
Utils.debugLog(TAG, "Check for repo at " + originalAddress + " with suffix '" + path + "'"); Utils.debugLog(TAG, "Check for repo at " + originalAddress + " with suffix '" + path + "'");
Uri.Builder builder = Uri.parse(originalAddress).buildUpon().appendEncodedPath(path); Uri.Builder builder = Uri.parse(originalAddress).buildUpon().appendEncodedPath(path);
final String addressWithoutIndex = builder.build().toString(); final String addressWithoutIndex = builder.build().toString();
runOnUiThread(() -> textSearching.setText(getString(R.string.repo_searching_address, publishProgress(addressWithoutIndex);
addressWithoutIndex)));
if (urlRepoMap.containsKey(addressWithoutIndex)) { if (urlRepoMap.containsKey(addressWithoutIndex)) {
statusCode = refreshDialog; statusCode = REFRESH_DIALOG;
return Pair.create(statusCode, addressWithoutIndex); return addressWithoutIndex;
} }
final Uri uri = builder.appendPath(IndexUpdater.SIGNED_FILE_NAME).build(); final Uri uri = builder.appendPath(IndexUpdater.SIGNED_FILE_NAME).build();
try { try {
final URL url = new URL(uri.toString()); if (checkForRepository(uri)) {
Utils.debugLog(TAG, "Found F-Droid repo at " + addressWithoutIndex);
return addressWithoutIndex;
}
} catch (IOException e) {
Log.e(TAG, "Error while searching for repo at " + addressWithoutIndex, e);
return originalAddress;
}
if (isCancelled()) {
Utils.debugLog(TAG, "Not checking more repo addresses, because process was skipped.");
break;
}
}
return originalAddress;
}
private boolean checkForRepository(Uri indexUri) throws IOException {
final URL url = new URL(indexUri.toString());
final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("HEAD"); connection.setRequestMethod("HEAD");
statusCode = connection.getResponseCode(); statusCode = connection.getResponseCode();
if (statusCode == HttpURLConnection.HTTP_UNAUTHORIZED return statusCode == HttpURLConnection.HTTP_UNAUTHORIZED
|| statusCode == HttpURLConnection.HTTP_OK) { || statusCode == HttpURLConnection.HTTP_OK;
Utils.debugLog(TAG, "Found F-Droid repo at " + addressWithoutIndex);
return Pair.create(statusCode, addressWithoutIndex);
} }
} catch (IOException e) {
Log.e(TAG, "Error while searching for repo at " + addressWithoutIndex, e); @Override
return Pair.create(statusCode, originalAddress); protected void onProgressUpdate(String... values) {
String address = values[0];
textSearching.setText(getString(R.string.repo_searching_address, address));
} }
}
return Pair.create(statusCode, originalAddress); @Override
}) protected void onPostExecute(final String newAddress) {
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnDispose(() -> Utils.debugLog(TAG,
"Not checking more repo addresses, because process was skipped."))
.subscribe(codeAddressPair -> {
final int statusCode = codeAddressPair.first;
final String newAddress = codeAddressPair.second;
if (addRepoDialog.isShowing()) { if (addRepoDialog.isShowing()) {
if (statusCode == HttpURLConnection.HTTP_UNAUTHORIZED) { if (statusCode == HttpURLConnection.HTTP_UNAUTHORIZED) {
final View view = getLayoutInflater().inflate(R.layout.login, null); final View view = getLayoutInflater().inflate(R.layout.login, null);
final AlertDialog credentialsDialog = new AlertDialog.Builder(context) final AlertDialog credentialsDialog = new AlertDialog.Builder(context)
.setView(view).create(); .setView(view).create();
@ -670,20 +676,30 @@ public class ManageReposActivity extends AppCompatActivity
credentialsDialog.setTitle(R.string.login_title); credentialsDialog.setTitle(R.string.login_title);
credentialsDialog.setButton(DialogInterface.BUTTON_NEGATIVE, credentialsDialog.setButton(DialogInterface.BUTTON_NEGATIVE,
getString(R.string.cancel), (dialog, which) -> { getString(R.string.cancel),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss(); dialog.dismiss();
// cancel parent dialog, don't add repo // cancel parent dialog, don't add repo
addRepoDialog.cancel(); addRepoDialog.cancel();
}
}); });
credentialsDialog.setButton(DialogInterface.BUTTON_POSITIVE, credentialsDialog.setButton(DialogInterface.BUTTON_POSITIVE,
getString(R.string.ok), getString(R.string.ok),
(dialog, which) -> createNewRepo(newAddress, fingerprint, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
createNewRepo(newAddress, fingerprint,
nameInput.getText().toString(), nameInput.getText().toString(),
passwordInput.getText().toString())); passwordInput.getText().toString());
}
});
credentialsDialog.show(); credentialsDialog.show();
} else if (statusCode == refreshDialog) {
} else if (statusCode == REFRESH_DIALOG) {
addRepoForm.setVisibility(View.VISIBLE); addRepoForm.setVisibility(View.VISIBLE);
positiveButton.setVisibility(View.VISIBLE); positiveButton.setVisibility(View.VISIBLE);
textSearching.setText(""); textSearching.setText("");
@ -691,22 +707,29 @@ public class ManageReposActivity extends AppCompatActivity
skip.setOnClickListener(null); skip.setOnClickListener(null);
validateRepoDetails(newAddress, fingerprint); validateRepoDetails(newAddress, fingerprint);
} else { } else {
// create repo without username/password // create repo without username/password
createNewRepo(newAddress, fingerprint); createNewRepo(newAddress, fingerprint);
} }
} }
}); }
compositeDisposable.add(disposable); };
skip.setOnClickListener(v -> { skip.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Still proceed with adding the repo, just don't bother searching for // Still proceed with adding the repo, just don't bother searching for
// a better alternative than the one provided. // a better alternative than the one provided.
// The reason for this is that if they are not connected to the internet, // The reason for this is that if they are not connected to the internet,
// or their internet is playing up, then you'd have to wait for several // or their internet is playing up, then you'd have to wait for several
// connection timeouts before being able to proceed. // connection timeouts before being able to proceed.
createNewRepo(originalAddress, fingerprint); createNewRepo(originalAddress, fingerprint);
disposable.dispose(); checker.cancel(false);
}
}); });
checker.execute(originalAddress);
} }
/** /**

View File

@ -53,7 +53,6 @@ import org.fdroid.fdroid.work.CleanCacheWorker;
import org.fdroid.fdroid.work.FDroidMetricsWorker; import org.fdroid.fdroid.work.FDroidMetricsWorker;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.preference.CheckBoxPreference; import androidx.preference.CheckBoxPreference;
import androidx.preference.EditTextPreference; import androidx.preference.EditTextPreference;
import androidx.preference.ListPreference; import androidx.preference.ListPreference;
@ -292,7 +291,7 @@ public class PreferencesFragment extends PreferenceFragmentCompat
AppCompatActivity activity = (AppCompatActivity) getActivity(); AppCompatActivity activity = (AppCompatActivity) getActivity();
// Theme will be applied upon activity creation // Theme will be applied upon activity creation
if (activity != null) { if (activity != null) {
ActivityCompat.recreate(activity); activity.recreate();
} }
} }
break; break;

View File

@ -23,12 +23,10 @@ import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.textfield.TextInputLayout;
import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.NfcHelper; import org.fdroid.fdroid.NfcHelper;
@ -39,6 +37,7 @@ import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.Repo;
import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.data.RepoProvider;
import org.fdroid.fdroid.data.Schema.RepoTable; import org.fdroid.fdroid.data.Schema.RepoTable;
import org.fdroid.fdroid.qr.QrGenAsyncTask;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
@ -52,7 +51,6 @@ import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import io.reactivex.rxjava3.disposables.Disposable;
public class RepoDetailsActivity extends AppCompatActivity { public class RepoDetailsActivity extends AppCompatActivity {
private static final String TAG = "RepoDetailsActivity"; private static final String TAG = "RepoDetailsActivity";
@ -92,8 +90,6 @@ public class RepoDetailsActivity extends AppCompatActivity {
private MirrorAdapter adapterToNotify; private MirrorAdapter adapterToNotify;
private Disposable disposable;
/** /**
* Help function to make switching between two view states easier. * Help function to make switching between two view states easier.
* Perhaps there is a better way to do this. I recall that using Adobe * Perhaps there is a better way to do this. I recall that using Adobe
@ -144,19 +140,7 @@ public class RepoDetailsActivity extends AppCompatActivity {
Uri uri = Uri.parse(repo.address); Uri uri = Uri.parse(repo.address);
uri = uri.buildUpon().appendQueryParameter("fingerprint", repo.fingerprint).build(); uri = uri.buildUpon().appendQueryParameter("fingerprint", repo.fingerprint).build();
String qrUriString = uri.toString(); String qrUriString = uri.toString();
disposable = Utils.generateQrBitmap(this, qrUriString) new QrGenAsyncTask(this, R.id.qr_code).execute(qrUriString);
.subscribe(bitmap -> {
final ImageView qrCode = findViewById(R.id.qr_code);
if (qrCode != null) {
qrCode.setImageBitmap(bitmap);
}
});
}
@Override
protected void onDestroy() {
disposable.dispose();
super.onDestroy();
} }
@TargetApi(14) @TargetApi(14)
@ -440,10 +424,8 @@ public class RepoDetailsActivity extends AppCompatActivity {
public void showChangePasswordDialog(final View parentView) { public void showChangePasswordDialog(final View parentView) {
final View view = getLayoutInflater().inflate(R.layout.login, null); final View view = getLayoutInflater().inflate(R.layout.login, null);
final AlertDialog credentialsDialog = new AlertDialog.Builder(this).setView(view).create(); final AlertDialog credentialsDialog = new AlertDialog.Builder(this).setView(view).create();
final TextInputLayout nameInputLayout = view.findViewById(R.id.edit_name); final EditText nameInput = view.findViewById(R.id.edit_name);
final TextInputLayout passwordInputLayout = view.findViewById(R.id.edit_password); final EditText passwordInput = view.findViewById(R.id.edit_password);
final EditText nameInput = nameInputLayout.getEditText();
final EditText passwordInput = passwordInputLayout.getEditText();
nameInput.setText(repo.username); nameInput.setText(repo.username);
passwordInput.requestFocus(); passwordInput.requestFocus();

View File

@ -3,7 +3,6 @@ package org.fdroid.fdroid.views;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -23,7 +22,6 @@ import org.fdroid.fdroid.data.AppProvider;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.fragment.app.FragmentStatePagerAdapter;
@ -134,14 +132,10 @@ public class ScreenShotsActivity extends AppCompatActivity {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) { @Nullable Bundle savedInstanceState) {
Drawable screenShotPlaceholder = ContextCompat.getDrawable(
inflater.getContext(),
R.drawable.screenshot_placeholder
);
DisplayImageOptions displayImageOptions = Utils.getDefaultDisplayImageOptionsBuilder() DisplayImageOptions displayImageOptions = Utils.getDefaultDisplayImageOptionsBuilder()
.showImageOnFail(screenShotPlaceholder) .showImageOnFail(R.drawable.screenshot_placeholder)
.showImageOnLoading(screenShotPlaceholder) .showImageOnLoading(R.drawable.screenshot_placeholder)
.showImageForEmptyUri(screenShotPlaceholder) .showImageForEmptyUri(R.drawable.screenshot_placeholder)
.build(); .build();
View rootView = inflater.inflate(R.layout.activity_screenshots_page, container, false); View rootView = inflater.inflate(R.layout.activity_screenshots_page, container, false);

View File

@ -1,7 +1,6 @@
package org.fdroid.fdroid.views; package org.fdroid.fdroid.views;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -15,7 +14,6 @@ import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.App; import org.fdroid.fdroid.data.App;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
/** /**
@ -31,12 +29,10 @@ class ScreenShotsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.V
this.listener = listener; this.listener = listener;
screenshots = app.getAllScreenshots(context); screenshots = app.getAllScreenshots(context);
Drawable screenShotPlaceholder = ContextCompat.getDrawable(context, R.drawable.screenshot_placeholder);
displayImageOptions = Utils.getDefaultDisplayImageOptionsBuilder() displayImageOptions = Utils.getDefaultDisplayImageOptionsBuilder()
.showImageOnFail(screenShotPlaceholder) .showImageOnFail(R.drawable.screenshot_placeholder)
.showImageOnLoading(screenShotPlaceholder) .showImageOnLoading(R.drawable.screenshot_placeholder)
.showImageForEmptyUri(screenShotPlaceholder) .showImageForEmptyUri(R.drawable.screenshot_placeholder)
.build(); .build();
} }

View File

@ -126,8 +126,10 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
sortImage = (ImageView) findViewById(R.id.sort); sortImage = (ImageView) findViewById(R.id.sort);
final Drawable lastUpdated = DrawableCompat.wrap(ContextCompat.getDrawable(this, final Drawable lastUpdated = DrawableCompat.wrap(ContextCompat.getDrawable(this,
R.drawable.ic_last_updated)).mutate(); R.drawable.ic_last_updated)).mutate();
DrawableCompat.setTint(lastUpdated, FDroidApp.isAppThemeLight() ? Color.BLACK : Color.WHITE);
final Drawable words = DrawableCompat.wrap(ContextCompat.getDrawable(AppListActivity.this, final Drawable words = DrawableCompat.wrap(ContextCompat.getDrawable(AppListActivity.this,
R.drawable.ic_sort)).mutate(); R.drawable.ic_sort)).mutate();
DrawableCompat.setTint(words, FDroidApp.isAppThemeLight() ? Color.BLACK : Color.WHITE);
sortImage.setImageDrawable(SortClause.WORDS.equals(sortClauseSelected) ? words : lastUpdated); sortImage.setImageDrawable(SortClause.WORDS.equals(sortClauseSelected) ? words : lastUpdated);
sortImage.setOnClickListener(new View.OnClickListener() { sortImage.setOnClickListener(new View.OnClickListener() {
@Override @Override
@ -266,7 +268,6 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
public void onSearchTermsChanged(@Nullable String category, @NonNull String searchTerms) { public void onSearchTermsChanged(@Nullable String category, @NonNull String searchTerms) {
this.category = category; this.category = category;
this.searchTerms = searchTerms; this.searchTerms = searchTerms;
appView.scrollToPosition(0);
getSupportLoaderManager().restartLoader(0, null, this); getSupportLoaderManager().restartLoader(0, null, this);
if (TextUtils.isEmpty(searchTerms)) { if (TextUtils.isEmpty(searchTerms)) {
removeSavedSearchSettings(this, SEARCH_TERMS_KEY); removeSavedSearchSettings(this, SEARCH_TERMS_KEY);

View File

@ -31,22 +31,20 @@ import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import com.ashokvarma.bottomnavigation.BottomNavigationBar;
import androidx.annotation.Nullable; import com.ashokvarma.bottomnavigation.BottomNavigationItem;
import androidx.appcompat.app.AppCompatActivity; import com.ashokvarma.bottomnavigation.TextBadgeItem;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.badge.BadgeDrawable;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import org.fdroid.fdroid.AppUpdateStatusManager; import org.fdroid.fdroid.AppUpdateStatusManager;
import org.fdroid.fdroid.AppUpdateStatusManager.AppUpdateStatus; import org.fdroid.fdroid.AppUpdateStatusManager.AppUpdateStatus;
import org.fdroid.fdroid.BuildConfig;
import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.NfcHelper; import org.fdroid.fdroid.NfcHelper;
import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Preferences;
@ -63,6 +61,17 @@ import org.fdroid.fdroid.views.AppDetailsActivity;
import org.fdroid.fdroid.views.ManageReposActivity; import org.fdroid.fdroid.views.ManageReposActivity;
import org.fdroid.fdroid.views.apps.AppListActivity; import org.fdroid.fdroid.views.apps.AppListActivity;
import java.lang.reflect.Field;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
/** /**
* Main view shown to users upon starting F-Droid. * Main view shown to users upon starting F-Droid.
* <p> * <p>
@ -77,7 +86,7 @@ import org.fdroid.fdroid.views.apps.AppListActivity;
* When switching from one screen to the next, we stay within this activity. The new screen will * When switching from one screen to the next, we stay within this activity. The new screen will
* get inflated (if required) * get inflated (if required)
*/ */
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity implements BottomNavigationBar.OnTabSelectedListener {
private static final String TAG = "MainActivity"; private static final String TAG = "MainActivity";
@ -94,10 +103,13 @@ public class MainActivity extends AppCompatActivity {
private static final String ACTION_ADD_REPO = "org.fdroid.fdroid.MainActivity.ACTION_ADD_REPO"; private static final String ACTION_ADD_REPO = "org.fdroid.fdroid.MainActivity.ACTION_ADD_REPO";
public static final String ACTION_REQUEST_SWAP = "requestSwap"; public static final String ACTION_REQUEST_SWAP = "requestSwap";
private static final String STATE_SELECTED_MENU_ID = "selectedMenuId";
private RecyclerView pager; private RecyclerView pager;
private MainViewAdapter adapter; private MainViewAdapter adapter;
private BottomNavigationView bottomNavigation; private BottomNavigationBar bottomNavigation;
private BadgeDrawable updatesBadge; private int selectedMenuId;
private TextBadgeItem updatesBadge;
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
@ -122,35 +134,88 @@ public class MainActivity extends AppCompatActivity {
pager.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); pager.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
} }
bottomNavigation = (BottomNavigationView) findViewById(R.id.bottom_navigation); updatesBadge = new TextBadgeItem().hide(false);
bottomNavigation.setOnNavigationItemSelectedListener(item -> {
pager.scrollToPosition(item.getOrder());
if (item.getItemId() == 2) { bottomNavigation = (BottomNavigationBar) findViewById(R.id.bottom_navigation);
bottomNavigation
.addItem(new BottomNavigationItem(R.drawable.ic_latest, R.string.main_menu__latest_apps));
if (BuildConfig.FLAVOR.startsWith("full")) {
bottomNavigation
.addItem(new BottomNavigationItem(R.drawable.ic_categories, R.string.main_menu__categories))
.addItem(new BottomNavigationItem(R.drawable.ic_nearby, R.string.main_menu__swap_nearby));
bottomNavigation.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (bottomNavigation.getCurrentSelectedPosition() == 2) {
NearbyViewBinder.updateUsbOtg(MainActivity.this); NearbyViewBinder.updateUsbOtg(MainActivity.this);
} }
}
return true;
}); });
updatesBadge = bottomNavigation.getOrCreateBadge(R.id.updates); }
updatesBadge.setVisible(false); bottomNavigation.setTabSelectedListener(this)
.setBarBackgroundColor(getBottomNavigationBackgroundColorResId())
.setInActiveColor(R.color.bottom_nav_items)
.setActiveColor(R.color.bottom_nav_active)
.setMode(BottomNavigationBar.MODE_FIXED)
.addItem(new BottomNavigationItem(R.drawable.ic_updates, R.string.main_menu__updates)
.setBadgeItem(updatesBadge))
.addItem(new BottomNavigationItem(R.drawable.ic_settings, R.string.menu_settings))
.setAnimationDuration(0)
.initialise();
// turn off animation, scaling, and truncate labels in the middle
final LinearLayout linearLayout = bottomNavigation.findViewById(R.id.bottom_navigation_bar_item_container);
final int childCount = linearLayout.getChildCount();
for (int i = 0; i < childCount; i++) {
final View fixedBottomNavigationTab = linearLayout.getChildAt(i);
try {
Field labelScale = fixedBottomNavigationTab.getClass().getDeclaredField("labelScale");
labelScale.setAccessible(true);
labelScale.set(fixedBottomNavigationTab, 1.0f);
} catch (IllegalAccessException | NoSuchFieldException | IllegalArgumentException e) {
e.printStackTrace();
}
final View container = fixedBottomNavigationTab.findViewById(R.id.fixed_bottom_navigation_container);
container.setPadding(
2,
container.getPaddingTop(),
2,
container.getPaddingBottom()
);
final TextView title = fixedBottomNavigationTab.findViewById(R.id.fixed_bottom_navigation_title);
title.setEllipsize(TextUtils.TruncateAt.MIDDLE);
title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13);
}
IntentFilter updateableAppsFilter = new IntentFilter(AppUpdateStatusManager.BROADCAST_APPSTATUS_LIST_CHANGED); IntentFilter updateableAppsFilter = new IntentFilter(AppUpdateStatusManager.BROADCAST_APPSTATUS_LIST_CHANGED);
updateableAppsFilter.addAction(AppUpdateStatusManager.BROADCAST_APPSTATUS_CHANGED); updateableAppsFilter.addAction(AppUpdateStatusManager.BROADCAST_APPSTATUS_CHANGED);
updateableAppsFilter.addAction(AppUpdateStatusManager.BROADCAST_APPSTATUS_REMOVED); updateableAppsFilter.addAction(AppUpdateStatusManager.BROADCAST_APPSTATUS_REMOVED);
LocalBroadcastManager.getInstance(this).registerReceiver(onUpdateableAppsChanged, updateableAppsFilter); LocalBroadcastManager.getInstance(this).registerReceiver(onUpdateableAppsChanged, updateableAppsFilter);
if (savedInstanceState != null) {
selectedMenuId = savedInstanceState.getInt(STATE_SELECTED_MENU_ID, (int) adapter.getItemId(0));
} else {
selectedMenuId = (int) adapter.getItemId(0);
}
setSelectedMenuInNav();
initialRepoUpdateIfRequired(); initialRepoUpdateIfRequired();
Intent intent = getIntent(); Intent intent = getIntent();
handleSearchOrAppViewIntent(intent); handleSearchOrAppViewIntent(intent);
} }
private void setSelectedMenuInNav(int menuId) { @Override
int position = adapter.adapterPositionFromItemId(menuId); protected void onSaveInstanceState(Bundle outState) {
pager.scrollToPosition(position); outState.putInt(STATE_SELECTED_MENU_ID, selectedMenuId);
bottomNavigation.setSelectedItemId(position); super.onSaveInstanceState(outState);
}
private void setSelectedMenuInNav() {
bottomNavigation.selectTab(adapter.adapterPositionFromItemId(selectedMenuId));
} }
private void initialRepoUpdateIfRequired() { private void initialRepoUpdateIfRequired() {
@ -168,13 +233,19 @@ public class MainActivity extends AppCompatActivity {
if (getIntent().hasExtra(EXTRA_VIEW_UPDATES)) { if (getIntent().hasExtra(EXTRA_VIEW_UPDATES)) {
getIntent().removeExtra(EXTRA_VIEW_UPDATES); getIntent().removeExtra(EXTRA_VIEW_UPDATES);
setSelectedMenuInNav(R.id.updates); pager.scrollToPosition(adapter.adapterPositionFromItemId(R.id.updates));
selectedMenuId = R.id.updates;
setSelectedMenuInNav();
} else if (getIntent().hasExtra(EXTRA_VIEW_NEARBY)) { } else if (getIntent().hasExtra(EXTRA_VIEW_NEARBY)) {
getIntent().removeExtra(EXTRA_VIEW_NEARBY); getIntent().removeExtra(EXTRA_VIEW_NEARBY);
setSelectedMenuInNav(R.id.nearby); pager.scrollToPosition(adapter.adapterPositionFromItemId(R.id.nearby));
selectedMenuId = R.id.nearby;
setSelectedMenuInNav();
} else if (getIntent().hasExtra(EXTRA_VIEW_SETTINGS)) { } else if (getIntent().hasExtra(EXTRA_VIEW_SETTINGS)) {
getIntent().removeExtra(EXTRA_VIEW_SETTINGS); getIntent().removeExtra(EXTRA_VIEW_SETTINGS);
setSelectedMenuInNav(R.id.settings); pager.scrollToPosition(adapter.adapterPositionFromItemId(R.id.settings));
selectedMenuId = R.id.settings;
setSelectedMenuInNav();
} }
// AppDetailsActivity and RepoDetailsActivity set different NFC actions, so reset here // AppDetailsActivity and RepoDetailsActivity set different NFC actions, so reset here
@ -221,6 +292,22 @@ public class MainActivity extends AppCompatActivity {
} }
} }
@Override
public void onTabSelected(int position) {
pager.scrollToPosition(position);
selectedMenuId = (int) adapter.getItemId(position);
}
@Override
public void onTabUnselected(int position) {
}
@Override
public void onTabReselected(int position) {
}
/** /**
* Since any app could send this {@link Intent}, and the search terms are * Since any app could send this {@link Intent}, and the search terms are
* fed into a SQL query, the data must be strictly sanitized to avoid * fed into a SQL query, the data must be strictly sanitized to avoid
@ -368,14 +455,20 @@ public class MainActivity extends AppCompatActivity {
private void refreshUpdatesBadge(int canUpdateCount) { private void refreshUpdatesBadge(int canUpdateCount) {
if (canUpdateCount == 0) { if (canUpdateCount == 0) {
updatesBadge.setVisible(false); updatesBadge.hide(true);
updatesBadge.clearNumber();
} else { } else {
updatesBadge.setNumber(canUpdateCount); updatesBadge.setText(Integer.toString(canUpdateCount));
updatesBadge.setVisible(true); updatesBadge.show(true);
} }
} }
private int getBottomNavigationBackgroundColorResId() {
if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
return R.color.fdroid_night;
}
return R.color.fdroid_blue;
}
private static class NonScrollingHorizontalLayoutManager extends LinearLayoutManager { private static class NonScrollingHorizontalLayoutManager extends LinearLayoutManager {
NonScrollingHorizontalLayoutManager(Context context) { NonScrollingHorizontalLayoutManager(Context context) {
super(context, LinearLayoutManager.HORIZONTAL, false); super(context, LinearLayoutManager.HORIZONTAL, false);

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@android:color/white" android:state_checked="true" />
<item android:color="@android:color/white" android:state_pressed="true" />
<item android:color="#B8D4F0" />
</selector>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,58 +1,38 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt" xmlns:aapt="http://schemas.android.com/aapt"
android:width="201.8835dp" android:width="300dp"
android:height="48dp" android:height="50dp"
android:viewportWidth="201.8835" android:viewportWidth="300"
android:viewportHeight="48"> android:viewportHeight="50">
<path <path
android:pathData="M24,0L177.883,0A24,24 0,0 1,201.883 24L201.883,24A24,24 0,0 1,177.883 48L24,48A24,24 0,0 1,0 24L0,24A24,24 0,0 1,24 0z" android:pathData="M25.806,0.226L275.806,0.226A24,24 0,0 1,299.806 24.226L299.806,24.226A24,24 0,0 1,275.806 48.226L25.806,48.226A24,24 0,0 1,1.806 24.226L1.806,24.226A24,24 0,0 1,25.806 0.226z"
android:fillType="evenOdd"> android:fillType="evenOdd">
<aapt:attr name="android:fillColor"> <aapt:attr name="android:fillColor">
<gradient <gradient
android:startY="0.51552" android:startY="2.1030872"
android:startX="52.883495" android:startX="150.80646"
android:endY="48" android:endY="48.225807"
android:endX="52.883495" android:endX="150.80646"
android:type="linear"> android:type="linear">
<item android:offset="0" android:color="#FF52BBF8"/> <item
<item android:offset="1" android:color="#FF2FA8EE"/> android:offset="0"
android:color="#FF7ACFFF" />
<item
android:offset="1"
android:color="#FF4CBEFF" />
</gradient> </gradient>
</aapt:attr> </aapt:attr>
</path> </path>
<path <path
android:pathData="M177.883,24m-22,0a22,22 0,1 1,44 0a22,22 0,1 1,-44 0" android:pathData="M275.806,24.226m-22,0a22,22 0,1 1,44 0a22,22 0,1 1,-44 0"
android:fillColor="#ffffff" android:fillColor="#ffffff"
android:fillType="evenOdd" /> android:fillType="evenOdd" />
<path <path
android:pathData="M189.393,16.026C190.964,18.29 191.883,21.036 191.883,24c0,2.963 -0.92,5.71 -2.49,7.974L185.765,28.347C186.478,27.057 186.883,25.577 186.883,24 186.883,22.423 186.478,20.942 185.765,19.653l3.627,-3.627zM185.857,12.491 L182.23,16.119C180.94,15.405 179.46,15 177.883,15c-4.97,0 -9,4.03 -9,9 0,4.97 4.03,9 9,9 1.577,0 3.058,-0.405 4.347,-1.118l3.627,3.627C183.593,37.08 180.847,38 177.883,38 170.151,38 163.883,31.732 163.883,24 163.883,16.268 170.151,10 177.883,10c2.963,0 5.71,0.92 7.974,2.49z" android:pathData="M287.316,16.252C288.886,18.516 289.806,21.262 289.806,24.226c0,2.963 -0.92,5.71 -2.49,7.974L283.688,28.573C284.401,27.283 284.806,25.803 284.806,24.226 284.806,22.649 284.401,21.168 283.688,19.879l3.627,-3.627zM283.78,12.717 L280.153,16.345C278.863,15.631 277.383,15.226 275.806,15.226c-4.97,0 -9,4.03 -9,9 0,4.97 4.03,9 9,9 1.577,0 3.058,-0.405 4.347,-1.118l3.627,3.627C281.516,37.306 278.77,38.226 275.806,38.226 268.074,38.226 261.806,31.958 261.806,24.226 261.806,16.494 268.074,10.226 275.806,10.226c2.963,0 5.71,0.92 7.974,2.49z"
android:fillColor="#3faff0" android:fillColor="#3faff0"
android:fillType="evenOdd" /> android:fillType="evenOdd" />
<path <path
android:pathData="M189.393,16.026C190.964,18.29 191.883,21.036 191.883,24c0,2.963 -0.92,5.71 -2.49,7.974L185.765,28.347C186.478,27.057 186.883,25.577 186.883,24 186.883,22.423 186.478,20.942 185.765,19.653l3.627,-3.627z" android:pathData="M287.316,16.252C288.886,18.516 289.806,21.262 289.806,24.226c0,2.963 -0.92,5.71 -2.49,7.974L283.688,28.573C284.401,27.283 284.806,25.803 284.806,24.226 284.806,22.649 284.401,21.168 283.688,19.879l3.627,-3.627z"
android:fillColor="#b8d5e6" android:fillColor="#b8d5e6"
android:fillType="evenOdd" /> android:fillType="evenOdd" />
<path
android:pathData="M25.912,33.551L25.912,14.462h6.576q2.227,0 3.398,0.273 1.641,0.378 2.799,1.367 1.51,1.276 2.253,3.268 0.755,1.979 0.755,4.531 0,2.174 -0.508,3.854 -0.508,1.68 -1.302,2.786 -0.794,1.094 -1.745,1.732 -0.938,0.625 -2.279,0.951 -1.328,0.326 -3.06,0.326zM28.438,31.298h4.076q1.888,0 2.956,-0.352 1.081,-0.352 1.719,-0.99 0.898,-0.898 1.393,-2.409 0.508,-1.523 0.508,-3.685 0,-2.995 -0.99,-4.596 -0.977,-1.615 -2.383,-2.161 -1.016,-0.391 -3.268,-0.391h-4.01z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
<path
android:pathData="m46.414,24.254q0,-4.753 2.552,-7.435 2.552,-2.695 6.589,-2.695 2.643,0 4.766,1.263 2.122,1.263 3.229,3.529 1.12,2.253 1.12,5.117 0,2.904 -1.172,5.195 -1.172,2.292 -3.32,3.477 -2.148,1.172 -4.635,1.172 -2.695,0 -4.818,-1.302 -2.122,-1.302 -3.216,-3.555 -1.094,-2.253 -1.094,-4.766zM49.018,24.293q0,3.451 1.849,5.443 1.862,1.979 4.661,1.979 2.852,0 4.688,-2.005 1.849,-2.005 1.849,-5.69 0,-2.331 -0.794,-4.063 -0.781,-1.745 -2.305,-2.695 -1.51,-0.964 -3.398,-0.964 -2.682,0 -4.622,1.849 -1.927,1.836 -1.927,6.146z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
<path
android:pathData="M69.886,33.551L69.886,14.462h2.591l10.026,14.987L82.503,14.462h2.422v19.089h-2.591L72.308,18.551v15z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
<path
android:pathData="m89.086,33.551 l7.331,-19.089h2.721l7.813,19.089h-2.878l-2.227,-5.781h-7.982l-2.096,5.781zM94.594,25.712h6.471l-1.992,-5.286q-0.911,-2.409 -1.354,-3.958 -0.365,1.836 -1.029,3.646z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
<path
android:pathData="M113.873,33.551L113.873,16.715h-6.289v-2.253h15.13v2.253h-6.315v16.836z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
<path
android:pathData="M127.37,33.551L127.37,14.462h13.802v2.253h-11.276v5.846h10.56v2.24h-10.56v6.497h11.719v2.253z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
</vector> </vector>

View File

@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M17,7h-3c-0.55,0 -1,0.45 -1,1s0.45,1 1,1h3c1.65,0 3,1.35 3,3s-1.35,3 -3,3h-3c-0.55,0 -1,0.45 -1,1s0.45,1 1,1h3c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5zM8,12c0,0.55 0.45,1 1,1h6c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1L9,11c-0.55,0 -1,0.45 -1,1zM10,15L7,15c-1.65,0 -3,-1.35 -3,-3s1.35,-3 3,-3h3c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h3c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1z"/>
</vector>

View File

@ -1,9 +1,33 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector android:height="169dp"
android:width="80dp" android:viewportHeight="169.33333"
android:height="140dp" android:viewportWidth="95.25"
android:viewportWidth="80" android:width="92dp"
android:viewportHeight="140"> xmlns:android="http://schemas.android.com/apk/res/android">
<path <path
android:pathData="M47,63L47,77L33,77L33,63h14m0,-2L33,61c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L49,63c0,-1.1 -0.9,-2 -2,-2zM42.14,69.86 L39.14,73.73L37,71.14 34,75h12z" android:fillAlpha="1"
android:fillColor="?attr/screenshotPlaceholderIconColor"/> android:fillColor="#e8e8e8"
android:pathData="M1.75,0L93.5,0A1.75,1.75 0,0 1,95.25 1.75L95.25,167.59A1.75,1.75 0,0 1,93.5 169.33L1.75,169.33A1.75,1.75 0,0 1,0 167.59L0,1.75A1.75,1.75 0,0 1,1.75 0z"
android:strokeAlpha="1"
android:strokeColor="#00000000"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="0.52916664" />
<path
android:fillAlpha="1"
android:fillColor="#ffffff"
android:pathData="M40.77,53.63L54.38,53.63A1.75,1.75 0,0 1,56.13 55.37L56.13,68.98A1.75,1.75 0,0 1,54.38 70.73L40.77,70.73A1.75,1.75 0,0 1,39.03 68.98L39.03,55.37A1.75,1.75 0,0 1,40.77 53.63z"
android:strokeAlpha="1"
android:strokeColor="#00000000"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="0.52916664" />
<path
android:fillAlpha="1"
android:fillColor="#e8e8e8"
android:pathData="m41.01,67.8 l3.21,-4.2 2.46,2.79 3.26,-4.16 4.16,5.58z"
android:strokeAlpha="1"
android:strokeColor="#00000000"
android:strokeLineCap="butt"
android:strokeLineJoin="miter"
android:strokeWidth="0.26458332" />
</vector> </vector>

View File

@ -1,10 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="@dimen/details_activity_padding" android:layout_margin="@dimen/details_activity_padding"
app:cardBackgroundColor="?attr/appDetailsCardBackground"
app:cardCornerRadius="3dp"
app:cardElevation="3dp"
android:animateLayoutChanges="true"> android:animateLayoutChanges="true">
<LinearLayout <LinearLayout
@ -259,4 +262,4 @@
android:text="@string/more" /> android:text="@string/more" />
</LinearLayout> </LinearLayout>
</com.google.android.material.card.MaterialCardView> </androidx.cardview.widget.CardView>

View File

@ -8,12 +8,14 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true"> android:fitsSystemWindows="true">
<com.google.android.material.card.MaterialCardView <androidx.cardview.widget.CardView
android:id="@+id/search_card" android:id="@+id/search_card"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="4dp" android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginEnd="0dp" android:layout_marginEnd="0dp"
android:layout_marginRight="0dp"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:layout_marginBottom="16dp" android:layout_marginBottom="16dp"
app:layout_constraintEnd_toStartOf="@+id/sort" app:layout_constraintEnd_toStartOf="@+id/sort"
@ -66,7 +68,7 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView> </androidx.cardview.widget.CardView>
<ImageView <ImageView
android:id="@+id/sort" android:id="@+id/sort"

View File

@ -1,19 +1,16 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true"> android:fitsSystemWindows="true">
<com.google.android.material.bottomnavigation.BottomNavigationView <com.ashokvarma.bottomnavigation.BottomNavigationBar
android:id="@+id/bottom_navigation" android:id="@+id/bottom_navigation"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content" />
app:menu="@menu/main_activity_screens"
app:labelVisibilityMode="labeled"/>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/main_view_pager" android:id="@+id/main_view_pager"

View File

@ -1,20 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/screenshot"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true">
<ImageView
android:id="@+id/screenshot"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="@dimen/layout_horizontal_margin"
android:adjustViewBounds="true"
android:background="?attr/colorSurface"
android:contentDescription="@null" android:contentDescription="@null"
android:elevation="4dp" android:padding="@dimen/layout_horizontal_margin"
tools:src="@drawable/screenshot_placeholder" /> tools:src="@drawable/screenshot_placeholder"
android:fitsSystemWindows="true"/>
</FrameLayout>

View File

@ -3,11 +3,11 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingStart="24dp"
android:paddingLeft="24dp" android:paddingLeft="24dp"
android:paddingTop="20dp" android:paddingStart="24dp"
android:paddingRight="24dp"
android:paddingEnd="24dp" android:paddingEnd="24dp"
android:paddingRight="24dp"> android:paddingTop="20dp">
<LinearLayout <LinearLayout
android:id="@+id/add_repo_form" android:id="@+id/add_repo_form"
@ -15,41 +15,32 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout <TextView
android:id="@+id/edit_uri"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="4dp" android:text="@string/repo_add_url" />
android:hint="@string/repo_add_url"
android:text="@string/https">
<com.google.android.material.textfield.TextInputEditText <EditText
android:id="@+id/edit_uri"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:inputType="textUri" android:inputType="textUri"
android:maxLines="2" /> android:maxLines="2"
android:text="@string/https" />
</com.google.android.material.textfield.TextInputLayout> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/repo_add_fingerprint" />
<EditText
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/edit_fingerprint" android:id="@+id/edit_fingerprint"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="4dp"
android:digits="0123456789ABCDEFabcedf: " android:digits="0123456789ABCDEFabcedf: "
android:hint="@string/repo_add_fingerprint"
android:typeface="monospace">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textNoSuggestions" android:inputType="textNoSuggestions"
android:maxLines="3" /> android:maxLines="3"
android:typeface="monospace" />
</com.google.android.material.textfield.TextInputLayout>
<TextView <TextView
android:id="@+id/overwrite_message" android:id="@+id/overwrite_message"
@ -61,12 +52,12 @@
</LinearLayout> </LinearLayout>
<TextView <TextView
android:id="@+id/text_searching_for_repo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp" android:padding="10dp"
android:textSize="16sp" android:textSize="16sp"
android:id="@+id/text_searching_for_repo"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="Searching for repository at\nhttps://www.example.com/fdroid/repo/" /> tools:text="Searching for repository at\nhttps://www.example.com/fdroid/repo/" />
</RelativeLayout> </RelativeLayout>

View File

@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:foreground="?attr/selectableItemBackground"
android:clickable="true" android:clickable="true"
android:focusable="true"> android:focusable="true">
@ -51,4 +52,4 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView> </androidx.cardview.widget.CardView>

View File

@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="220dp" android:layout_height="220dp"
android:foreground="?attr/selectableItemBackground"
android:clickable="true" android:clickable="true"
android:focusable="true"> android:focusable="true">
@ -57,4 +58,4 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView> </androidx.cardview.widget.CardView>

View File

@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:foreground="?attr/selectableItemBackground"
android:clickable="true" android:clickable="true"
android:focusable="true"> android:focusable="true">
@ -52,4 +53,4 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView> </androidx.cardview.widget.CardView>

View File

@ -1,10 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="@dimen/details_activity_padding"> android:layout_margin="@dimen/details_activity_padding"
app:cardBackgroundColor="?attr/appDetailsCardBackground"
app:cardCornerRadius="3dp"
app:cardElevation="3dp">
<LinearLayout <LinearLayout
android:layout_width="fill_parent" android:layout_width="fill_parent"
@ -29,4 +32,4 @@
app:columnCount="2" /> app:columnCount="2" />
</LinearLayout> </LinearLayout>
</com.google.android.material.card.MaterialCardView> </androidx.cardview.widget.CardView>

View File

@ -1,10 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="@dimen/details_activity_padding" android:layout_margin="@dimen/details_activity_padding"
app:cardBackgroundColor="?attr/appDetailsCardBackground"
app:cardCornerRadius="3dp"
app:cardElevation="3dp"
android:animateLayoutChanges="true"> android:animateLayoutChanges="true">
<LinearLayout <LinearLayout
@ -260,4 +263,4 @@
android:text="@string/more" /> android:text="@string/more" />
</LinearLayout> </LinearLayout>
</com.google.android.material.card.MaterialCardView> </androidx.cardview.widget.CardView>

View File

@ -29,8 +29,8 @@
android:paddingEnd="@dimen/details_activity__collapsable_lists__padding__horizontal" android:paddingEnd="@dimen/details_activity__collapsable_lists__padding__horizontal"
android:background="?selectableItemBackground" android:background="?selectableItemBackground"
app:drawableEndCompat="@drawable/ic_expand_more" app:drawableEndCompat="@drawable/ic_expand_more"
app:drawableStartCompat="@drawable/ic_link" app:drawableStartCompat="@drawable/ic_website"
app:drawableLeftCompat="@drawable/ic_link" app:drawableLeftCompat="@drawable/ic_website"
app:drawableRightCompat="@drawable/ic_expand_more" /> app:drawableRightCompat="@drawable/ic_expand_more" />
</FrameLayout> </FrameLayout>

View File

@ -1,8 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_margin="@dimen/details_screenshot_margin"> android:layout_margin="@dimen/details_screenshot_margin"
android:padding="10dp"
app:cardCornerRadius="0dp"
app:cardElevation="3dp">
<ImageView <ImageView
android:id="@+id/image" android:id="@+id/image"
@ -12,4 +16,4 @@
android:minWidth="@dimen/details_screenshot_width" android:minWidth="@dimen/details_screenshot_width"
android:scaleType="centerCrop" /> android:scaleType="centerCrop" />
</com.google.android.material.card.MaterialCardView> </androidx.cardview.widget.CardView>

View File

@ -2,62 +2,60 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:orientation="vertical">
<TextView <TextView
android:id="@+id/name" android:id="@+id/name"
tools:text="Business"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
android:paddingStart="18dp"
android:paddingLeft="18dp"
android:paddingEnd="18dp"
android:paddingRight="18dp"
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
android:textColor="?attr/categoryName"
android:textSize="18sp"
app:layout_constraintBaseline_toBaselineOf="@+id/view_all_button"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBaseline_toBaselineOf="@+id/view_all_button"
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
android:textSize="18sp"
android:textColor="?attr/categoryName"
android:paddingLeft="18dp"
android:paddingStart="18dp"
android:paddingRight="18dp"
android:paddingEnd="18dp"
tools:layout_editor_absoluteX="0dp" tools:layout_editor_absoluteX="0dp"
tools:text="Business" /> android:focusable="true"
android:focusableInTouchMode="true" />
<Button <Button
android:id="@+id/view_all_button" android:id="@+id/view_all_button"
style="@style/Widget.App.Button.TextButton" tools:text="View all 10"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="0dp" android:layout_height="0dp"
android:textAllCaps="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteX="268dp" app:layout_constraintEnd_toEndOf="parent"
tools:text="View all 10" /> style="@style/Widget.MaterialComponents.Button.TextButton"
android:textAllCaps="true"
tools:layout_editor_absoluteX="268dp" />
<FrameLayout <FrameLayout
android:id="@+id/category_background" android:id="@+id/category_background"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="@+id/app_cards"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/app_cards" app:layout_constraintTop_toTopOf="@+id/app_cards"
app:layout_constraintBottom_toBottomOf="@+id/app_cards"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:background="#ffffbbbb" /> tools:background="#ffffbbbb" />
<org.fdroid.fdroid.views.apps.FeatureImage <org.fdroid.fdroid.views.apps.FeatureImage
android:id="@+id/category_image" android:id="@+id/category_image"
app:layout_constraintStart_toStartOf="@+id/category_background"
app:layout_constraintEnd_toEndOf="@+id/category_background"
app:layout_constraintTop_toTopOf="@+id/category_background"
app:layout_constraintBottom_toBottomOf="@+id/category_background"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:importantForAccessibility="no"
android:scaleType="fitStart"
app:layout_constraintBottom_toBottomOf="@+id/category_background"
app:layout_constraintEnd_toEndOf="@+id/category_background"
app:layout_constraintStart_toStartOf="@+id/category_background"
app:layout_constraintTop_toTopOf="@+id/category_background"
tools:ignore="ContentDescription"
tools:src="@drawable/category_graphics" tools:src="@drawable/category_graphics"
tools:targetApi="jelly_bean" /> android:scaleType="fitStart"
android:importantForAccessibility="no"
tools:ignore="ContentDescription" tools:targetApi="jelly_bean"/>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/app_cards" android:id="@+id/app_cards"
@ -65,8 +63,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:clipToPadding="false" android:clipToPadding="false"
android:orientation="horizontal" android:orientation="horizontal"
android:paddingTop="@dimen/category_preview__app_list__padding__vertical"
android:paddingBottom="@dimen/category_preview__app_list__padding__vertical" android:paddingBottom="@dimen/category_preview__app_list__padding__vertical"
android:paddingTop="@dimen/category_preview__app_list__padding__vertical"
app:layoutManager="LinearLayoutManager" app:layoutManager="LinearLayoutManager"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"

View File

@ -4,13 +4,13 @@
android:layout_height="match_parent"> android:layout_height="match_parent">
<LinearLayout <LinearLayout
android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="24dp" android:paddingLeft="24dp"
android:paddingTop="20dp"
android:paddingRight="24dp" android:paddingRight="24dp"
android:paddingBottom="24dp"> android:paddingBottom="24dp"
android:paddingTop="20dp">
<TextView <TextView
android:id="@android:id/text1" android:id="@android:id/text1"
@ -25,19 +25,13 @@
android:layout_marginTop="20dp" android:layout_marginTop="20dp"
android:text="@string/crash_dialog_comment_prompt" /> android:text="@string/crash_dialog_comment_prompt" />
<com.google.android.material.textfield.TextInputLayout <EditText
android:id="@android:id/input" android:id="@android:id/input"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="20dp"> android:inputType="textMultiLine"
android:layout_marginTop="20dp" />
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>

View File

@ -3,51 +3,41 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingStart="24dp"
android:paddingLeft="24dp" android:paddingLeft="24dp"
android:paddingTop="20dp" android:paddingStart="24dp"
android:paddingRight="24dp"
android:paddingEnd="24dp" android:paddingEnd="24dp"
android:paddingRight="24dp"> android:paddingTop="20dp">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout <TextView
android:id="@+id/edit_name"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="4dp" android:text="@string/login_name" />
android:hint="@string/login_name">
<com.google.android.material.textfield.TextInputEditText <EditText
android:id="@+id/edit_name"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:inputType="textNoSuggestions" android:inputType="textNoSuggestions"
android:maxLines="1" /> android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout> <TextView
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/edit_password"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="4dp" android:text="@string/login_password" />
android:hint="@string/login_password">
<com.google.android.material.textfield.TextInputEditText <EditText
android:id="@+id/edit_password"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:inputType="textPassword" android:inputType="textPassword"
android:maxLines="1" /> android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout>
<TextView <TextView
android:id="@+id/overwrite_message" android:id="@+id/overwrite_message"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -58,12 +48,12 @@
</LinearLayout> </LinearLayout>
<TextView <TextView
android:id="@+id/text_searching_for_repo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp" android:padding="10dp"
android:textSize="16sp" android:textSize="16sp"
android:id="@+id/text_searching_for_repo"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="Searching for repository at\nhttps://www.example.com/fdroid/repo/" /> tools:text="Searching for repository at\nhttps://www.example.com/fdroid/repo/" />
</RelativeLayout> </RelativeLayout>

View File

@ -56,7 +56,7 @@
</LinearLayout> </LinearLayout>
<com.google.android.material.switchmaterial.SwitchMaterial <androidx.appcompat.widget.SwitchCompat
android:id="@+id/repo_switch" android:id="@+id/repo_switch"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent"/> android:layout_height="match_parent"/>

View File

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="MenuTitle">
<!-- android:title and android:icon are set dynamically in MainActivity -->
<item
android:id="@+id/latest"
android:enabled="true"
android:icon="@drawable/ic_latest"
android:orderInCategory="0"
android:title="@string/main_menu__latest_apps"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/updates"
android:enabled="true"
android:icon="@drawable/ic_updates"
android:orderInCategory="1"
android:title="@string/main_menu__updates"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/settings"
android:enabled="true"
android:icon="@drawable/ic_settings"
android:orderInCategory="2"
android:title="@string/menu_settings"
app:showAsAction="ifRoom|withText" />
</menu>

View File

@ -358,12 +358,12 @@
<string name="app_list__dismiss_vulnerable_app">تخطي الحساسية</string> <string name="app_list__dismiss_vulnerable_app">تخطي الحساسية</string>
<string name="updates__app_with_known_vulnerability__prompt_uninstall">لقد وجدنا ثغرة في %1$s. نحن نوصي بإلغاء تثبيت هذا التطبيق في الحال.</string> <string name="updates__app_with_known_vulnerability__prompt_uninstall">لقد وجدنا ثغرة في %1$s. نحن نوصي بإلغاء تثبيت هذا التطبيق في الحال.</string>
<string name="updates__app_with_known_vulnerability__prompt_upgrade">لقد وجدنا ثغرة في %1$s. نحن نوصي بالتحديث إلى أحدث إصدار جديد في الحال.</string> <string name="updates__app_with_known_vulnerability__prompt_upgrade">لقد وجدنا ثغرة في %1$s. نحن نوصي بالتحديث إلى أحدث إصدار جديد في الحال.</string>
<string name="latest__empty_state__never_updated">حينما يتم تحديث قائمة البرامج، التطبيقات الأخيرة سوف تظهر هنا</string> <string name="latest__empty_state__never_updated">حينما يتم تحديث قائمة التطبيقات، التطبيقات الأخيرة سوف تظهر هنا</string>
<string name="latest__empty_state__no_enabled_repos">حينما تُفعل مستودع وتتركه يحدث، الطبيقات الأخيرة سوف تظهر هنا</string> <string name="latest__empty_state__no_enabled_repos">حينما تُفعل مستودع وتتركه يحدث، الطبيقات الأخيرة سوف تظهر هنا</string>
<string name="antifeatures">مضاد الخصائص</string> <string name="antifeatures">مضاد الخصائص</string>
<string name="status_inserting_x_apps">حفظ تفاصيل التطبيقات (%1$d/%2$d) من %3$s</string> <string name="status_inserting_x_apps">حفظ تفاصيل التطبيقات (%1$d/%2$d) من %3$s</string>
<plurals name="notification_summary_more"> <plurals name="notification_summary_more">
<item quantity="zero">لاشيء</item> <item quantity="zero">لاشيء</item>
<item quantity="one">+%1$d آخر…</item> <item quantity="one">+%1$d آخر…</item>
<item quantity="two">آخرين…</item> <item quantity="two">آخرين…</item>
<item quantity="few">+%1$d أخرى…</item> <item quantity="few">+%1$d أخرى…</item>
@ -481,7 +481,7 @@
<string name="antinosourcesince">لم يعد الكود المصدري متاحا ، ولا توجد تحديثات ممكنة.</string> <string name="antinosourcesince">لم يعد الكود المصدري متاحا ، ولا توجد تحديثات ممكنة.</string>
<string name="panic_hide_warning_message">في حالة الهلع ، سيؤدي هذا إلى إزالة%1$s من درج التطبيقات. يمكن فقط للكتابة \"%2$d\" في تطبيق المزيف %3$s ويمكن استعادته.</string> <string name="panic_hide_warning_message">في حالة الهلع ، سيؤدي هذا إلى إزالة%1$s من درج التطبيقات. يمكن فقط للكتابة \"%2$d\" في تطبيق المزيف %3$s ويمكن استعادته.</string>
<string name="share_repository">مشاركة المستودع</string> <string name="share_repository">مشاركة المستودع</string>
<string name="send_install_history">إرسال سجل التثبيت</string> <string name="send_install_history">إرسال محفوظات التثبيت</string>
<string name="send_history_csv">%s تاريخ التثبيت كملف CSV</string> <string name="send_history_csv">%s تاريخ التثبيت كملف CSV</string>
<string name="updates_disabled_by_settings">جميع التحديثات معطلة عن طريق إعدادات البيانات / واي فاي</string> <string name="updates_disabled_by_settings">جميع التحديثات معطلة عن طريق إعدادات البيانات / واي فاي</string>
<string name="about_forum">منتدى الدعم</string> <string name="about_forum">منتدى الدعم</string>
@ -548,9 +548,4 @@
<string name="install_history_and_metrics">سجل التثبيت والمقاييس</string> <string name="install_history_and_metrics">سجل التثبيت والمقاييس</string>
<string name="send_fdroid_metrics_json">%s تقرير المقاييس كملف JSON</string> <string name="send_fdroid_metrics_json">%s تقرير المقاييس كملف JSON</string>
<string name="send_fdroid_metrics_report">إرسال تقرير %s القياسات</string> <string name="send_fdroid_metrics_report">إرسال تقرير %s القياسات</string>
<string name="theme_follow_system">اتبع مظهر النظام</string>
<string name="use_pure_black_dark_theme_summary">يوصى به فقط لشاشات OLED.</string>
<string name="use_pure_black_dark_theme">استخدم خلفية سوداء نقية في المظهر داكن</string>
<string name="banner_no_data_or_wifi">لم يتم تمكين البيانات أو WiFi</string>
<string name="banner_no_internet">لا يوجد إنترنت</string>
</resources> </resources>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"> <resources>
<string name="app_name">F-Droid</string> <string name="app_name">F-Droid</string>
<string name="updates">আপডেট</string> <string name="updates">আপডেট</string>
<string name="ok">ঠিক আছে</string> <string name="ok">ঠিক আছে</string>
@ -88,7 +88,7 @@
<string name="repo_edit_credentials">পাসওয়ার্ড পাল্টাও</string> <string name="repo_edit_credentials">পাসওয়ার্ড পাল্টাও</string>
<string name="login_title">অথেনটিকেশন প্রয়োজন</string> <string name="login_title">অথেনটিকেশন প্রয়োজন</string>
<string name="scan_removable_storage_summary">এসডি কার্ড ও ইউএসবি ড্রাইভে প্যাকেজ রিপো খুজো</string> <string name="scan_removable_storage_summary">এসডি কার্ড ও ইউএসবি ড্রাইভে প্যাকেজ রিপো খুজো</string>
<string name="scan_removable_storage_toast">%s স্ক্যান করা হচ্ছ</string> <string name="scan_removable_storage_toast">%s স্ক্যান করা হচ্ছ…</string>
<string name="send_version_and_uuid_summary">এই অ্যাপ্লিকেশনটির সংস্করণ এবং একটি এলোমেলো, অনন্য আইডি ডাউনলোড করার সময় অন্তর্ভুক্ত করো, যা পরবর্তীতে অ্যাপ্লিকেশনটি পুনরায় চালু করার সময় প্রভাবিত হয়।</string> <string name="send_version_and_uuid_summary">এই অ্যাপ্লিকেশনটির সংস্করণ এবং একটি এলোমেলো, অনন্য আইডি ডাউনলোড করার সময় অন্তর্ভুক্ত করো, যা পরবর্তীতে অ্যাপ্লিকেশনটি পুনরায় চালু করার সময় প্রভাবিত হয়।</string>
<string name="display">দেখাও</string> <string name="display">দেখাও</string>
<string name="icon">আইকন</string> <string name="icon">আইকন</string>
@ -122,393 +122,9 @@
<string name="about_version">সংস্করণ</string> <string name="about_version">সংস্করণ</string>
<string name="login_password">পাসওয়ার্ড</string> <string name="login_password">পাসওয়ার্ড</string>
<string name="login_name">নাম</string> <string name="login_name">নাম</string>
<string name="app_details_donate_prompt">%2$s, %1$s বানিয়েছে। তাদেরকে এক কাপ কফি কিনে দাও!</string> <string name="app_details_donate_prompt">%2$s %1$s তৈরী করেছেন। কফি কিনে দিন!</string>
<string name="app_details__incompatible_mismatched_signature">ইন্সটলড ভার্সন থেকে আলাদা সিগনেচার</string> <string name="app_details__incompatible_mismatched_signature">ইন্সটলড ভার্সন থেকে আলাদা সিগনেচার</string>
<string name="app_details_donate_prompt_unknown_author">ডেভলপারকে %1$s দামের কফি কিনে দিন!</string> <string name="app_details_donate_prompt_unknown_author">ডেভলপারকে %1$s দামের কফি কিনে দিন!</string>
<string name="no_such_app">এ জাতীয় কোনও অ্যাপ পাওয়া যায় নি।</string> <string name="no_such_app">এ জাতীয় কোনও অ্যাপ পাওয়া যায় নি।</string>
<string name="repo_error_empty_username">ব্যবহারকারীর নাম খালি , শংসাপত্র পরিবর্তন হয়নি</string> <string name="repo_error_empty_username">ব্যবহারকারীর নাম খালি , শংসাপত্র পরিবর্তন হয়নি</string>
<string name="theme">রঙ</string>
<string name="permissions">অনুমতি</string>
<string name="hiding_calculator">গণন-যন্ত্র</string>
<string name="allow">অনুমোদন</string>
<string name="panic_app_setting_none">কোনোটি না</string>
<string name="privacy">গোপনীয়তা</string>
<string name="proxy">প্রক্সি</string>
<string name="skip">উপেক্ষা</string>
<string name="menu_downgrade">অবনমন</string>
<string name="app_incompatible">অসামঞ্জস্যপূর্ণ</string>
<string name="unverified">অযাচাইকৃত</string>
<string name="unsigned">স্বাক্ষরহীন</string>
<string name="empty_search_available_app_list">সামঞ্জস্যপূর্ণ কোনো অ্যাপ পাওয়া যায়নি।</string>
<string name="empty_can_update_app_list">অভিনন্দন!
\nসব অ্যাপ হালনাগাদকৃত।</string>
<string name="empty_installed_app_list">কোনো অ্যাপ ইন্সটল করা নেই।
\n
\nতোমার কাছে অন্যান্য অ্যাপ আছে, কিন্তু সেগুলো এফ-ড্রয়েডের না। ভাণ্ডারগুলোর হালনাগাদের প্রয়োজনীয়তা এর কারণ হতে পারে অথবা ভাণ্ডারগুলোতে আসলেই হয়তো তোমার অ্যাপগুলো নেই।</string>
<plurals name="button_view_all_apps_in_category">
<item quantity="one">%dটি দেখো</item>
<item quantity="other">%d এর সবগুলো দেখো</item>
</plurals>
<string tools:ignore="UnusedResources" name="category_Writing">লেখা</string>
<string tools:ignore="UnusedResources" name="category_Time">সময়</string>
<string tools:ignore="UnusedResources" name="category_Theming">থিমিং</string>
<string tools:ignore="UnusedResources" name="category_System">ব্যবস্থা</string>
<string tools:ignore="UnusedResources" name="category_Sports_Health">খেলাধুলা ও স্বাস্থ্য</string>
<string tools:ignore="UnusedResources" name="category_Security">নিরাপত্তা</string>
<string tools:ignore="UnusedResources" name="category_Navigation">দিক নির্ণয়</string>
<string name="wifi_ap">হটস্পট</string>
<string name="wifi">ওয়াই-ফাই</string>
<string name="pref_language_default">সিস্টেম ডিফল্ট</string>
<string name="requires_features">%1$s: প্রয়োজন</string>
<string name="not_on_same_wifi">তুমি যে স্থানীয় ভাণ্ডার যুক্ত করেছো সেটা আর তোমার যন্ত্র একই ওয়াইফাইতে নেই! এই নেটওয়ার্ক যোগ দেবার চেষ্টা করো: %s</string>
<string name="share_repository">ভাণ্ডার শেয়ার করো</string>
<string name="repo_searching_address">%1$s এ
\nপ্যাকেজের ভাণ্ডার খোঁজা হচ্ছে</string>
<string name="repo_added">%1$s ভাণ্ডার সংরক্ষণ করা হয়েছে।</string>
<string name="repo_disabled_notification">%1$s নিষ্ক্রিয় করা হয়েছে ।
\n
\nআবার এর থেকে অ্যাপ নামাতে একে পুনঃসক্রিয় করতে হবে।</string>
<string name="repo_confirm_delete_body">একটা ভাণ্ডার মুছা মানে এটার অ্যাপ আর উপলভ্য থাকবে না।
\n
\nদ্র: আগে থেকে ইন্সটল করা অ্যাপ ডিভাইসে থাকবে।</string>
<string name="repo_confirm_delete_title">ভাণ্ডার মুছবে\?</string>
<string name="unknown">অজানা</string>
<string name="repo_not_yet_updated">এই ভাণ্ডার আগে ব্যবহার করা হয়নি। এতে বিদ্যমান অ্যাপ দেখতে এটাকে সক্রিয় করতে হবে।</string>
<string name="unsigned_description">এর অর্থ একটা তালিকার অ্যাপ যাচাই করা যায়নি। অস্বাক্ষরিত সূচী থেকে অ্যাপ নামানোর সময় তোমাকে সাবধান হতে হবে।</string>
<string name="repo_name">নাম</string>
<string name="repo_user_mirrors">ব্যবহারকারী আয়না</string>
<string name="repo_official_mirrors">প্রাতিষ্ঠানিক আয়না(মিরর)</string>
<string name="repo_last_update">শেষ হালনাগাদ</string>
<string name="repo_description">বিবরণ</string>
<string name="repo_fingerprint">স্বাক্ষর চাবির আঙ্গুলছাপ (শা-২৫৬)</string>
<string name="repo_num_apps">অ্যাপ সংখ্যা</string>
<string name="repo_url">ঠিকানা</string>
<string name="repo_details">রিপোসিটরি</string>
<string name="use_pure_black_dark_theme_summary">শুধু ওলেড পর্দার জন্য প্রস্তাব দাও।</string>
<string name="use_pure_black_dark_theme">অন্ধকার রঙে সম্পূর্ণ কালো পটভূমি ব্যবহার করো</string>
<string name="no_handler_app">এমন কোনো অ্যাপ এই মুহূর্তে তোমার কাছে নেই যা %s চালাতে পারবে।</string>
<string name="no_permissions">কোনো অনুমতি নেই</string>
<string name="warning_no_internet">হালনাগাদ করা যাচ্ছে না, তুমি কী ইন্টারনেটের সাথে সংযুক্ত\?</string>
<string name="global_error_updating_repos">হালনাগাদের সময় ত্রুটি: %s</string>
<string name="all_other_repos_fine">অন্যান্য ভাণ্ডার আয়না বানায়নি।</string>
<string name="repos_unchanged">সব ভাণ্ডার হালনাগাদকৃত</string>
<string name="status_inserting_x_apps">%3$s থেকে অ্যাপের তথ্য সংরক্ষণ করা হচ্ছে (%1$d/%2$d)</string>
<string name="status_connecting_to_repo">%1$s
\nএর সাথে যোগাযোগ হচ্ছে</string>
<string name="banner_no_data_or_wifi">তথ্য বা‌ ওয়াইফাই নিষ্ক্রিয়</string>
<string name="banner_no_internet">ইন্টারনেট নেই</string>
<string name="banner_updating_repositories">ভাণ্ডার হালনাগাদরত</string>
<string name="download_404">অনুরোধকৃত নথি পাওয়া যায়নি।</string>
<string name="status_download_unknown_size">%1$s থেকে
\n%2$s
\nডাউনলোডরত</string>
<string name="status_download">%1$s
\nথেকে ডাউনলোডরত
\n%2$s / %3$s (%4$d%%)</string>
<string name="hide_on_long_search_press_summary">অনুসন্ধান বোতামে কিছুক্ষণ ধরে রাখলে অ্যাপ লুকানো হবে</string>
<string name="hide_on_long_search_press_title">অনুসন্ধান বোতাম লুকাও</string>
<string name="hiding_dialog_warning">সতর্কতা: মূল পর্দার একটি শর্টকাটও মুছে যাবে এবং পরে আলাদাভাবে আনতে হবে।</string>
<string name="hiding_dialog_message">তুমি কি আসলেই লঞ্চার থেকে %1$s সরাতে চাও\? শুধু নকল %3$s অ্যাপের মধ্যে %2$d লিখলেই এটা ফিরত আসবে।</string>
<string name="hiding_dialog_title">%s এখন লুকাও</string>
<string name="panic_reset_repos_summary">সহজাত পছন্দে ভাণ্ডারের অবস্থা ফিরিয়ে জোর করো</string>
<string name="panic_reset_repos_title">ভাণ্ডার আগের অবস্থায় নাও</string>
<string name="panic_hide_warning_message">আতঙ্ক/বিপদের সময়, লঞ্চার থেকে %1$s সরানো হবে। শুধু নকল %3$s অ্যাপের মধ্যে %2$d লিখলেই এটা ফিরত আসবে।</string>
<string name="panic_hide_warning_title">কিভাবে ফিরত আনতে হয় মনে রাখবে</string>
<string name="panic_hide_summary">অ্যাপ নিজেকে লুকাবে</string>
<string name="panic_hide_title">%s লুকাও</string>
<string name="panic_add_apps_to_uninstall">আনইন্সটল ও মুছার জন্য অ্যাপ যোগ করো</string>
<string name="panic_apps_to_uninstall">অ্যাপ মুছে ফেলা হবে এবং সব তথ্য মুছা হবে</string>
<string name="panic_will_be_wiped">মুছা হবে(আনইন্সটল) এবং সব তথ্য মুছা হবে</string>
<string name="panic_destructive_actions">ধ্বংসাত্মক ক্রিয়া</string>
<string name="panic_exit_summary">এই অ্যাপ বন্ধ করা হবে</string>
<string name="panic_exit_title">অ্যাপ থেকে প্রস্থান</string>
<string name="panic_settings_summary">বিপদের সময়ে করণীয় ক্রিয়া</string>
<string name="panic_settings">বিপদগ্রস্থ বোতামের পছন্দসমূহ</string>
<string name="panic_app_dialog_message">তুমি কি %1$sকে ধ্বংসাত্বক আতঙ্ক বা বিপদ সংকেত বোতাম চালু করার ক্ষমতা দেওয়ার ব্যাপারে নিশ্চিত\?</string>
<string name="panic_app_dialog_title">বিপদগ্রস্থ অ্যাপ নিশ্চিত করো</string>
<string name="panic_app_setting_summary">কোনো অ্যাপ নির্দিষ্ট করা হয়নি</string>
<string name="panic_app_unknown_app">একটা অজানা অ্যাপ</string>
<string name="panic_app_setting_title">বিপদগ্রস্থ বোতামের অ্যাপ</string>
<string name="preventScreenshots_summary">স্ক্রিনশট নেওয়া প্রতিরোধ করে আর অ্যাপের বিষয়বস্তু সাম্প্রতিক পর্দা থেকে লুকায়</string>
<string name="preventScreenshots_title">স্ক্রিনশট প্রতিরোধ করো</string>
<string name="enable_proxy_title">HTTP প্রক্সি চালু করো</string>
<string name="useTorSummary">গোপনীয়তা বৃদ্ধির জন্য জোর করে সব তথ্যের গমন টর দিয়ে নাও। অরবট লাগবে</string>
<string name="useTor">টর ব্যবহার করো</string>
<string name="try_again">আবার চেষ্টা করো</string>
<string name="copying_icons">ভাণ্ডারে অ্যাপ আইকন অনুলিপিত হচ্ছে…</string>
<string name="linking_apks">ভাণ্ডারে এপিকে সংযুক্ত করা হচ্ছে…</string>
<string name="writing_index_jar">স্বাক্ষরিত সূচী নথি লেখা হচ্ছে (index.jar)…</string>
<string name="adding_apks_format">ভাণ্ডারে %s যোগ করা হচ্ছে…</string>
<string name="deleting_repo">বর্তমান ভাণ্ডার মুছা হচ্ছে…</string>
<string name="touch_to_configure_local_repo">বিস্তারিত দেখতে টিপ দাও এবং অন্যদের সাথে অ্যাপ বিনিময়ের অনুমতি দাও।</string>
<string name="local_repo_running">এফ-ড্রয়েড অদলবদলের জন্য প্রস্তুত</string>
<string name="local_repo">স্থানীয় ভাণ্ডার</string>
<string name="force_touch_apps_on">কঠিনন্ত্র(হার্ডওয়্যার) সমর্থন ছাড়া টাচপর্দা লাগে এমন অ্যাপ দেখাও</string>
<string name="force_touch_apps">স্পর্শপর্দা(টাচস্ক্রিন) অ্যাপ রাখো</string>
<string name="show_anti_feature_apps_on">যেসব অ্যাপের অপবৈশিষ্ট্য লাগে তা দেখাও</string>
<string name="show_anti_feature_apps">অপবৈশিষ্ট্যের অ্যাপ রাখো</string>
<string name="show_incompat_versions_on">এই যন্ত্রের সাথে অসামঞ্জস্যপূর্ণ অ্যাপ সংস্করণ দেখাও</string>
<string name="show_incompat_versions">মিলহীন সংস্করণ রাখো</string>
<string name="appcompatibility">অ্যাপ সামঞ্জস্যতা</string>
<string name="search_hint">অ্যাপ খুঁজো</string>
<string name="expert_on">অতিরিক্ত তথ্য দেখাও ও অতিরিক্ত পছন্দসমূহ সক্রিয় করো</string>
<string name="expert">বিশেষজ্ঞ অবস্থা</string>
<string name="antinosourcesince">উৎস কোড এখন অনুপভ্য, হালনাগাদ সম্ভব নয়।</string>
<string name="antiknownvulnlist">এই অ্যাপের একটি জানা নিরাপত্তা দুর্বলতা রয়েছে</string>
<string name="antidisabledalgorithmlist">এই অ্যাপের নিরাপত্তা স্বাক্ষর খুব দুর্বল</string>
<string name="antinonfreeassetslist">এই অ্যাপে অ-মুক্ত উপাদান আছে</string>
<string name="antiupstreamnonfreelist">উজানের কোড সম্পূর্ণরূপে মুক্ত না</string>
<string name="antinonfreedeplist">এই অ্যাপ অন্যান্য অ-মুক্ত অ্যাপের উপর নির্ভর করে</string>
<string name="antinonfreenetlist">এই অ্যাপ অ-মুক্ত নেটওয়ার্ক সেবা নিতে উৎসাহিত করে</string>
<string name="antinonfreeadlist">এই অ্যাপ অ-মুক্ত অ্যাড-অন ব্যবহারে উৎসাহিত করে</string>
<string name="antitracklist">এই অ্যাপটি আপনার কার্যকলাপ ট্র্যাক করে এবং বলে দেয়</string>
<string name="antiadslist">এই অ্যাপে বিজ্ঞাপন আছে</string>
<string name="antifeatureswarning">এই অ্যাপে অপছন্দনীয় কিছু বৈশিষ্ট্য আছে।</string>
<string name="details_new_in_version">সংস্করণ %s এ নতুন</string>
<string name="preference_category__my_apps">আমার অ্যাপ</string>
<string name="categories__empty_state__no_categories">দেখানোর জন্য কোনো বিভাগ নেই</string>
<string name="latest__empty_state__no_enabled_repos">ভাণ্ডার সক্রিয় করে হালনাগাদ করলে, সর্বশেষ অ্যাপ এখানে দেখাবে</string>
<string name="latest__empty_state__never_updated">তোমার অ্যাপের তালিকা হালনাগাদ হলে, হালনাগাদকৃত অ্যাপ এখানে দেখানো হবে</string>
<string name="latest__empty_state__no_recent_apps">সাম্প্রতিক অ্যাপ পাওয়া যায়নি</string>
<string name="menu_show_install_history">ইন্সটল ইতিহাস দেখাও</string>
<string name="menu_show_fdroid_metrics_report">পরিসংখ্যান প্রতিবেদন দেখাও</string>
<string name="menu_opencollective">ওপেনকালেক্টিভ</string>
<string name="menu_source">উৎস কোড</string>
<string name="menu_license">অনুমতিপত্র: %s</string>
<string name="menu_email">ই-মেইল লেখক</string>
<string name="menu_ignore_this">এই হালনাগাদ উপেক্ষা</string>
<string name="menu_ignore_all">সব হালনাগাদ উপেক্ষা</string>
<string name="menu_select_for_wipe">মুছার জন্য নির্বাচন</string>
<string name="menu_add_repo">নতুন রিপোসিটরি</string>
<string name="repositories_summary">অ্যাপের জন্য আরো উৎস যোগ করো</string>
<string name="repo_provider">ভাণ্ডার: %s</string>
<string name="malformed_repo_uri">বিকৃত ভাণ্ডার ইউআরআই উপেক্ষা করা হলো: %s</string>
<string name="invalid_url">এটা একটি সঠিক সংযোগ নয়।</string>
<string name="bad_fingerprint">সমস্যাপূর্ণ আঙ্গুলের ছাপ</string>
<string name="repo_exists_add_mirror">এটা %1$s এর অনুলিপি, আয়না হিসেবে যুক্ত করবে\?</string>
<string name="repo_delete_to_overwrite">প্রথমে %1$s মুছো যাতে চাবিগুলোর(কি) মধ্যে অসামঞ্জস্যতা না হয়।</string>
<string name="repo_exists_and_enabled">%1$s আগে থেকেই শুরু ও সক্রিয়।</string>
<string name="repo_exists_enable">%1$s আগে থেকেই তৈরি, নিশ্চিত করো যে এটা আবার সক্রিয় করতে চাও।</string>
<string name="repo_exists_add_fingerprint">%1$s আগে থেকেই তৈরি, এতে নতুন গুরুত্বপূর্ণ তথ্য যোগ করবে।</string>
<string name="repo_add_fingerprint">আঙ্গুলের ছাপ (ঐচ্ছিক)</string>
<string name="repo_add_url">ভাণ্ডার ঠিকানা</string>
<string name="choose_bt_send">ব্লুটুথ দিয়ে পাঠানোর পদ্ধতি নির্বাচন করো</string>
<string name="bluetooth_activity_not_found">ব্লুটুথ দিয়ে পাঠানোর কোনো উপায় পাওয়া যায়নি, একটা নির্বাচন করো!</string>
<string name="sort_search">অনুসন্ধান সাজাও</string>
<string name="clear_search">অনুসন্ধান পরিষ্কার করো</string>
<string name="add_key">চাবি যোগ করো</string>
<string name="repo_add_mirror">আয়না(মিরর) যোগ করো</string>
<string name="repo_add_title">নতুন ভাণ্ডার যোগ করো</string>
<string name="updates_disabled_by_settings">তথ্য/ওয়াইফাই পছন্দ দিয়ে হালনাগাদ নিষ্ক্রিয়</string>
<plurals name="updates__download_updates_for_apps">
<item quantity="one">%1$dটি অ্যাপের জন্য হালনাগাদ নামাও।</item>
<item quantity="other">%1$dটি অ্যাপের জন্য হালনাগাদ নামাও।</item>
</plurals>
<string name="updates__show_updateable_apps">অ্যাপ দেখাও</string>
<string name="updates__hide_updateable_apps">অ্যাপ লুকাও</string>
<string name="update_all">সব হালনাগাদ</string>
<string name="updates__app_with_known_vulnerability__prompt_upgrade">%1$s এ একটি অনিরাপত্তা পাওয়া গেছে। এই‌ মুহূর্তেই অ্যাপটি হালনাগাদের প্রস্তাব দিচ্ছি।</string>
<string name="updates__app_with_known_vulnerability__prompt_uninstall">%1$s এ একটি অনিরাপত্তা পাওয়া গেছে। এই‌ মুহূর্তেই অ্যাপটি মুছে ফেলার প্রস্তাব দিচ্ছি।</string>
<string name="installed_app__updates_ignored_for_suggested_version">%1$s সংস্করণের জন্য হালনাগাদ উপেক্ষাকৃত</string>
<string name="installed_app__updates_ignored">হালনাগাদ উপেক্ষাকৃত</string>
<string name="send_installed_apps_csv">সিএসভি নথি হিসেবে এফ-ড্রয়েড কর্তৃক ইন্সটলকৃত অ্যাপ</string>
<string name="send_installed_apps">ইন্সটলকৃত অ্যাপ শেয়ার করো</string>
<string name="installed_apps__activity_title">ইন্সটলকৃত অ্যাপ</string>
<string name="app_list__dismiss_downloading_app">ডাউনলোড বাতিলকৃত</string>
<string name="app_list__dismiss_vulnerable_app">ক্ষতির সম্ভাবনা উপেক্ষাকৃত</string>
<string name="app_list__dismiss_app_update">হালনাগাদ উপেক্ষাকৃত</string>
<string name="app_list_download_ready">ডাউনলোডকৃত, ইন্সটল করতে প্রস্তুত</string>
<string name="app_list__name__successfully_installed">%1$s ইন্সটলকৃত</string>
<string name="app_list__name__downloading_in_progress">%1$s ডাউনলোড করা হচ্ছে</string>
<string name="app_size">আকার: %1$s</string>
<string name="app_repository">ভাণ্ডার: %1$s</string>
<string name="app_permission_storage">স্টোরেজে ইন্সটল করতে এফ-ড্রয়েডের স্টোরেজ অনুমতি লাগবে। ইনস্টল চালিয়ে যেতে পরের পর্দায় এটার অনুমতি দিও।</string>
<string name="app_installed_media">%s এ ফাইল ইন্সটলকৃত</string>
<string name="app__tts__cancel_download">ডাউনলোড বাতিল করো</string>
<string name="added_on">%s এ যোগকৃত</string>
<string name="app_recommended_version_installed">সংস্করণ %1$s (প্রস্তাবিত)</string>
<string name="app_version_x_installed">সংস্করণ %1$s</string>
<string name="app_version_x_available">%1$s সংস্করণ আছে</string>
<string name="app_inst_unknown_source">ইন্সটলকৃত (অজানা উৎস থেকে)</string>
<string name="app_inst_known_source">(%s থেকে) ইন্সটলকৃত</string>
<string name="app_not_installed">ইন্সটল হয়নি</string>
<string name="about_source">উৎস কোড</string>
<string name="about_forum">সহায়তা সভা</string>
<string name="about_title">এফ-ড্রয়েড সম্পর্কে</string>
<string name="app_details__no_versions__explain_incompatible_signatures">ইন্সটলকৃত সংস্করণ অন্য কোনো সংস্করণের সাথে অসামঞ্জস্যপূর্ণ। এই অ্যাপ মুছলে তোমাকে অন্যান্য সামঞ্জস্যপূর্ণ সংস্করণ দেখতে ও ইন্সটল করতে দিবে। গুগল প্লে বা অন্য জায়গা থেকে অ্যাপ ইন্সটল করলে বেশিরভাগ সময় এমন হয়, বিশেষত অন্য অনুমতিপত্র দিয়ে স্বাক্ষর করা হলে।</string>
<string name="app_details__no_versions__none_compatible_with_device">এই যন্ত্রের সাথে সামঞ্জস্যপূর্ণ কোনো সংস্করণ নেই</string>
<string name="app_details__no_versions__no_compatible_signatures">এই স্বাক্ষরের সাথে সামঞ্জস্যপূর্ণ কোনো সংস্করণ নেই</string>
<string name="app_details__no_versions__show_incompat_versions">তবুও সামঞ্জস্যপূর্ণ সংস্করণ দেখাতে, %1$s পছন্দ সক্রিয় করো।</string>
<string name="app_details">অ্যাপের বিবরণ</string>
<string name="toast_metrics_in_install_history">ইন্সটল ইতিহাস পাঠকে %s পরিসংখ্যান প্রতিবেদন পড়া যায়</string>
<string name="send_to_fdroid_metrics_summary">সাপ্তাহিক এফ-ড্রয়েড পরিসংখ্যানের অব্যক্তিগত তথ্য পাঠাও (ইন্সটল ইতিহাস রাখতে হবে)</string>
<string name="send_to_fdroid_metrics">ব্যবহারের তথ্য পাঠাও</string>
<string name="fdroid_metrics_report">%s পরিসংখ্যানের প্ররিবেদন</string>
<string name="install_history_and_metrics">ইন্সটল ইতিহাস ও পরিসংখ্যান</string>
<string name="send_fdroid_metrics_json">জেসন নথি হিসেবে %s পরিসংখ্যান প্রতিবেদন</string>
<string name="send_fdroid_metrics_report">%s পরিসংখ্যান প্রতিবেদন পাঠাও</string>
<plurals name="details_last_update_years">
<item quantity="one">%1$d বছর আগে হালনাগাদকৃত</item>
<item quantity="other">%1$d বছর আগে হালনাগাদকৃত</item>
</plurals>
<plurals name="details_last_update_months">
<item quantity="one">%1$d মাস আগে হালনাগাদকৃত</item>
<item quantity="other">%1$d মাস আগে হালনাগাদকৃত</item>
</plurals>
<plurals name="details_last_update_weeks">
<item quantity="one">%1$d সপ্তাহ আগে হালনাগাদকৃত</item>
<item quantity="other">%1$d সপ্তাহ আগে হালনাগাদকৃত</item>
</plurals>
<plurals name="details_last_update_days">
<item quantity="one">%1$d দিন আগে হালনাগাদকৃত</item>
<item quantity="other">%1$d দিন আগে হালনাগাদকৃত</item>
</plurals>
<string name="app_list__dismiss_installing_app">ইন্সটল বাতিলকৃত</string>
<string name="undo">পূর্বাবস্থা</string>
<string name="warning_scaning_qr_code">তোমার ক্যামেরায় মনে হয় স্বয়ংক্রিয়-মনোযোগ নেই, এতে সংকেতের পাঠোদ্ধার কঠিন হতে পারে।</string>
<string name="details_last_updated_today">আজকে হালনাগাদকৃত</string>
<plurals name="tts_view_all_in_category">
<item quantity="one">%2$s বিভাগের %1$d অ্যাপটি দেখো</item>
<item quantity="other">%2$s বিভাগের %1$d সব অ্যাপ দেখো</item>
</plurals>
<string name="tts_category_name">%1$s বিভাগ</string>
<string name="notification_channel_updates_description">অ্যাপ ও ভাণ্ডার হালনাগাদের বিজ্ঞপ্তি দেখাবে।</string>
<string name="notification_channel_updates_title">হালনাগাদ</string>
<string name="notification_channel_swaps_description">পি২পি অ্যাপ অদলবদলের বিজ্ঞপ্তি দেখাও।</string>
<string name="notification_channel_swaps_title">টানা</string>
<string name="notification_channel_installs_description">অ্যাপ ইন্সটলের বিজ্ঞপ্তি দেখাও।</string>
<string name="notification_channel_installs_title">ইনস্টলকৃত</string>
<string name="notification_action_install">ইনস্টল</string>
<string name="notification_action_cancel">বাতিল</string>
<string name="notification_action_update">হালনাগাদ</string>
<string name="notification_title_summary_install_error">ইন্সটল ব্যর্থ</string>
<string name="notification_title_summary_installed">সফলভাবে ইন্সটলকৃত</string>
<string name="notification_title_summary_installing">ইনস্টলরত</string>
<string name="notification_title_summary_ready_to_install_update">হালনাগাদ ইনস্টল করতে প্রস্তুত</string>
<string name="notification_title_summary_ready_to_install">ইনস্টল করতে প্রস্তুত</string>
<string name="notification_title_summary_downloading_update">হালনাগাদ ডাউনলোডরত…</string>
<string name="notification_title_summary_downloading">ডাউনলোডরত…</string>
<string name="notification_title_summary_update_available">হালনাগাদ আছে</string>
<plurals name="notification_summary_installed">
<item quantity="one">%1$dটি অ্যাপ ইন্সটলকৃত</item>
<item quantity="other">%1$dটি অ্যাপ ইন্সটলকৃত</item>
</plurals>
<plurals name="notification_summary_updates">
<item quantity="one">%1$dটি হালনাগাদ আছে</item>
<item quantity="other">%1$dটি হালনাগাদ আছে</item>
</plurals>
<string name="notification_content_single_installed">সফলভাবে ইন্সটলকৃত</string>
<string name="notification_content_single_installing">\"%1$s\" ইন্সটল করা হচ্ছে…</string>
<string name="notification_content_single_downloading_update">\"%1$s\" এর হালনাগাদ ডাউনলোড করা হচ্ছে…</string>
<string name="notification_content_single_downloading">\"%1$s\" ডাউনলোডরত…</string>
<string name="notification_title_single_install_error">ইনস্টল ব্যর্থ</string>
<string name="notification_title_single_ready_to_install_update">হালনাগাদ ইনস্টল করতে প্রস্তুত</string>
<string name="notification_title_single_ready_to_install">ইনস্টল করতে প্রস্তুত</string>
<string name="notification_title_single_update_available">হালনাগাদ আছে</string>
<plurals name="notification_summary_more">
<item quantity="one">আরো +%1$dটি…</item>
<item quantity="other">আরো +%1$dটি…</item>
</plurals>
<string name="crash_dialog_comment_prompt">এখানে তুমি অতিরিক্ত তথ্য ও মন্তব্য দিতে পারো:</string>
<string name="crash_dialog_text">একটা অপ্রত্যাশিত ত্রুটির কারণে অ্যাপ থামাতে হয়েছে। সমস্যাটা ঠিক করতে বিস্তারিত তথ্য ইমেইল করে পাঠাবে কি\?</string>
<string name="crash_dialog_title">এফ-ড্রয়েড থেমে‌ গেছে</string>
<string name="theme_follow_system">ব্যবস্থা অনুসরণ</string>
<string name="keep_forever">সর্বদা</string>
<string name="keep_year">১ বছর</string>
<string name="keep_month">১ মাস</string>
<string name="keep_week">১ সপ্তাহ</string>
<string name="keep_day">১ দিন</string>
<string name="keep_hour">১ ঘণ্টা</string>
<string name="interval_2w">প্রতি ২ সপ্তাহে হালনাগাদ আছে কিনা দেখো</string>
<string name="interval_1w">সাপ্তাহিক হালনাগাদ আছে কিনা দেখো</string>
<string name="interval_1d">দৈনিক হালনাগাদ আছে কিনা দেখো</string>
<string name="interval_12h">প্রতি ১২ ঘণ্টায় হালনাগাদ আছে কিনা দেখো</string>
<string name="interval_4h">প্রতি ঘণ্টায় হালনাগাদ আছে কিনা দেখো</string>
<string name="interval_1h">প্রতি ঘণ্টায় হালনাগাদ আছে কিনা দেখো</string>
<string name="interval_never">কোনো স্বয়ংক্রিয় অ্যাপ হালনাগাদ নেই</string>
<string name="uninstalling">আনইনস্টলরত…</string>
<string name="installing">ইন্সটলরত…</string>
<string name="app__tts__downloading_progress">ডাউনলোডরত, %1$d%% সম্পূর্ণ</string>
<string name="downloading">ডাউনলোডরত…</string>
<string name="perms_description_app">%1$s দ্বারা সরবরাহকৃত।</string>
<string name="perms_new_perm_prefix">নতুন:</string>
<string name="uninstall_error_notify_title">%s এর ইন্সটল সরাতে ত্রুটি</string>
<string name="install_error_notify_title">%s ইন্সটল করতে ত্রুটি</string>
<string name="download_pending">ডাউনলোড শুরুর জন্য অপেক্ষারত…</string>
<string name="download_error">ডাউনলোড ব্যর্থ!</string>
<string name="uninstall_confirm">অ্যাপটি মুছতে চাও\?</string>
<string name="uninstall_update_confirm">এই অ্যাপটিকে কি কারখানা সংস্করণ দিয়ে প্রতিস্থাপিত করবে\? সব তথ্য এতে মুছে যাবে।</string>
<string name="perm_costs_money">এতে তোমার টাকা খরচ হতে পারে</string>
<string name="allPerms">সব</string>
<string name="newPerms">নতুন</string>
<string name="install_confirm_update_system_no_perms">ডিভাইসে আগে থেকে বিদ্যমান এই অ্যাপটি হালনাগাদ করবে\? তোমার বিদ্যমান তথ্য মুছে যাবে না। এতে কোনো বিশেষ অনুমতি লাগবে না।</string>
<string name="install_confirm_update_no_perms">ডিভাইসে আগে থেকে বিদ্যমান এই অ্যাপটি হালনাগাদ করবে\? তোমার বিদ্যমান তথ্য মুছে যাবে না। এতে কোনো বিশেষ অনুমতি লাগবে না।</string>
<string name="install_confirm_update_system">ডিভাইসে আগে থেকে বিদ্যমান এই অ্যাপটি হালনাগাদ করবে\? তোমার বিদ্যমান তথ্য মুছে যাবে না। হালনাগাদকৃত অ্যাপ যেসব অনুমতি পাবে তা নিম্নরূপ:</string>
<string name="install_confirm_update">বিদ্যমান অ্যাপের জন্য এই হালনাগাদটি কি ইন্সটল করবে\? তোমার তথ্য মুছবে না। হালনাগাদকৃত অ্যাপ যেসব অনুমতি পাবে তা নিম্নরূপ:</string>
<string name="install_confirm">অনুমতি লাগবে</string>
<string name="swap_toast_closing_nearby_after_timeout">অলস পরে থাকায় কাছাকাছি বন্ধ করা হয়েছে ।</string>
<string name="swap_toast_could_not_enable_hotspot">ওয়াইফাই হটস্পট চালু করা যায়নি!</string>
<string name="swap_toast_hotspot_enabled">ওয়াইফাই হটস্পট চালু</string>
<string name="swap_toast_invalid_url">অদলবদলের জন্য ভুল সংযোগ: %1$s</string>
<string name="swap_toast_find_removeable_storage">এসডি কার্ড বা ইউএসবি নির্বাচন করো</string>
<string name="swap_toast_not_removable_storage">নির্বাচিত ভুক্তির সাথে কোনো স্টোরেজ যন্ত্র মিলেনি, আবার চেষ্টা করো।</string>
<string name="swap_toast_using_path">%1$s ব্যবহার করে</string>
<string name="not_visible_nearby_description">কাছাকাছি ডিভাইসের সাথে বিনিময় করার আগে তোমার ডিভাইস দৃশ্যমান করো।</string>
<string name="not_visible_nearby">কাছাকাছি নিষ্ক্রিয়</string>
<string name="swap_connection_misc_error">যুক্ত করার সময় একটা সমস্যা হয়েছে, তাই বিনিময় করা যাচ্ছে না।</string>
<string name="loading">প্রক্রিয়ারত…</string>
<string name="use_bluetooth">ব্লুটুথ ব্যবহার করো</string>
<string name="swap_qr_isnt_for_swap">যে কিউআর কোডের পাঠোদ্ধার করেছো সেটা বিনিময় সংকেত মনে হচ্ছে না।</string>
<string name="swap_confirm">অদলবদল নিশ্চিতকরণ</string>
<string name="swap_connecting">যুক্ত হচ্ছে</string>
<string name="swap_no_peers_nearby">বিনিময়ের জন্য কাছাকাছি কাউকে পাওয়া যায়নি।</string>
<string name="swap_cant_find_peers">তোমার উদ্দীষ্ট ব্যক্তিকে পাচ্ছ না\?</string>
<string name="swap_wifi_device_name">যন্ত্রের নাম</string>
<string name="swap_not_visible_wifi">ওয়াইফাই দিয়ে দৃশ্যমান না</string>
<string name="swap_stopping_wifi">ওয়াইফাই থামানো হচ্ছে…</string>
<string name="swap_setting_up_wifi">ওয়াইফাই শুরু হচ্ছে…</string>
<string name="swap_visible_wifi">ওয়াইফাই দিয়ে দৃশ্যমান</string>
<string name="swap_not_visible_bluetooth">ব্লুটুথ দিয়ে দৃশ্যমান না</string>
<string name="swap_error_cannot_start_bluetooth">ব্লুটুথ শুরু করা যাচ্ছে না!</string>
<string name="swap_setting_up_bluetooth">ব্লুটুথ শুরু হচ্ছে…</string>
<string name="swap_visible_bluetooth">ব্লুটুথ দিয়ে দেখা যায়</string>
<string name="disabled">নিষ্ক্রিয়</string>
<string name="swap_stopping">থামছে…</string>
<string name="swap_starting">শুরু হচ্ছে…</string>
<string name="swap_intro">কাছাকাছি মানুষের সাথে যুক্ত হও ও অ্যাপ বিনিময় করো।</string>
<string name="swap_nearby">কাছাকাছি অদলবদল</string>
<string name="swap_scanning_for_peers">কাছাকাছি মানুষের জন্য অনুসন্ধান হচ্ছে…</string>
<string name="swap_people_nearby">কাছাকাছি লোকজন</string>
<string name="swap_scan_qr">কিউআর কোড খুঁজো</string>
<string name="swap_choose_apps">অ্যাপ নির্বাচন</string>
<string name="swap_scan_or_type_url">একজন সংকেতের পাঠোদ্ধার করবে অথবা সংষোগটি নিজের পরিব্রাজক(ব্রাউজারে) লিখবে।</string>
<string name="swap_dont_show_again">আবার দেখাবে না</string>
<string name="swap_confirm_connect">এখনই %1$s থেকে অ্যাপ আনতে চাও\?</string>
<string name="swap_welcome">এফ-ড্রয়েডে স্বাগতম!</string>
<string name="open_qr_code_scanner">কিউআর স্ক্যানার খুলো</string>
<string name="swap_switch_to_wifi">ওয়াইফাই নেটওয়ার্কে যেতে টিপ দাও</string>
<string name="swap_view_available_networks">উপলভ্য নেটওয়ার্ক খুলতে টিপ দাও</string>
<string name="swap_stopping_hotspot">হটস্পট থামসনো হচ্ছে…</string>
<string name="swap_setting_up_hotspot">হটস্পট শুরু হচ্ছে…</string>
<string name="swap_hidden_wifi_ssid">(লুকোনো)</string>
<string name="swap_blank_wifi_ssid">(খালি)</string>
<string name="swap_visible_hotspot">হটস্পট দিয়ে দৃশ্যমান</string>
<string name="swap_active_hotspot">%1$s (তোমার হটস্পট)</string>
<string name="swap_no_wifi_network">কোনো নেটওয়ার্ক নেই</string>
<string name="swap_success">আদলবদল সফল!</string>
<string name="swap">অ্যাপ অদলবদল</string>
<string name="swap_join_this_hotspot">তোমার হটস্পটে যুক্ত হতে বন্ধুকে সাহায্য করো</string>
<string name="swap_join_same_wifi_desc">নিশ্চিত করো একই ওয়াইফাইয়ে আছো, যাতে ওয়াইফাই দিয়ে বিনিময় করতে পারো। একই নেটওয়ার্কে তোমাদের প্রবেশ না পারলে, একটা হটস্পট বানাতে পারো।</string>
<string name="swap_join_same_wifi">তোমার বন্ধুর সাথে একই ওয়াইফাইতে যোগ দাও</string>
<string name="swap_nfc_description">তোমার বন্ধুর এফ-ড্রয়েড ও এনএফসি থাকলে তোমাদের ডিভাইস দুইটা পরস্পরের সাথে স্পর্শ করাও।</string>
<string name="swap_nfc_title">অদলবদলের জন্য টিপো</string>
<string name="nearby_splash__request_permission">চেষ্টা করো</string>
<string name="nearby_splash__document_tree">ভাণ্ডার ও আয়নার জন্য ইউএসবি ওটিজি অনুসন্ধান করো।</string>
<string name="nearby_splash__read_external_storage">ভাণ্ডার ও আয়না এসডি কার্ডে খুঁজো।</string>
<string name="nearby_splash__both_parties_need_fdroid">কাছাকাছি ব্যবহার করতে উভয় পক্ষের %1$s লাগবে।</string>
<string name="nearby_splash__find_people_button">কাছা</string>
<string name="nearby_splash__download_apps_from_people_nearby">ইন্টারনেট নেই\? কাছের কারো কাছ থেকে অ্যাপ নাও!</string>
<string name="system_install_denied_permissions">এই এক্সটেনশনকে বিশেষ অনুমতি দেওয়া হয়নি। অনুগ্রহ করে একটি সমস্যার প্রতিবেদন বানাও।</string>
<string name="uninstall_error_unknown">অজানা সমস্যার জন্য মুছতে ব্যর্থ</string>
<string name="install_error_unknown">অজানা সমস্যার জন্য ইন্সটল করতে ব্যর্থ</string>
</resources> </resources>

View File

@ -60,8 +60,8 @@
<item quantity="other">%1$dটি হালনাগাদ আছে</item> <item quantity="other">%1$dটি হালনাগাদ আছে</item>
</plurals> </plurals>
<plurals name="notification_summary_installed"> <plurals name="notification_summary_installed">
<item quantity="one">%1$dটি অ্যাপ ইন্সটলকৃত</item> <item quantity="one">%1$dটি অ্যাপ ইন্সটল করা হলো</item>
<item quantity="other">%1$dটি অ্যাপ ইন্সটলকৃত</item> <item quantity="other">%1$dটি অ্যাপ ইন্সটল করা হলো</item>
</plurals> </plurals>
<string name="notification_title_summary_update_available">হালনাগাদ আছে</string> <string name="notification_title_summary_update_available">হালনাগাদ আছে</string>
<string name="notification_title_summary_downloading">ডাউনলোডরত…</string> <string name="notification_title_summary_downloading">ডাউনলোডরত…</string>
@ -122,7 +122,7 @@
<string name="repo_edit_credentials">পাসওয়ার্ড পাল্টাও</string> <string name="repo_edit_credentials">পাসওয়ার্ড পাল্টাও</string>
<string name="login_title">অথেনটিকেশন প্রয়োজন</string> <string name="login_title">অথেনটিকেশন প্রয়োজন</string>
<string name="scan_removable_storage_summary">এসডি কার্ড ও ইউএসবি ড্রাইভে প্যাকেজ রিপো খুজো</string> <string name="scan_removable_storage_summary">এসডি কার্ড ও ইউএসবি ড্রাইভে প্যাকেজ রিপো খুজো</string>
<string name="scan_removable_storage_toast">%s স্ক্যান করা হচ্ছ</string> <string name="scan_removable_storage_toast">%s স্ক্যান করা হচ্ছ…</string>
<string name="scan_removable_storage_title">অপসারণযোগ্য স্টোরেজ স্ক্যান করো</string> <string name="scan_removable_storage_title">অপসারণযোগ্য স্টোরেজ স্ক্যান করো</string>
<string name="local_repo_https_on">স্থানীয় রিপোর জন্য এনক্রিপটেড HTTPS:// সংযোগ ব্যবহার করো</string> <string name="local_repo_https_on">স্থানীয় রিপোর জন্য এনক্রিপটেড HTTPS:// সংযোগ ব্যবহার করো</string>
<string name="local_repo_name_summary">তোমার স্থানীয় রিপোর বিজ্ঞাপিত শিরোনাম: %s</string> <string name="local_repo_name_summary">তোমার স্থানীয় রিপোর বিজ্ঞাপিত শিরোনাম: %s</string>
@ -222,293 +222,4 @@
<string name="undo">পূর্বাবস্থা</string> <string name="undo">পূর্বাবস্থা</string>
<string name="notification_channel_updates_title">হালনাগাদ</string> <string name="notification_channel_updates_title">হালনাগাদ</string>
<string tools:ignore="UnusedResources" name="category_System">ব্যবস্থা</string> <string tools:ignore="UnusedResources" name="category_System">ব্যবস্থা</string>
<string name="preference_category__my_apps">আমার অ্যাপ</string>
<string name="menu_source">উৎস কোড</string>
<string name="menu_license">অনুমতিপত্র: %s</string>
<string name="menu_email">ই-মেইল লেখক</string>
<string name="repo_provider">ভাণ্ডার: %s</string>
<string name="bad_fingerprint">সমস্যাপূর্ণ আঙ্গুলের ছাপ</string>
<string name="repo_add_fingerprint">আঙ্গুলের ছাপ (ঐচ্ছিক)</string>
<string name="repo_add_url">ভাণ্ডার ঠিকানা</string>
<string name="notification_channel_swaps_title">টানা</string>
<string name="swap_success">আদলবদল সফল!</string>
<string name="swap">অ্যাপ অদলবদল</string>
<string name="nearby_splash__request_permission">চেষ্টা করো</string>
<plurals name="button_view_all_apps_in_category">
<item quantity="one">%dটি দেখো</item>
<item quantity="other">%d এর সবগুলো দেখো</item>
</plurals>
<string name="requires_features">%1$s: প্রয়োজন</string>
<string name="share_repository">ভাণ্ডার শেয়ার করো</string>
<string name="repo_confirm_delete_title">ভাণ্ডার মুছবে\?</string>
<string name="repo_user_mirrors">ব্যবহারকারী আয়না</string>
<string name="repo_official_mirrors">প্রাতিষ্ঠানিক আয়না(মিরর)</string>
<string name="no_permissions">কোনো অনুমতি নেই</string>
<string name="panic_reset_repos_title">ভাণ্ডার আগের অবস্থায় নাও</string>
<string name="panic_hide_title">%s লুকাও</string>
<string name="panic_destructive_actions">ধ্বংসাত্মক ক্রিয়া</string>
<string name="panic_exit_title">অ্যাপ থেকে প্রস্থান</string>
<string name="preventScreenshots_title">স্ক্রিনশট প্রতিরোধ করো</string>
<string name="useTor">টর ব্যবহার করো</string>
<string name="try_again">আবার চেষ্টা করো</string>
<string name="local_repo">স্থানীয় ভাণ্ডার</string>
<string name="appcompatibility">অ্যাপ সামঞ্জস্যতা</string>
<string name="expert">বিশেষজ্ঞ অবস্থা</string>
<string name="app_version_x_available">%1$s সংস্করণ আছে</string>
<string name="app_inst_known_source">(%s থেকে) ইন্সটলকৃত</string>
<string name="banner_no_internet">ইন্টারনেট নেই</string>
<string name="banner_updating_repositories">ভাণ্ডার হালনাগাদরত</string>
<string name="theme_follow_system">ব্যবস্থা অনুসরণ</string>
<string name="app_list__dismiss_installing_app">ইন্সটল বাতিলকৃত</string>
<string name="details_last_updated_today">আজকে হালনাগাদকৃত</string>
<string name="tts_category_name">%1$s বিভাগ</string>
<string name="notification_title_summary_install_error">ইন্সটল ব্যর্থ</string>
<string name="notification_title_summary_installed">সফলভাবে ইন্সটলকৃত</string>
<string name="notification_title_single_update_available">হালনাগাদ আছে</string>
<plurals name="notification_summary_more">
<item quantity="one">আরো +%1$dটি…</item>
<item quantity="other">আরো +%1$dটি…</item>
</plurals>
<string name="keep_year">১ বছর</string>
<string name="keep_month">১ মাস</string>
<string name="keep_week">১ সপ্তাহ</string>
<string name="keep_day">১ দিন</string>
<string name="keep_hour">১ ঘণ্টা</string>
<string name="download_error">ডাউনলোড ব্যর্থ!</string>
<string name="swap_toast_using_path">%1$s ব্যবহার করে</string>
<string name="use_bluetooth">ব্লুটুথ ব্যবহার করো</string>
<string name="swap_confirm">অদলবদল নিশ্চিতকরণ</string>
<string name="swap_wifi_device_name">যন্ত্রের নাম</string>
<string name="swap_stopping_wifi">ওয়াইফাই থামানো হচ্ছে…</string>
<string name="swap_nearby">কাছাকাছি অদলবদল</string>
<string name="swap_people_nearby">কাছাকাছি লোকজন</string>
<string name="swap_choose_apps">অ্যাপ নির্বাচন</string>
<string name="swap_stopping_hotspot">হটস্পট থামসনো হচ্ছে…</string>
<string name="swap_setting_up_wifi">ওয়াইফাই শুরু হচ্ছে…</string>
<string name="swap_visible_wifi">ওয়াইফাই দিয়ে দৃশ্যমান</string>
<string name="swap_error_cannot_start_bluetooth">ব্লুটুথ শুরু করা যাচ্ছে না!</string>
<string name="swap_setting_up_bluetooth">ব্লুটুথ শুরু হচ্ছে…</string>
<string name="swap_visible_bluetooth">ব্লুটুথ দিয়ে দেখা যায়</string>
<string name="swap_scan_qr">কিউআর কোড খুঁজো</string>
<string name="open_qr_code_scanner">কিউআর স্ক্যানার খুলো</string>
<string name="swap_setting_up_hotspot">হটস্পট শুরু হচ্ছে…</string>
<string name="swap_visible_hotspot">হটস্পট দিয়ে দৃশ্যমান</string>
<string name="swap_active_hotspot">%1$s (তোমার হটস্পট)</string>
<string name="swap_no_wifi_network">কোনো নেটওয়ার্ক নেই</string>
<string name="nearby_splash__find_people_button">কাছা</string>
<string tools:ignore="UnusedResources" name="category_Sports_Health">খেলাধুলা ও স্বাস্থ্য</string>
<string name="repo_num_apps">অ্যাপ সংখ্যা</string>
<string name="status_connecting_to_repo">%1$s
\nএর সাথে যোগাযোগ হচ্ছে</string>
<string name="hiding_dialog_title">%s এখন লুকাও</string>
<string name="panic_settings">বিপদগ্রস্থ বোতামের পছন্দসমূহ</string>
<string name="panic_app_dialog_title">বিপদগ্রস্থ অ্যাপ নিশ্চিত করো</string>
<string name="panic_app_unknown_app">একটা অজানা অ্যাপ</string>
<string name="panic_app_setting_title">বিপদগ্রস্থ বোতামের অ্যাপ</string>
<string name="enable_proxy_title">HTTP প্রক্সি চালু করো</string>
<string name="deleting_repo">বর্তমান ভাণ্ডার মুছা হচ্ছে…</string>
<string name="force_touch_apps">স্পর্শপর্দা(টাচস্ক্রিন) অ্যাপ রাখো</string>
<string name="show_anti_feature_apps">অপবৈশিষ্ট্যের অ্যাপ রাখো</string>
<string name="show_incompat_versions">মিলহীন সংস্করণ রাখো</string>
<string name="menu_ignore_this">এই হালনাগাদ উপেক্ষা</string>
<string name="menu_ignore_all">সব হালনাগাদ উপেক্ষা</string>
<string name="menu_select_for_wipe">মুছার জন্য নির্বাচন</string>
<string name="repo_add_title">নতুন ভাণ্ডার যোগ করো</string>
<string name="send_installed_apps">ইন্সটলকৃত অ্যাপ শেয়ার করো</string>
<string name="added_on">%s এ যোগকৃত</string>
<string name="app_recommended_version_installed">সংস্করণ %1$s (প্রস্তাবিত)</string>
<string name="panic_exit_summary">এই অ্যাপ বন্ধ করা হবে</string>
<string name="panic_app_setting_summary">কোনো অ্যাপ নির্দিষ্ট করা হয়নি</string>
<string name="linking_apks">ভাণ্ডারে এপিকে সংযুক্ত করা হচ্ছে…</string>
<string name="writing_index_jar">স্বাক্ষরিত সূচী নথি লেখা হচ্ছে (index.jar)…</string>
<string name="local_repo_running">এফ-ড্রয়েড অদলবদলের জন্য প্রস্তুত</string>
<string name="show_anti_feature_apps_on">যেসব অ্যাপের অপবৈশিষ্ট্য লাগে তা দেখাও</string>
<string name="antinonfreeassetslist">এই অ্যাপে অ-মুক্ত উপাদান আছে</string>
<string name="antinonfreeadlist">এই অ্যাপ অ-মুক্ত অ্যাড-অন ব্যবহারে উৎসাহিত করে</string>
<string name="repositories_summary">অ্যাপের জন্য আরো উৎস যোগ করো</string>
<string name="malformed_repo_uri">বিকৃত ভাণ্ডার ইউআরআই উপেক্ষা করা হলো: %s</string>
<plurals name="updates__download_updates_for_apps">
<item quantity="one">%1$dটি অ্যাপের জন্য হালনাগাদ নামাও।</item>
<item quantity="other">%1$dটি অ্যাপের জন্য হালনাগাদ নামাও।</item>
</plurals>
<string name="installed_app__updates_ignored_for_suggested_version">%1$s সংস্করণের জন্য হালনাগাদ উপেক্ষাকৃত</string>
<string name="app_details__no_versions__none_compatible_with_device">এই যন্ত্রের সাথে সামঞ্জস্যপূর্ণ কোনো সংস্করণ নেই</string>
<string name="app_details__no_versions__no_compatible_signatures">এই স্বাক্ষরের সাথে সামঞ্জস্যপূর্ণ কোনো সংস্করণ নেই</string>
<string name="app_details__incompatible_mismatched_signature">ইন্সটলকৃত সংস্করণ থেকে আলাদা স্বাক্ষর</string>
<string name="repo_error_empty_username">খালি নাম, যাচাইকরণ তথ্য পাল্টানো হয়নি</string>
<string name="send_fdroid_metrics_report">%s পরিসংখ্যান প্রতিবেদন পাঠাও</string>
<plurals name="details_last_update_years">
<item quantity="one">%1$d বছর আগে হালনাগাদকৃত</item>
<item quantity="other">%1$d বছর আগে হালনাগাদকৃত</item>
</plurals>
<plurals name="details_last_update_months">
<item quantity="one">%1$d মাস আগে হালনাগাদকৃত</item>
<item quantity="other">%1$d মাস আগে হালনাগাদকৃত</item>
</plurals>
<plurals name="details_last_update_weeks">
<item quantity="one">%1$d সপ্তাহ আগে হালনাগাদকৃত</item>
<item quantity="other">%1$d সপ্তাহ আগে হালনাগাদকৃত</item>
</plurals>
<plurals name="details_last_update_days">
<item quantity="one">%1$d দিন আগে হালনাগাদকৃত</item>
<item quantity="other">%1$d দিন আগে হালনাগাদকৃত</item>
</plurals>
<string name="notification_channel_installs_description">অ্যাপ ইন্সটলের বিজ্ঞপ্তি দেখাও।</string>
<string name="interval_1w">সাপ্তাহিক হালনাগাদ আছে কিনা দেখো</string>
<string name="interval_1d">দৈনিক হালনাগাদ আছে কিনা দেখো</string>
<string name="interval_1h">প্রতি ঘণ্টায় হালনাগাদ আছে কিনা দেখো</string>
<string name="interval_never">কোনো স্বয়ংক্রিয় অ্যাপ হালনাগাদ নেই</string>
<string name="download_pending">ডাউনলোড শুরুর জন্য অপেক্ষারত…</string>
<string name="swap_not_visible_wifi">ওয়াইফাই দিয়ে দৃশ্যমান না</string>
<string name="swap_not_visible_bluetooth">ব্লুটুথ দিয়ে দৃশ্যমান না</string>
<string name="empty_search_available_app_list">সামঞ্জস্যপূর্ণ কোনো অ্যাপ পাওয়া যায়নি।</string>
<string name="repo_added">%1$s ভাণ্ডার সংরক্ষণ করা হয়েছে।</string>
<string name="global_error_updating_repos">হালনাগাদের সময় ত্রুটি: %s</string>
<string name="status_download_unknown_size">%1$s থেকে
\n%2$s
\nডাউনলোডরত</string>
<string name="install_history_and_metrics">ইন্সটল ইতিহাস ও পরিসংখ্যান</string>
<string name="panic_hide_warning_title">কিভাবে ফিরত আনতে হয় মনে রাখবে</string>
<string name="panic_hide_summary">অ্যাপ নিজেকে লুকাবে</string>
<string name="adding_apks_format">ভাণ্ডারে %s যোগ করা হচ্ছে…</string>
<string name="antiadslist">এই অ্যাপে বিজ্ঞাপন আছে</string>
<string name="details_new_in_version">সংস্করণ %s এ নতুন</string>
<string name="categories__empty_state__no_categories">দেখানোর জন্য কোনো বিভাগ নেই</string>
<string name="latest__empty_state__no_recent_apps">সাম্প্রতিক অ্যাপ পাওয়া যায়নি</string>
<string name="choose_bt_send">ব্লুটুথ দিয়ে পাঠানোর পদ্ধতি নির্বাচন করো</string>
<string name="app_list_download_ready">ডাউনলোডকৃত, ইন্সটল করতে প্রস্তুত</string>
<string name="app_installed_media">%s এ ফাইল ইন্সটলকৃত</string>
<string name="app_inst_unknown_source">ইন্সটলকৃত (অজানা উৎস থেকে)</string>
<string name="no_such_app">এইরকম কোনো অ্যাপ পাওয়া যায়নি।</string>
<string name="menu_show_install_history">ইন্সটল ইতিহাস দেখাও</string>
<string name="not_visible_nearby">কাছাকাছি নিষ্ক্রিয়</string>
<string name="menu_show_fdroid_metrics_report">পরিসংখ্যান প্রতিবেদন দেখাও</string>
<string name="send_to_fdroid_metrics">ব্যবহারের তথ্য পাঠাও</string>
<string name="fdroid_metrics_report">%s পরিসংখ্যানের প্ররিবেদন</string>
<string name="crash_dialog_title">এফ-ড্রয়েড থেমে‌ গেছে</string>
<string name="app__tts__downloading_progress">ডাউনলোডরত, %1$d%% সম্পূর্ণ</string>
<string name="perms_description_app">%1$s দ্বারা সরবরাহকৃত।</string>
<string name="uninstall_error_notify_title">%s এর ইন্সটল সরাতে ত্রুটি</string>
<string name="install_error_notify_title">%s ইন্সটল করতে ত্রুটি</string>
<string name="install_confirm">অনুমতি লাগবে</string>
<string name="swap_toast_hotspot_enabled">ওয়াইফাই হটস্পট চালু</string>
<string name="swap_nfc_title">অদলবদলের জন্য টিপো</string>
<string name="empty_installed_app_list">কোনো অ্যাপ ইন্সটল করা নেই।
\n
\nতোমার কাছে অন্যান্য অ্যাপ আছে, কিন্তু সেগুলো এফ-ড্রয়েডের না। ভাণ্ডারগুলোর হালনাগাদের প্রয়োজনীয়তা এর কারণ হতে পারে অথবা ভাণ্ডারগুলোতে আসলেই হয়তো তোমার অ্যাপগুলো নেই।</string>
<string name="app_details__no_versions__explain_incompatible_signatures">ইন্সটলকৃত সংস্করণ অন্য কোনো সংস্করণের সাথে অসামঞ্জস্যপূর্ণ। এই অ্যাপ মুছলে তোমাকে অন্যান্য সামঞ্জস্যপূর্ণ সংস্করণ দেখতে ও ইন্সটল করতে দিবে। গুগল প্লে বা অন্য জায়গা থেকে অ্যাপ ইন্সটল করলে বেশিরভাগ সময় এমন হয়, বিশেষত অন্য অনুমতিপত্র দিয়ে স্বাক্ষর করা হলে।</string>
<string name="interval_2w">প্রতি ২ সপ্তাহে হালনাগাদ আছে কিনা দেখো</string>
<string name="interval_12h">প্রতি ১২ ঘণ্টায় হালনাগাদ আছে কিনা দেখো</string>
<string name="interval_4h">প্রতি ঘণ্টায় হালনাগাদ আছে কিনা দেখো</string>
<string name="swap_toast_closing_nearby_after_timeout">অলস পরে থাকায় কাছাকাছি বন্ধ করা হয়েছে ।</string>
<string name="swap_cant_find_peers">তোমার উদ্দীষ্ট ব্যক্তিকে পাচ্ছ না\?</string>
<string name="swap_join_this_hotspot">তোমার হটস্পটে যুক্ত হতে বন্ধুকে সাহায্য করো</string>
<string name="repo_searching_address">%1$s এ
\nপ্যাকেজের ভাণ্ডার খোঁজা হচ্ছে</string>
<string name="repo_fingerprint">স্বাক্ষর চাবির আঙ্গুলছাপ (শা-২৫৬)</string>
<string name="all_other_repos_fine">অন্যান্য ভাণ্ডার আয়না বানায়নি।</string>
<string name="repos_unchanged">সব ভাণ্ডার হালনাগাদকৃত</string>
<string name="status_inserting_x_apps">%3$s থেকে অ্যাপের তথ্য সংরক্ষণ করা হচ্ছে (%1$d/%2$d)</string>
<string name="download_404">অনুরোধকৃত নথি পাওয়া যায়নি।</string>
<string name="copying_icons">ভাণ্ডারে অ্যাপ আইকন অনুলিপিত হচ্ছে…</string>
<string name="antinonfreenetlist">এই অ্যাপ অ-মুক্ত নেটওয়ার্ক সেবা নিতে উৎসাহিত করে</string>
<string name="invalid_url">এটা একটি সঠিক সংযোগ নয়।</string>
<string name="repo_exists_and_enabled">%1$s আগে থেকেই শুরু ও সক্রিয়।</string>
<string name="updates_disabled_by_settings">তথ্য/ওয়াইফাই পছন্দ দিয়ে হালনাগাদ নিষ্ক্রিয়</string>
<string name="banner_no_data_or_wifi">তথ্য বা‌ ওয়াইফাই নিষ্ক্রিয়</string>
<string name="use_pure_black_dark_theme_summary">শুধু ওলেড পর্দার জন্য প্রস্তাব দাও।</string>
<string name="swap_toast_invalid_url">অদলবদলের জন্য ভুল সংযোগ: %1$s</string>
<string name="swap_view_available_networks">উপলভ্য নেটওয়ার্ক খুলতে টিপ দাও</string>
<string name="notification_channel_swaps_description">পি২পি অ্যাপ অদলবদলের বিজ্ঞপ্তি দেখাও।</string>
<string name="perm_costs_money">এতে তোমার টাকা খরচ হতে পারে</string>
<string name="swap_toast_could_not_enable_hotspot">ওয়াইফাই হটস্পট চালু করা যায়নি!</string>
<string name="swap_switch_to_wifi">ওয়াইফাই নেটওয়ার্কে যেতে টিপ দাও</string>
<string name="swap_join_same_wifi">তোমার বন্ধুর সাথে একই ওয়াইফাইতে যোগ দাও</string>
<string name="nearby_splash__document_tree">ভাণ্ডার ও আয়নার জন্য ইউএসবি ওটিজি অনুসন্ধান করো।</string>
<string name="app_details__no_versions__show_incompat_versions">তবুও সামঞ্জস্যপূর্ণ সংস্করণ দেখাতে, %1$s পছন্দ সক্রিয় করো।</string>
<string name="app_details_donate_prompt">%2$s, %1$s বানিয়েছে। তাদেরকে এক কাপ কফি কিনে দাও!</string>
<string name="send_to_fdroid_metrics_summary">সাপ্তাহিক এফ-ড্রয়েড পরিসংখ্যানের অব্যক্তিগত তথ্য পাঠাও (ইন্সটল ইতিহাস রাখতে হবে)</string>
<string name="not_on_same_wifi">তুমি যে স্থানীয় ভাণ্ডার যুক্ত করেছো সেটা আর তোমার যন্ত্র একই ওয়াইফাইতে নেই! এই নেটওয়ার্ক যোগ দেবার চেষ্টা করো: %s</string>
<string name="nearby_splash__read_external_storage">ভাণ্ডার ও আয়না এসডি কার্ডে খুঁজো।</string>
<string name="nearby_splash__both_parties_need_fdroid">কাছাকাছি ব্যবহার করতে উভয় পক্ষের %1$s লাগবে।</string>
<string name="empty_can_update_app_list">অভিনন্দন!
\nসব অ্যাপ হালনাগাদকৃত।</string>
<string name="status_download">%1$s
\nথেকে ডাউনলোডরত
\n%2$s / %3$s (%4$d%%)</string>
<string name="panic_reset_repos_summary">সহজাত পছন্দে ভাণ্ডারের অবস্থা ফিরিয়ে জোর করো</string>
<string name="panic_add_apps_to_uninstall">আনইন্সটল ও মুছার জন্য অ্যাপ যোগ করো</string>
<string name="panic_will_be_wiped">মুছা হবে(আনইন্সটল) এবং সব তথ্য মুছা হবে</string>
<string name="expert_on">অতিরিক্ত তথ্য দেখাও ও অতিরিক্ত পছন্দসমূহ সক্রিয় করো</string>
<string name="antiknownvulnlist">এই অ্যাপের একটি জানা নিরাপত্তা দুর্বলতা রয়েছে</string>
<string name="antidisabledalgorithmlist">এই অ্যাপের নিরাপত্তা স্বাক্ষর খুব দুর্বল</string>
<string name="antinonfreedeplist">এই অ্যাপ অন্যান্য অ-মুক্ত অ্যাপের উপর নির্ভর করে</string>
<string name="bluetooth_activity_not_found">ব্লুটুথ দিয়ে পাঠানোর কোনো উপায় পাওয়া যায়নি, একটা নির্বাচন করো!</string>
<string name="send_installed_apps_csv">সিএসভি নথি হিসেবে এফ-ড্রয়েড কর্তৃক ইন্সটলকৃত অ্যাপ</string>
<string name="app_details_donate_prompt_unknown_author">%1$s এর তৈরিকারকদের এক কাপ কফি কিনে দাও!</string>
<string name="send_fdroid_metrics_json">জেসন নথি হিসেবে %s পরিসংখ্যান প্রতিবেদন</string>
<string name="notification_channel_updates_description">অ্যাপ ও ভাণ্ডার হালনাগাদের বিজ্ঞপ্তি দেখাবে।</string>
<string name="install_confirm_update_system_no_perms">ডিভাইসে আগে থেকে বিদ্যমান এই অ্যাপটি হালনাগাদ করবে\? তোমার বিদ্যমান তথ্য মুছে যাবে না। এতে কোনো বিশেষ অনুমতি লাগবে না।</string>
<string name="install_confirm_update_no_perms">ডিভাইসে আগে থেকে বিদ্যমান এই অ্যাপটি হালনাগাদ করবে\? তোমার বিদ্যমান তথ্য মুছে যাবে না। এতে কোনো বিশেষ অনুমতি লাগবে না।</string>
<string name="install_confirm_update_system">ডিভাইসে আগে থেকে বিদ্যমান এই অ্যাপটি হালনাগাদ করবে\? তোমার বিদ্যমান তথ্য মুছে যাবে না। হালনাগাদকৃত অ্যাপ যেসব অনুমতি পাবে তা নিম্নরূপ:</string>
<string name="install_confirm_update">বিদ্যমান অ্যাপের জন্য এই হালনাগাদটি কি ইন্সটল করবে\? তোমার তথ্য মুছবে না। হালনাগাদকৃত অ্যাপ যেসব অনুমতি পাবে তা নিম্নরূপ:</string>
<string name="swap_join_same_wifi_desc">নিশ্চিত করো একই ওয়াইফাইয়ে আছো, যাতে ওয়াইফাই দিয়ে বিনিময় করতে পারো। একই নেটওয়ার্কে তোমাদের প্রবেশ না পারলে, একটা হটস্পট বানাতে পারো।</string>
<string name="force_touch_apps_on">কঠিনন্ত্র(হার্ডওয়্যার) সমর্থন ছাড়া টাচপর্দা লাগে এমন অ্যাপ দেখাও</string>
<string name="show_incompat_versions_on">এই যন্ত্রের সাথে অসামঞ্জস্যপূর্ণ অ্যাপ সংস্করণ দেখাও</string>
<string name="antinosourcesince">উৎস কোড এখন অনুপভ্য, হালনাগাদ সম্ভব নয়।</string>
<string name="latest__empty_state__no_enabled_repos">ভাণ্ডার সক্রিয় করে হালনাগাদ করলে, সর্বশেষ অ্যাপ এখানে দেখাবে</string>
<string name="swap_intro">কাছাকাছি মানুষের সাথে যুক্ত হও ও অ্যাপ বিনিময় করো।</string>
<string name="nearby_splash__download_apps_from_people_nearby">ইন্টারনেট নেই\? কাছের কারো কাছ থেকে অ্যাপ নাও!</string>
<string name="install_error_unknown">অজানা সমস্যার জন্য ইন্সটল করতে ব্যর্থ</string>
<string name="uninstall_error_unknown">অজানা সমস্যার জন্য মুছতে ব্যর্থ</string>
<string name="antiupstreamnonfreelist">উজানের কোড সম্পূর্ণরূপে মুক্ত না</string>
<string name="swap_toast_find_removeable_storage">এসডি কার্ড বা ইউএসবি নির্বাচন করো</string>
<string name="latest__empty_state__never_updated">তোমার অ্যাপের তালিকা হালনাগাদ হলে, হালনাগাদকৃত অ্যাপ এখানে দেখানো হবে</string>
<string name="repo_exists_add_mirror">এটা %1$s এর অনুলিপি, আয়না হিসেবে যুক্ত করবে\?</string>
<string name="repo_delete_to_overwrite">প্রথমে %1$s মুছো যাতে চাবিগুলোর(কি) মধ্যে অসামঞ্জস্যতা না হয়।</string>
<string name="repo_exists_enable">%1$s আগে থেকেই তৈরি, নিশ্চিত করো যে এটা আবার সক্রিয় করতে চাও।</string>
<string name="repo_exists_add_fingerprint">%1$s আগে থেকেই তৈরি, এতে নতুন গুরুত্বপূর্ণ তথ্য যোগ করবে।</string>
<string name="antifeatureswarning">এই অ্যাপে অপছন্দনীয় কিছু বৈশিষ্ট্য আছে।</string>
<string name="use_pure_black_dark_theme">অন্ধকার রঙে সম্পূর্ণ কালো পটভূমি ব্যবহার করো</string>
<plurals name="tts_view_all_in_category">
<item quantity="one">%2$s বিভাগের %1$d অ্যাপটি দেখো</item>
<item quantity="other">%2$s বিভাগের %1$d সব অ্যাপ দেখো</item>
</plurals>
<string name="uninstall_confirm">অ্যাপটি মুছতে চাও\?</string>
<string name="updates__app_with_known_vulnerability__prompt_upgrade">%1$s এ একটি অনিরাপত্তা পাওয়া গেছে। এই‌ মুহূর্তেই অ্যাপটি হালনাগাদের প্রস্তাব দিচ্ছি।</string>
<string name="updates__app_with_known_vulnerability__prompt_uninstall">%1$s এ একটি অনিরাপত্তা পাওয়া গেছে। এই‌ মুহূর্তেই অ্যাপটি মুছে ফেলার প্রস্তাব দিচ্ছি।</string>
<string name="app_permission_storage">স্টোরেজে ইন্সটল করতে এফ-ড্রয়েডের স্টোরেজ অনুমতি লাগবে। ইনস্টল চালিয়ে যেতে পরের পর্দায় এটার অনুমতি দিও।</string>
<string name="toast_metrics_in_install_history">ইন্সটল ইতিহাস পাঠকে %s পরিসংখ্যান প্রতিবেদন পড়া যায়</string>
<string name="hiding_dialog_warning">সতর্কতা: মূল পর্দার একটি শর্টকাটও মুছে যাবে এবং পরে আলাদাভাবে আনতে হবে।</string>
<string name="panic_apps_to_uninstall">অ্যাপ মুছে ফেলা হবে এবং সব তথ্য মুছা হবে</string>
<string name="panic_settings_summary">বিপদের সময়ে করণীয় ক্রিয়া</string>
<string name="crash_dialog_text">একটা অপ্রত্যাশিত ত্রুটির কারণে অ্যাপ থামাতে হয়েছে। সমস্যাটা ঠিক করতে বিস্তারিত তথ্য ইমেইল করে পাঠাবে কি\?</string>
<string name="warning_scaning_qr_code">তোমার ক্যামেরায় মনে হয় স্বয়ংক্রিয়-মনোযোগ নেই, এতে সংকেতের পাঠোদ্ধার কঠিন হতে পারে।</string>
<string name="crash_dialog_comment_prompt">এখানে তুমি অতিরিক্ত তথ্য ও মন্তব্য দিতে পারো:</string>
<string name="uninstall_update_confirm">এই অ্যাপটিকে কি কারখানা সংস্করণ দিয়ে প্রতিস্থাপিত করবে\? সব তথ্য এতে মুছে যাবে।</string>
<string name="swap_toast_not_removable_storage">নির্বাচিত ভুক্তির সাথে কোনো স্টোরেজ যন্ত্র মিলেনি, আবার চেষ্টা করো।</string>
<string name="swap_no_peers_nearby">বিনিময়ের জন্য কাছাকাছি কাউকে পাওয়া যায়নি।</string>
<string name="swap_scan_or_type_url">একজন সংকেতের পাঠোদ্ধার করবে অথবা সংষোগটি নিজের পরিব্রাজক(ব্রাউজারে) লিখবে।</string>
<string name="swap_nfc_description">তোমার বন্ধুর এফ-ড্রয়েড ও এনএফসি থাকলে তোমাদের ডিভাইস দুইটা পরস্পরের সাথে স্পর্শ করাও।</string>
<string name="system_install_denied_permissions">এই এক্সটেনশনকে বিশেষ অনুমতি দেওয়া হয়নি। অনুগ্রহ করে একটি সমস্যার প্রতিবেদন বানাও।</string>
<string name="repo_disabled_notification">%1$s নিষ্ক্রিয় করা হয়েছে ।
\n
\nআবার এর থেকে অ্যাপ নামাতে একে পুনঃসক্রিয় করতে হবে।</string>
<string name="repo_not_yet_updated">এই ভাণ্ডার আগে ব্যবহার করা হয়নি। এতে বিদ্যমান অ্যাপ দেখতে এটাকে সক্রিয় করতে হবে।</string>
<string name="panic_app_dialog_message">তুমি কি %1$sকে ধ্বংসাত্বক আতঙ্ক বা বিপদ সংকেত বোতাম চালু করার ক্ষমতা দেওয়ার ব্যাপারে নিশ্চিত\?</string>
<string name="swap_qr_isnt_for_swap">যে কিউআর কোডের পাঠোদ্ধার করেছো সেটা বিনিময় সংকেত মনে হচ্ছে না।</string>
<string name="swap_connection_misc_error">যুক্ত করার সময় একটা সমস্যা হয়েছে, তাই বিনিময় করা যাচ্ছে না।</string>
<string name="no_handler_app">এমন কোনো অ্যাপ এই মুহূর্তে তোমার কাছে নেই যা %s চালাতে পারবে।</string>
<string name="not_visible_nearby_description">কাছাকাছি ডিভাইসের সাথে বিনিময় করার আগে তোমার ডিভাইস দৃশ্যমান করো।</string>
<string name="swap_confirm_connect">এখনই %1$s থেকে অ্যাপ আনতে চাও\?</string>
<string name="hide_on_long_search_press_summary">অনুসন্ধান বোতামে কিছুক্ষণ ধরে রাখলে অ্যাপ লুকানো হবে</string>
<string name="preventScreenshots_summary">স্ক্রিনশট নেওয়া প্রতিরোধ করে আর অ্যাপের বিষয়বস্তু সাম্প্রতিক পর্দা থেকে লুকায়</string>
<string name="useTorSummary">গোপনীয়তা বৃদ্ধির জন্য জোর করে সব তথ্যের গমন টর দিয়ে নাও। অরবট লাগবে</string>
<string name="touch_to_configure_local_repo">বিস্তারিত দেখতে টিপ দাও এবং অন্যদের সাথে অ্যাপ বিনিময়ের অনুমতি দাও।</string>
<string name="unsigned_description">এর অর্থ একটা তালিকার অ্যাপ যাচাই করা যায়নি। অস্বাক্ষরিত সূচী থেকে অ্যাপ নামানোর সময় তোমাকে সাবধান হতে হবে।</string>
<string name="repo_confirm_delete_body">একটা ভাণ্ডার মুছা মানে এটার অ্যাপ আর উপলভ্য থাকবে না।
\n
\nদ্র: আগে থেকে ইন্সটল করা অ্যাপ ডিভাইসে থাকবে।</string>
<string name="hiding_dialog_message">তুমি কি আসলেই লঞ্চার থেকে %1$s সরাতে চাও\? শুধু নকল %3$s অ্যাপের মধ্যে %2$d লিখলেই এটা ফিরত আসবে।</string>
<string name="panic_hide_warning_message">আতঙ্ক/বিপদের সময়, লঞ্চার থেকে %1$s সরানো হবে। শুধু নকল %3$s অ্যাপের মধ্যে %2$d লিখলেই এটা ফিরত আসবে।</string>
</resources> </resources>

View File

@ -30,7 +30,7 @@
<string name="no">No</string> <string name="no">No</string>
<string name="repo_add_title">Afegeix un nou dipòsit</string> <string name="repo_add_title">Afegeix un nou dipòsit</string>
<string name="repo_add_add">Afegeix</string> <string name="repo_add_add">Afegeix</string>
<string name="cancel">Cancel·lar</string> <string name="cancel">Cancel·la</string>
<string name="enable">Permès</string> <string name="enable">Permès</string>
<string name="add_key">Afegeix clau</string> <string name="add_key">Afegeix clau</string>
<string name="overwrite">Sobreescriu</string> <string name="overwrite">Sobreescriu</string>
@ -154,7 +154,7 @@
<string name="menu_bitcoin">Bitcoin</string> <string name="menu_bitcoin">Bitcoin</string>
<string name="menu_litecoin">Litecoin</string> <string name="menu_litecoin">Litecoin</string>
<string name="menu_flattr">Flattr</string> <string name="menu_flattr">Flattr</string>
<string name="banner_updating_repositories">Actualitzant respositoris</string> <string name="banner_updating_repositories">Actualitzant els dipòsits</string>
<string name="more">Més</string> <string name="more">Més</string>
<string name="less">Menys</string> <string name="less">Menys</string>
<string name="permissions">Permisos</string> <string name="permissions">Permisos</string>
@ -425,10 +425,10 @@
<string name="repo_exists_add_mirror">Això és una còpia de %1$s, voleu afegir-la com a rèplica?</string> <string name="repo_exists_add_mirror">Això és una còpia de %1$s, voleu afegir-la com a rèplica?</string>
<string name="antidisabledalgorithmlist">La signatura de seguretat de l\'aplicació és feble</string> <string name="antidisabledalgorithmlist">La signatura de seguretat de l\'aplicació és feble</string>
<string name="antiknownvulnlist">Aquesta aplicació té un problema de seguretat conegut</string> <string name="antiknownvulnlist">Aquesta aplicació té un problema de seguretat conegut</string>
<string name="show_anti_feature_apps">Inclou aplicacions amb funcionalitats indesitjades</string> <string name="show_anti_feature_apps">Inclou aplicacions amb característiques indesitjades</string>
<string name="show_anti_feature_apps_on">Mostra aplicacions que requereixen funcionalitats indesitjades</string> <string name="show_anti_feature_apps_on">Mostra aplicacions que requereixen característiques indesitjades</string>
<string name="force_touch_apps">Inclou aplicacions per pantalla tàctil</string> <string name="force_touch_apps">Inclou aplicacions per pantalla tàctil</string>
<string name="force_touch_apps_on">Mostra les aplicacions que requereixen pantalla tàctil, independent del maquinari que tingui</string> <string name="force_touch_apps_on">Mostra les aplicacions que requereixen pantalla tàctil, independent del maquinari que tinc</string>
<string name="hiding_dialog_warning">Alerta: s\'eliminarà qualsevol icona de la pantalla d\'inici i caldrà tornar a afegir-la manualment.</string> <string name="hiding_dialog_warning">Alerta: s\'eliminarà qualsevol icona de la pantalla d\'inici i caldrà tornar a afegir-la manualment.</string>
<string name="hide_on_long_search_press_summary">Si manteniu premut el botó de cerca l\'aplicació s\'amagarà</string> <string name="hide_on_long_search_press_summary">Si manteniu premut el botó de cerca l\'aplicació s\'amagarà</string>
<string name="repo_official_mirrors">Rèpliques oficials</string> <string name="repo_official_mirrors">Rèpliques oficials</string>
@ -466,13 +466,13 @@
<string name="menu_open">Obrir</string> <string name="menu_open">Obrir</string>
<string name="menu_downgrade">Revertir versió</string> <string name="menu_downgrade">Revertir versió</string>
<string name="scan_removable_storage_title">Escaneja l\'emmagatzematge extraïble</string> <string name="scan_removable_storage_title">Escaneja l\'emmagatzematge extraïble</string>
<string name="scan_removable_storage_toast">Escanejant %s…</string> <string name="scan_removable_storage_toast">S\'està escanejant %s…</string>
<string name="scan_removable_storage_summary">Cerca dipòsits de paquets en emmagatzematge extraïble com ara targetes SD i memòries USB</string> <string name="scan_removable_storage_summary">Cerca dipòsits de paquets en emmagatzematge extraïble com ara targetes SD i memòries USB</string>
<string name="app_repository">Dipòsit: %1$s</string> <string name="app_repository">Dipòsit: %1$s</string>
<string name="main_menu__updates">Actualitzacions</string> <string name="main_menu__updates">Actualitzacions</string>
<string name="nearby_splash__read_external_storage">Cerca a la memòria SD repositoris d\'intercanvi.</string> <string name="nearby_splash__read_external_storage">Cerca a la memòria SD repositoris d\'intercanvi.</string>
<string name="nearby_splash__request_permission">Prova-ho</string> <string name="nearby_splash__request_permission">Prova-ho</string>
<string name="not_visible_nearby">Proximitat no habilitada</string> <string name="not_visible_nearby">Al voltant no habilitat</string>
<string name="not_visible_nearby_description">Abans d\'intercanviar amb dispositius propers, feu el vostre dispositiu visible.</string> <string name="not_visible_nearby_description">Abans d\'intercanviar amb dispositius propers, feu el vostre dispositiu visible.</string>
<string name="swap_toast_using_path">Utilitzant %1$s</string> <string name="swap_toast_using_path">Utilitzant %1$s</string>
<string name="swap_toast_not_removable_storage">Aquesta tria no concorda amb cap dispositiu d\'emmagatzematge extraïble, torneu-ho a provar!</string> <string name="swap_toast_not_removable_storage">Aquesta tria no concorda amb cap dispositiu d\'emmagatzematge extraïble, torneu-ho a provar!</string>
@ -505,18 +505,4 @@
<string name="notification_channel_installs_description">Mostra les notificacions d\'instal·lació d\'aplicacions.</string> <string name="notification_channel_installs_description">Mostra les notificacions d\'instal·lació d\'aplicacions.</string>
<string name="notification_channel_installs_title">Instal·lacions</string> <string name="notification_channel_installs_title">Instal·lacions</string>
<string name="notification_channel_swaps_title">Intercanvis</string> <string name="notification_channel_swaps_title">Intercanvis</string>
<string name="theme_follow_system">Seguir el sistema</string>
<string name="use_pure_black_dark_theme_summary">Recomanat només per a pantalles OLED.</string>
<string name="use_pure_black_dark_theme">Utilitzar fons negre pur en el tema fosc</string>
<string name="banner_no_data_or_wifi">Dades/WiFi desactivats</string>
<string name="banner_no_internet">Sense Internet</string>
<string name="menu_show_install_history">Mostra l\'historial d\'instal·lacions</string>
<string name="menu_show_fdroid_metrics_report">Mostra l\'informe de mètriques</string>
<string name="toast_metrics_in_install_history">L\'informe mètriques %s es pot visualitzar al visor de l\'historial d\'instal·lacions</string>
<string name="send_to_fdroid_metrics_summary">Envia setmanalment dades anònimes a les mètriques F-Droid (requereix mantenir historial dinstal·lacions)</string>
<string name="send_to_fdroid_metrics">Enviar dades d\'ús</string>
<string name="fdroid_metrics_report">Informe de mètriques %s</string>
<string name="install_history_and_metrics">Instal·la l\'històric i les mètriques</string>
<string name="send_fdroid_metrics_json">Informe de mètriques %s como a fitxer JSON</string>
<string name="send_fdroid_metrics_report">Envia informe de mètriques %s</string>
</resources> </resources>

View File

@ -145,7 +145,7 @@
<string name="menu_litecoin">Litecoin</string> <string name="menu_litecoin">Litecoin</string>
<string name="menu_flattr">Flattr</string> <string name="menu_flattr">Flattr</string>
<string name="status_download_unknown_size">Stahování\n%2$s z\n%1$s</string> <string name="status_download_unknown_size">Stahování\n%2$s z\n%1$s</string>
<string name="banner_updating_repositories">Aktualizuji repozitáře</string> <string name="banner_updating_repositories">Aktualizace repozitářů</string>
<string name="status_processing_xml_percent">Zpracovávání %2$s / %3$s (%4$d%%) z %1$s</string> <string name="status_processing_xml_percent">Zpracovávání %2$s / %3$s (%4$d%%) z %1$s</string>
<string name="all_other_repos_fine">Žádné jiné repozitáře nenahlásily chyby.</string> <string name="all_other_repos_fine">Žádné jiné repozitáře nenahlásily chyby.</string>
<string name="permissions">Oprávnění</string> <string name="permissions">Oprávnění</string>
@ -513,18 +513,4 @@
<string name="notification_channel_installs_title">Instalace</string> <string name="notification_channel_installs_title">Instalace</string>
<string name="notification_channel_swaps_description">Zobrazí oznámení o P2P směnách aplikací.</string> <string name="notification_channel_swaps_description">Zobrazí oznámení o P2P směnách aplikací.</string>
<string name="notification_channel_swaps_title">Směny</string> <string name="notification_channel_swaps_title">Směny</string>
<string name="theme_follow_system">Podle systému</string>
<string name="use_pure_black_dark_theme_summary">Doporučeno jen pro OLED-obrazovky.</string>
<string name="use_pure_black_dark_theme">Použít čistě černé pozadí s tmavým motivem</string>
<string name="banner_no_data_or_wifi">Datové spojení nebo WLAN nejsou aktivní</string>
<string name="banner_no_internet">Nemáme spojení</string>
<string name="menu_show_install_history">Zobrazit průběh instalací</string>
<string name="menu_show_fdroid_metrics_report">Zobrazit hlášení metrik</string>
<string name="toast_metrics_in_install_history">Hlášení metrik %s lze prohlédnout v náhledu průběhu instalací</string>
<string name="send_to_fdroid_metrics_summary">Odesílá anonymizovaná data týdně pro metriky F-Droid (vyžaduje uchování průběhu instalací)</string>
<string name="send_to_fdroid_metrics">Odeslat data o používání</string>
<string name="fdroid_metrics_report">%s Hlášení metrik</string>
<string name="install_history_and_metrics">Průběh instalací a metriky</string>
<string name="send_fdroid_metrics_json">%s hlášení metrik jako JSON soubor</string>
<string name="send_fdroid_metrics_report">Odeslat hlášení metrik %s</string>
</resources> </resources>

View File

@ -51,18 +51,18 @@
<string name="menu_ignore_this">Dieses Update ignorieren</string> <string name="menu_ignore_this">Dieses Update ignorieren</string>
<string name="menu_website">Internetseite</string> <string name="menu_website">Internetseite</string>
<string name="menu_issues">Probleme</string> <string name="menu_issues">Probleme</string>
<string name="menu_source">Quellcode</string> <string name="menu_source">Quelltext</string>
<string name="menu_upgrade">Aktualisieren</string> <string name="menu_upgrade">Aktualisieren</string>
<string name="details_notinstalled">Nicht installiert</string> <string name="details_notinstalled">Nicht installiert</string>
<string name="antiadslist">Diese App enthält Werbung</string> <string name="antiadslist">Diese App enthält Werbung</string>
<string name="antitracklist">Diese App verfolgt und versendet Ihre Aktivitäten</string> <string name="antitracklist">Diese App verfolgt und versendet Ihre Aktivitäten</string>
<string name="antinonfreeadlist">Diese App bewirbt nicht-quelloffene Erweiterungen</string> <string name="antinonfreeadlist">Diese Anwendung bewirbt nicht-quelloffene Erweiterungen</string>
<string name="antinonfreenetlist">Diese App bewirbt nicht-quelloffene Netzwerkdienste</string> <string name="antinonfreenetlist">Diese Anwendung bewirbt nicht-quelloffene Netzwerkdienste</string>
<string name="antinonfreedeplist">Diese App ist abhängig von anderen nicht-quelloffenen Apps</string> <string name="antinonfreedeplist">Diese Anwendung hängt von nicht-quelloffenen Anwendungen ab</string>
<string name="antiupstreamnonfreelist">Der Originalcode ist nicht völlig quelloffen</string> <string name="antiupstreamnonfreelist">Der Originalcode ist nicht völlig quelloffen</string>
<string name="display">Anzeige</string> <string name="display">Anzeige</string>
<string name="expert">Expertenmodus</string> <string name="expert">Expertenmodus</string>
<string name="expert_on">Zusätzliche Informationen anzeigen und dazugehörige Einstellungen aktivieren</string> <string name="expert_on">Zusätzliche Informationen anzeigen und zusätzliche Einstellungen aktivieren</string>
<string name="search_hint">Apps suchen</string> <string name="search_hint">Apps suchen</string>
<string name="appcompatibility">Kompatibilität der App</string> <string name="appcompatibility">Kompatibilität der App</string>
<string name="show_incompat_versions">Inkompatible Versionen einbeziehen</string> <string name="show_incompat_versions">Inkompatible Versionen einbeziehen</string>
@ -157,7 +157,7 @@
<string name="uninstall_error_unknown">Deinstallation wegen unbekanntem Fehler fehlgeschlagen</string> <string name="uninstall_error_unknown">Deinstallation wegen unbekanntem Fehler fehlgeschlagen</string>
<string name="app_name">F-Droid</string> <string name="app_name">F-Droid</string>
<string name="unstable_updates">Instabile Aktualisierungen</string> <string name="unstable_updates">Instabile Aktualisierungen</string>
<string name="unstable_updates_summary">Aktualisierungen für instabile Versionen vorschlagen</string> <string name="unstable_updates_summary">Aktualisierungen für instabile Version vorschlagen</string>
<string name="menu_changelog">Änderungen</string> <string name="menu_changelog">Änderungen</string>
<string name="category_Connectivity">Verbindung</string> <string name="category_Connectivity">Verbindung</string>
<string name="category_Sports_Health">Sport / Gesundheit</string> <string name="category_Sports_Health">Sport / Gesundheit</string>
@ -248,7 +248,7 @@
<string name="empty_search_available_app_list">Keine passenden Apps verfügbar.</string> <string name="empty_search_available_app_list">Keine passenden Apps verfügbar.</string>
<string name="crash_dialog_title">F-Droid ist abgestürzt</string> <string name="crash_dialog_title">F-Droid ist abgestürzt</string>
<string name="crash_dialog_comment_prompt">Sie können zusätzliche Informationen und Kommentare hier einfügen:</string> <string name="crash_dialog_comment_prompt">Sie können zusätzliche Informationen und Kommentare hier einfügen:</string>
<string name="antinonfreeassetslist">Diese App enthält nicht-quelloffene Bestandteile</string> <string name="antinonfreeassetslist">Diese Anwendung enthält nicht-quelloffene Bestandteile</string>
<string name="crash_dialog_text">Die App wurde durch einen unerwarteten Fehler beendet. Möchten Sie die Details als E-Mail versenden, um eine Fehlerbehebung zu unterstützen\?</string> <string name="crash_dialog_text">Die App wurde durch einen unerwarteten Fehler beendet. Möchten Sie die Details als E-Mail versenden, um eine Fehlerbehebung zu unterstützen\?</string>
<string name="menu_email">E-Mail an Autor</string> <string name="menu_email">E-Mail an Autor</string>
<string name="repo_provider">Paketquelle: %s</string> <string name="repo_provider">Paketquelle: %s</string>
@ -271,7 +271,7 @@
<string name="update_auto_install">Automatisch installieren</string> <string name="update_auto_install">Automatisch installieren</string>
<string name="update_auto_install_summary">App-Aktualisierungen im Hintergrund herunterladen und installieren</string> <string name="update_auto_install_summary">App-Aktualisierungen im Hintergrund herunterladen und installieren</string>
<string name="keep_install_history">Installationsverlauf aufbewahren</string> <string name="keep_install_history">Installationsverlauf aufbewahren</string>
<string name="keep_install_history_summary">Speichern Sie ein Protokoll aller Installationen und Deinstallationen in einem privaten Speicher</string> <string name="keep_install_history_summary">Ein Protokoll zu allen Installationen und Deinstallationen in einem privaten Speicher anlegen</string>
<string name="warning_no_internet">Aktualisierung kann nicht durchgeführt werden! Besteht eine Internetverbindung?</string> <string name="warning_no_internet">Aktualisierung kann nicht durchgeführt werden! Besteht eine Internetverbindung?</string>
<string name="versions">Versionen</string> <string name="versions">Versionen</string>
<string name="app_details_donate_prompt_unknown_author">Den Entwicklern von %1$s einen Kaffee spendieren!</string> <string name="app_details_donate_prompt_unknown_author">Den Entwicklern von %1$s einen Kaffee spendieren!</string>
@ -299,7 +299,7 @@
<string name="app_version_x_available">Version %1$s verfügbar</string> <string name="app_version_x_available">Version %1$s verfügbar</string>
<string name="app_version_x_installed">Version %1$s</string> <string name="app_version_x_installed">Version %1$s</string>
<string name="clear_search">Suche löschen</string> <string name="clear_search">Suche löschen</string>
<string name="main_menu__latest_apps">Neues</string> <string name="main_menu__latest_apps">Neueste</string>
<string name="main_menu__categories">Kategorien</string> <string name="main_menu__categories">Kategorien</string>
<string name="main_menu__updates">Aufgaben</string> <string name="main_menu__updates">Aufgaben</string>
<string name="main_menu__swap_nearby">Umfeld</string> <string name="main_menu__swap_nearby">Umfeld</string>
@ -327,7 +327,7 @@
<item quantity="other">Aktualisierungen für %1$d Apps herunterladen.</item> <item quantity="other">Aktualisierungen für %1$d Apps herunterladen.</item>
</plurals> </plurals>
<string name="details_new_in_version">Neu in Version %s</string> <string name="details_new_in_version">Neu in Version %s</string>
<string name="antifeatureswarning">Diese App besitzt Merkmale, die möglicherweise unerwünscht sind.</string> <string name="antifeatureswarning">Diese Anwendung besitzt Merkmale, die möglicherweise unerwünscht sind.</string>
<string name="antifeatures">Unerwünschte Merkmale</string> <string name="antifeatures">Unerwünschte Merkmale</string>
<string name="details_last_updated_today">Heute aktualisiert</string> <string name="details_last_updated_today">Heute aktualisiert</string>
<plurals name="details_last_update_days"> <plurals name="details_last_update_days">
@ -340,11 +340,11 @@
</plurals> </plurals>
<string name="app_list__name__successfully_installed">%1$s installiert</string> <string name="app_list__name__successfully_installed">%1$s installiert</string>
<string name="nearby_splash__download_apps_from_people_nearby">Kein Internet\? Apps von Menschen in Ihrer Umgebung erhalten!</string> <string name="nearby_splash__download_apps_from_people_nearby">Kein Internet\? Apps von Menschen in Ihrer Umgebung erhalten!</string>
<string name="nearby_splash__find_people_button">In Ihrer Nähe suchen</string> <string name="nearby_splash__find_people_button">Menschen in Ihrer Nähe suchen</string>
<string name="nearby_splash__both_parties_need_fdroid">Beide benötigen %1$s, um den Direkttausch zu verwenden.</string> <string name="nearby_splash__both_parties_need_fdroid">Beide benötigen %1$s, um den Direkttausch zu verwenden.</string>
<string name="latest__empty_state__no_recent_apps">Keine kürzlich aktualisierten Apps gefunden</string> <string name="latest__empty_state__no_recent_apps">Keine kürzlich aktualisierten Apps gefunden</string>
<string name="latest__empty_state__never_updated">Sobald Ihre App-Liste aktualisiert wurde, sollten die neuesten Apps hier angezeigt werden</string> <string name="latest__empty_state__never_updated">Sobald Ihre Anwendungsliste aktualisiert wurde, sollten die neuesten Anwendungen hier angezeigt werden.</string>
<string name="latest__empty_state__no_enabled_repos">Sobald Sie eine Paketquelle aktiviert haben und diese aktualisiert wurde, sollten die neuesten Apps hier angezeigt werden</string> <string name="latest__empty_state__no_enabled_repos">Sobald Sie eine Paketquelle aktiviert haben und diese aktualisiert wurde, sollten die neuesten Anwendungen hier angezeigt werden.</string>
<string name="categories__empty_state__no_categories">Keine Kategorien zum Anzeigen</string> <string name="categories__empty_state__no_categories">Keine Kategorien zum Anzeigen</string>
<string name="menu_video">Video</string> <string name="menu_video">Video</string>
<string name="app__tts__cancel_download">Herunterladen abbrechen</string> <string name="app__tts__cancel_download">Herunterladen abbrechen</string>
@ -377,7 +377,7 @@
<string name="by_author_format">von %s</string> <string name="by_author_format">von %s</string>
<string name="download_404">Die angeforderte Datei wurde nicht gefunden.</string> <string name="download_404">Die angeforderte Datei wurde nicht gefunden.</string>
<string name="force_old_index">Altes Index-Format erzwingen</string> <string name="force_old_index">Altes Index-Format erzwingen</string>
<string name="force_old_index_summary">Bei Fehlern oder Kompatibilitätsproblemen den XML-App-Index verwenden</string> <string name="force_old_index_summary">Bei Fehlern oder Kompatibilitätsproblemen den XML-App-Index verwenden.</string>
<string name="app_list_download_ready">Heruntergeladen und bereit zur Installation</string> <string name="app_list_download_ready">Heruntergeladen und bereit zur Installation</string>
<string name="app_installed_media">Datei wurde nach %s installiert</string> <string name="app_installed_media">Datei wurde nach %s installiert</string>
<string name="app_permission_storage">F-Droid benötigt Zugriffsrechte auf den Speicher, um es dort zu installieren. Bitte beim nächsten Bildschirm bestätigen, um mit der Installation fortzufahren.</string> <string name="app_permission_storage">F-Droid benötigt Zugriffsrechte auf den Speicher, um es dort zu installieren. Bitte beim nächsten Bildschirm bestätigen, um mit der Installation fortzufahren.</string>
@ -448,12 +448,12 @@
<string name="hide_all_notifications">Alle Benachrichtigungen ausblenden</string> <string name="hide_all_notifications">Alle Benachrichtigungen ausblenden</string>
<string name="install_history">Installationsverlauf</string> <string name="install_history">Installationsverlauf</string>
<string name="install_history_summary">Das private Protokoll zu allen Installationen und Deinstallationen ansehen</string> <string name="install_history_summary">Das private Protokoll zu allen Installationen und Deinstallationen ansehen</string>
<string name="send_version_and_uuid">Version und UUID an Server senden</string> <string name="send_version_and_uuid">Version und UUID an Server verschicken</string>
<string name="prompt_to_send_crash_reports">Auf Nachfrage Absturzbericht senden</string> <string name="prompt_to_send_crash_reports">Auf Nachfrage Absturzbericht senden</string>
<string name="hide_all_notifications_summary">Anzeigen zu Aktivitäten in der Statusleiste und den Benachrichtigungen generell vermeiden.</string> <string name="hide_all_notifications_summary">Anzeigen zu Aktivitäten in der Statusleiste und den Benachrichtigungen generell vermeiden.</string>
<string name="send_version_and_uuid_summary">Diese App-Version und eine zufällige, einmalige ID beim Herunterladen einschließen, hat Auswirkungen auf den nächsten App-Start.</string> <string name="send_version_and_uuid_summary">Diese App-Version und eine zufällige, einmalige ID beim Herunterladen einschließen, hat Auswirkungen auf den nächsten App-Start.</string>
<string name="share_repository">Paketquelle teilen</string> <string name="share_repository">Paketquelle teilen</string>
<string name="allow_push_requests">Paketquellen App-Installationen erlauben</string> <string name="allow_push_requests">Paketquellen erlauben, Apps zu installieren/deinstallieren</string>
<string name="allow_push_requests_summary">Paketquellen-Metadaten können Push-Anfragen zur Installation oder Deinstallation von Apps enthalten</string> <string name="allow_push_requests_summary">Paketquellen-Metadaten können Push-Anfragen zur Installation oder Deinstallation von Apps enthalten</string>
<string name="antinosourcesince">Der Quelltext ist nicht mehr erhältlich, keine Aktualisierungen möglich.</string> <string name="antinosourcesince">Der Quelltext ist nicht mehr erhältlich, keine Aktualisierungen möglich.</string>
<string name="send_install_history">Installationsverlauf senden</string> <string name="send_install_history">Installationsverlauf senden</string>
@ -501,12 +501,12 @@
<string name="menu_opencollective">OpenCollective</string> <string name="menu_opencollective">OpenCollective</string>
<string name="notification_channel_swaps_title">Tauschen</string> <string name="notification_channel_swaps_title">Tauschen</string>
<string name="notification_channel_installs_description">Zeigt Benachrichtigungen zur App-Installation an.</string> <string name="notification_channel_installs_description">Zeigt Benachrichtigungen zur App-Installation an.</string>
<string name="notification_channel_updates_description">Zeigt Benachrichtigungen über App- und Paketquellen-Aktualisierungen an.</string> <string name="notification_channel_updates_description">Zeigt Benachrichtigungen über App- und Repository-Aktualisierungen an.</string>
<string name="notification_channel_updates_title">Aktualisierungen</string> <string name="notification_channel_updates_title">Aktualisierungen</string>
<string name="notification_channel_swaps_description">Zeigt Benachrichtigungen zum Austausch von Apps via P2P an.</string> <string name="notification_channel_swaps_description">Zeigt Benachrichtigungen zum Austausch von Apps via P2P an.</string>
<string name="notification_channel_installs_title">Installationen</string> <string name="notification_channel_installs_title">Installationen</string>
<string name="toast_metrics_in_install_history">Der %s Metrikenbericht ist sichtbar in der Ansicht des Installationsverlaufes</string> <string name="toast_metrics_in_install_history">Der %s Metrikenbericht ist sichtbar in der Ansicht des Installationsverlaufes</string>
<string name="send_to_fdroid_metrics_summary">Sendet anonymisierte Daten wöchentlich zu F-Droid Metriken (erfordert das Behalten des Installationsverlaufes)</string> <string name="send_to_fdroid_metrics_summary">Sendet anonymisierte Daten wöchtenlich zu F-Droid Metriken (erfordert das Behalten des Installationsverlaufes)</string>
<string name="send_to_fdroid_metrics">Nutzungsdaten senden</string> <string name="send_to_fdroid_metrics">Nutzungsdaten senden</string>
<string name="fdroid_metrics_report">%s Metrikenbericht</string> <string name="fdroid_metrics_report">%s Metrikenbericht</string>
<string name="install_history_and_metrics">Installationsverlauf und Metriken</string> <string name="install_history_and_metrics">Installationsverlauf und Metriken</string>
@ -517,6 +517,4 @@
<string name="use_pure_black_dark_theme_summary">Nur für OLED-Bildschirme empfohlen.</string> <string name="use_pure_black_dark_theme_summary">Nur für OLED-Bildschirme empfohlen.</string>
<string name="theme_follow_system">Systemdefiniert</string> <string name="theme_follow_system">Systemdefiniert</string>
<string name="use_pure_black_dark_theme">Rein schwarzen Hintergrund im dunklen Thema verwenden</string> <string name="use_pure_black_dark_theme">Rein schwarzen Hintergrund im dunklen Thema verwenden</string>
<string name="banner_no_data_or_wifi">Keine Daten oder WLAN aktiviert</string>
<string name="banner_no_internet">Kein Internet</string>
</resources> </resources>

View File

@ -521,9 +521,4 @@
<string name="send_fdroid_metrics_json">Αναφορά διαγνωστικών %s ως αρχείο JSON</string> <string name="send_fdroid_metrics_json">Αναφορά διαγνωστικών %s ως αρχείο JSON</string>
<string name="send_fdroid_metrics_report">Αποστολή αναφοράς διαγνωστικών %s</string> <string name="send_fdroid_metrics_report">Αποστολή αναφοράς διαγνωστικών %s</string>
<string name="send_to_fdroid_metrics">Αποστολή δεδομένων χρήσης</string> <string name="send_to_fdroid_metrics">Αποστολή δεδομένων χρήσης</string>
<string name="theme_follow_system">Ίδιο με του συστήματος</string>
<string name="use_pure_black_dark_theme_summary">Συνιστάται μόνο για οθόνες OLED.</string>
<string name="use_pure_black_dark_theme">Χρήση τελείως μαύρου φόντου στο σκούρο θέμα</string>
<string name="banner_no_data_or_wifi">Δεν έχουν ενεργοποιηθεί δεδομένα ή WiFi</string>
<string name="banner_no_internet">Χωρίς σύνδεση στο διαδίκτυο</string>
</resources> </resources>

View File

@ -56,9 +56,9 @@
<item quantity="other">%1$d Updates</item> <item quantity="other">%1$d Updates</item>
</plurals> </plurals>
<string name="notification_content_single_installed">Successfully installed</string> <string name="notification_content_single_installed">Successfully installed</string>
<string name="notification_content_single_installing">Installing %1$s</string> <string name="notification_content_single_installing">Installing \"%1$s\"</string>
<string name="notification_content_single_downloading_update">Downloading update for %1$s</string> <string name="notification_content_single_downloading_update">Downloading update for \"%1$s\"</string>
<string name="notification_content_single_downloading">Downloading %1$s</string> <string name="notification_content_single_downloading">Downloading \"%1$s\"</string>
<string name="notification_title_single_install_error">Install Failed</string> <string name="notification_title_single_install_error">Install Failed</string>
<string name="notification_title_single_ready_to_install_update">Update ready to install</string> <string name="notification_title_single_ready_to_install_update">Update ready to install</string>
<string name="notification_title_single_ready_to_install">Ready to install</string> <string name="notification_title_single_ready_to_install">Ready to install</string>
@ -217,12 +217,12 @@
<string name="hide_on_long_search_press_summary">Long pressing the search button will hide the app</string> <string name="hide_on_long_search_press_summary">Long pressing the search button will hide the app</string>
<string name="hide_on_long_search_press_title">Hide with search button</string> <string name="hide_on_long_search_press_title">Hide with search button</string>
<string name="hiding_dialog_warning">Warning: Any app shortcut on the home screen will also be removed and needs to be re-added manually.</string> <string name="hiding_dialog_warning">Warning: Any app shortcut on the home screen will also be removed and needs to be re-added manually.</string>
<string name="hiding_dialog_message">Are you sure you want to remove %1$s from the launcher\? Only typing %2$d in the fake %3$s app can restore it.</string> <string name="hiding_dialog_message">Are you sure you want to remove %1$s from the launcher\? Only typing \"%2$d\" in the fake %3$s app can restore it.</string>
<string name="hiding_dialog_title">Hide %s Now</string> <string name="hiding_dialog_title">Hide %s Now</string>
<string name="hiding_calculator">Calculator</string> <string name="hiding_calculator">Calculator</string>
<string name="panic_reset_repos_summary">Force the repo setup back to defaults</string> <string name="panic_reset_repos_summary">Force the repo setup back to defaults</string>
<string name="panic_reset_repos_title">Reset repos</string> <string name="panic_reset_repos_title">Reset repos</string>
<string name="panic_hide_warning_message">In a panic event, this will remove %1$s from the launcher. Only typing %2$d in the fake %3$s app can restore it.</string> <string name="panic_hide_warning_message">In a panic event, this will remove %1$s from the launcher. Only typing \"%2$d\" in the fake %3$s app can restore it.</string>
<string name="panic_hide_warning_title">Remember how to restore</string> <string name="panic_hide_warning_title">Remember how to restore</string>
<string name="panic_hide_summary">App will hide itself</string> <string name="panic_hide_summary">App will hide itself</string>
<string name="panic_hide_title">Hide %s</string> <string name="panic_hide_title">Hide %s</string>
@ -374,7 +374,7 @@
<string name="app_details__no_versions__explain_incompatible_signatures">The installed version is not compatible with any available versions. Uninstalling the app will enable you to view and install compatible versions. This often occurs with apps installed via Google Play or other sources, if they are signed by a different certificate.</string> <string name="app_details__no_versions__explain_incompatible_signatures">The installed version is not compatible with any available versions. Uninstalling the app will enable you to view and install compatible versions. This often occurs with apps installed via Google Play or other sources, if they are signed by a different certificate.</string>
<string name="app_details__no_versions__none_compatible_with_device">No versions compatible with device</string> <string name="app_details__no_versions__none_compatible_with_device">No versions compatible with device</string>
<string name="app_details__no_versions__no_compatible_signatures">No versions with compatible signature</string> <string name="app_details__no_versions__no_compatible_signatures">No versions with compatible signature</string>
<string name="app_details__no_versions__show_incompat_versions">To show incompatible versions here anyway, enable the %1$s setting.</string> <string name="app_details__no_versions__show_incompat_versions">To show incompatible versions here anyway, enable the \"%1$s\" setting.</string>
<string name="app_details__incompatible_mismatched_signature">Different signature to installed version</string> <string name="app_details__incompatible_mismatched_signature">Different signature to installed version</string>
<string name="app_details_donate_prompt">%1$s is created by %2$s. Buy them a coffee!</string> <string name="app_details_donate_prompt">%1$s is created by %2$s. Buy them a coffee!</string>
<string name="app_details_donate_prompt_unknown_author">Buy the developers of %1$s a coffee!</string> <string name="app_details_donate_prompt_unknown_author">Buy the developers of %1$s a coffee!</string>
@ -509,6 +509,4 @@
<string name="install_history_and_metrics">Install history and metrics</string> <string name="install_history_and_metrics">Install history and metrics</string>
<string name="send_fdroid_metrics_json">%s metrics report as JSON file</string> <string name="send_fdroid_metrics_json">%s metrics report as JSON file</string>
<string name="send_fdroid_metrics_report">Send %s metrics report</string> <string name="send_fdroid_metrics_report">Send %s metrics report</string>
<string name="banner_no_data_or_wifi">No Data or Wi-Fi enabled</string>
<string name="banner_no_internet">No Internet</string>
</resources> </resources>

View File

@ -94,7 +94,7 @@
<string name="cache_downloaded">Kaŝmemorigi apk-dosierojn</string> <string name="cache_downloaded">Kaŝmemorigi apk-dosierojn</string>
<string name="unstable_updates_summary">Proponi ĝisdatigojn al nestabilaj versioj</string> <string name="unstable_updates_summary">Proponi ĝisdatigojn al nestabilaj versioj</string>
<string name="system_installer">Privilegia aldonaĵo</string> <string name="system_installer">Privilegia aldonaĵo</string>
<string name="system_installer_on">Uzi la privilegian aldonaĵon por instali, ĝisdatigi kaj forigi pakaĵojn</string> <string name="system_installer_on">Uzi privilegian aldonaĵon por instali, ĝisdatigi kaj forigi pakaĵojn</string>
<string name="local_repo_name">Nomo de via loka deponejo</string> <string name="local_repo_name">Nomo de via loka deponejo</string>
<string name="local_repo_name_summary">La anoncata nomo de via loka deponejo: %s</string> <string name="local_repo_name_summary">La anoncata nomo de via loka deponejo: %s</string>
<string name="local_repo_https_on">Uzi ĉifritan HTTPS:// konekton por loka deponejo</string> <string name="local_repo_https_on">Uzi ĉifritan HTTPS:// konekton por loka deponejo</string>
@ -521,6 +521,4 @@
<string name="theme_follow_system">Sistema</string> <string name="theme_follow_system">Sistema</string>
<string name="use_pure_black_dark_theme_summary">Konsilinda nur por ekranoj OLED.</string> <string name="use_pure_black_dark_theme_summary">Konsilinda nur por ekranoj OLED.</string>
<string name="use_pure_black_dark_theme">Uzi komplete nigran fonon por malhela etoso</string> <string name="use_pure_black_dark_theme">Uzi komplete nigran fonon por malhela etoso</string>
<string name="banner_no_data_or_wifi">Neniu interreta konekto aktiva</string>
<string name="banner_no_internet">Sen interreto</string>
</resources> </resources>

View File

@ -6,7 +6,7 @@
<string name="delete">Eliminar</string> <string name="delete">Eliminar</string>
<string name="enable_nfc_send">Habilitar envío NFC…</string> <string name="enable_nfc_send">Habilitar envío NFC…</string>
<string name="cache_downloaded">Mantener las aplicaciones en caché</string> <string name="cache_downloaded">Mantener las aplicaciones en caché</string>
<string name="updates">Actualizaciones</string> <string name="updates">Avisos</string>
<string name="other">Otros</string> <string name="other">Otros</string>
<string name="update_interval">Intervalo de actualización automática</string> <string name="update_interval">Intervalo de actualización automática</string>
<string name="notify">Mostrar actualizaciones disponibles</string> <string name="notify">Mostrar actualizaciones disponibles</string>
@ -508,17 +508,12 @@
<string name="notification_channel_installs_description">Muestra notificaciones de instalación de aplicaciones.</string> <string name="notification_channel_installs_description">Muestra notificaciones de instalación de aplicaciones.</string>
<string name="notification_channel_installs_title">Instalaciones</string> <string name="notification_channel_installs_title">Instalaciones</string>
<string name="menu_show_install_history">Mostrar historial de instalación</string> <string name="menu_show_install_history">Mostrar historial de instalación</string>
<string name="menu_show_fdroid_metrics_report">Mostrar reporte de métricas</string> <string name="menu_show_fdroid_metrics_report">Mostrar el informe de métricas</string>
<string name="toast_metrics_in_install_history">El reporte de métricas %s se puede visualizar en el visor del historial de instalaciones</string> <string name="toast_metrics_in_install_history">El informe %s se puede ver en el visor del historial de instalaciones</string>
<string name="send_to_fdroid_metrics_summary">Enviar información anónima semanalmente a métricas F-Droid(requiere historial de instalación Keep)</string> <string name="send_to_fdroid_metrics_summary">Enviar estadísticas anónimas a F-Droid Metrics (necesita que se mantenga el historial de instalación)</string>
<string name="send_to_fdroid_metrics">Enviar información de uso</string> <string name="send_to_fdroid_metrics">Enviar estadísticas de uso</string>
<string name="fdroid_metrics_report">%s Reporte de métricas</string> <string name="fdroid_metrics_report">%s Reporte de métricas</string>
<string name="install_history_and_metrics">Instalar historial y métricas</string> <string name="install_history_and_metrics">Instalar historial y métricas</string>
<string name="send_fdroid_metrics_json">%s reporte de métricas como un archivo JSON</string> <string name="send_fdroid_metrics_json">%s reporte de métricas como un archivo JSON</string>
<string name="send_fdroid_metrics_report">Enviar reporte de métricas %s</string> <string name="send_fdroid_metrics_report">Enviar %s informe de métricas</string>
<string name="theme_follow_system">Usar el del sistema</string>
<string name="use_pure_black_dark_theme_summary">Recomendado sólo para pantallas OLED.</string>
<string name="use_pure_black_dark_theme">Usar un fondo negro puro en el tema oscuro</string>
<string name="banner_no_data_or_wifi">Sin datos o WiFi activados</string>
<string name="banner_no_internet">Sin Internet</string>
</resources> </resources>

View File

@ -70,7 +70,7 @@
<string name="adding_apks_format">%s lisatakse hoidlasse…</string> <string name="adding_apks_format">%s lisatakse hoidlasse…</string>
<string name="linking_apks">APK faile lingitakse hoidlasse…</string> <string name="linking_apks">APK faile lingitakse hoidlasse…</string>
<string name="copying_icons">Rakenduste ikoone kopeeritakse hoidlasse…</string> <string name="copying_icons">Rakenduste ikoone kopeeritakse hoidlasse…</string>
<string name="banner_updating_repositories">Värskendan hoidlaid</string> <string name="banner_updating_repositories">Hoidlaid värskendatakse</string>
<string name="repos_unchanged">Kõik hoidlad on kaasajastaud</string> <string name="repos_unchanged">Kõik hoidlad on kaasajastaud</string>
<string name="all_other_repos_fine">Kõik ülejäänud hoidlad vigu ei põhjustanud.</string> <string name="all_other_repos_fine">Kõik ülejäänud hoidlad vigu ei põhjustanud.</string>
<string name="repo_details">Hoidla</string> <string name="repo_details">Hoidla</string>
@ -520,6 +520,4 @@
<string name="theme_follow_system">Kasuta üldist teemat</string> <string name="theme_follow_system">Kasuta üldist teemat</string>
<string name="use_pure_black_dark_theme_summary">Soovitame kasutamiseks vaid OLED-ekraanidel.</string> <string name="use_pure_black_dark_theme_summary">Soovitame kasutamiseks vaid OLED-ekraanidel.</string>
<string name="use_pure_black_dark_theme">Tumedas teemas kasuta musta tausta</string> <string name="use_pure_black_dark_theme">Tumedas teemas kasuta musta tausta</string>
<string name="banner_no_data_or_wifi">3G, 4G või WiFi pole kasutusel</string>
<string name="banner_no_internet">Internetiühendus puudub</string>
</resources> </resources>

View File

@ -25,11 +25,11 @@
<string name="choose_bt_send">گزینش روش ارسال بلوتوث</string> <string name="choose_bt_send">گزینش روش ارسال بلوتوث</string>
<string name="repo_add_url">نشانی مخزن</string> <string name="repo_add_url">نشانی مخزن</string>
<string name="repo_add_fingerprint">اثر انگشت (اختیاری)</string> <string name="repo_add_fingerprint">اثر انگشت (اختیاری)</string>
<string name="menu_manage">مخازن</string> <string name="menu_manage">مخزنها</string>
<string name="menu_search">جست‌وجو</string> <string name="menu_search">جست‌وجو</string>
<string name="menu_share">هم‌رسانی</string> <string name="menu_share">هم‌رسانی</string>
<string name="menu_install">نصب</string> <string name="menu_install">نصب</string>
<string name="menu_uninstall">لغو نصب</string> <string name="menu_uninstall">حذف نصب</string>
<string name="menu_issues">اشکال‌ها</string> <string name="menu_issues">اشکال‌ها</string>
<string name="menu_source">کد منبع</string> <string name="menu_source">کد منبع</string>
<string name="details_notinstalled">نصب نشده</string> <string name="details_notinstalled">نصب نشده</string>
@ -118,7 +118,7 @@
<string name="proxy_port">درگاه پروکسی</string> <string name="proxy_port">درگاه پروکسی</string>
<string name="proxy_port_summary">شمارهٔ درگاه پروکسی (مثلاً 8118)</string> <string name="proxy_port_summary">شمارهٔ درگاه پروکسی (مثلاً 8118)</string>
<string name="status_download_unknown_size">در حال بارگیری\n%2$s از\n%1$s</string> <string name="status_download_unknown_size">در حال بارگیری\n%2$s از\n%1$s</string>
<string name="banner_updating_repositories">در حال به‌روزرسانی مخازن</string> <string name="banner_updating_repositories">در حال به‌روز رسانی مخزنها</string>
<string name="status_processing_xml_percent">در حال پردازش %2$s / %3$s (%4$d%%) از %1$s</string> <string name="status_processing_xml_percent">در حال پردازش %2$s / %3$s (%4$d%%) از %1$s</string>
<string name="status_inserting_apps">در حال ذخیرهٔ جزئیات برنامه</string> <string name="status_inserting_apps">در حال ذخیرهٔ جزئیات برنامه</string>
<string name="repos_unchanged">تمام مخزن‌ها به‌روز هستند</string> <string name="repos_unchanged">تمام مخزن‌ها به‌روز هستند</string>
@ -285,7 +285,7 @@
<string name="clear_search">پاک‌سازی جست‌وجو</string> <string name="clear_search">پاک‌سازی جست‌وجو</string>
<string name="repositories_summary">افزودن منابع اضافی برای برنامه ها</string> <string name="repositories_summary">افزودن منابع اضافی برای برنامه ها</string>
<string name="menu_video">ویدیو</string> <string name="menu_video">ویدیو</string>
<string name="main_menu__latest_apps">آخرین</string> <string name="main_menu__latest_apps">جدیدترین</string>
<string name="main_menu__categories">دسته‌ها</string> <string name="main_menu__categories">دسته‌ها</string>
<string name="main_menu__swap_nearby">اطراف</string> <string name="main_menu__swap_nearby">اطراف</string>
<string name="latest__empty_state__no_recent_apps">هیچ برنامهٔ اخیری پیدا نشد</string> <string name="latest__empty_state__no_recent_apps">هیچ برنامهٔ اخیری پیدا نشد</string>
@ -504,6 +504,4 @@
<string name="theme_follow_system">از سیستم تبعیت کن</string> <string name="theme_follow_system">از سیستم تبعیت کن</string>
<string name="use_pure_black_dark_theme_summary">فقط برای صفحه های OLED توصیه می شود.</string> <string name="use_pure_black_dark_theme_summary">فقط برای صفحه های OLED توصیه می شود.</string>
<string name="use_pure_black_dark_theme">از زمینه سیاه خالص در تم تاریک استفاده کن</string> <string name="use_pure_black_dark_theme">از زمینه سیاه خالص در تم تاریک استفاده کن</string>
<string name="banner_no_data_or_wifi">اتصال وای‌فای یا داده‌ها فعال نیست</string>
<string name="banner_no_internet">بدون اینترنت</string>
</resources> </resources>

View File

@ -126,7 +126,7 @@
<string name="category_Internet">Internet</string> <string name="category_Internet">Internet</string>
<string name="category_Multimedia">Multimédia</string> <string name="category_Multimedia">Multimédia</string>
<string name="category_Navigation">Navigation</string> <string name="category_Navigation">Navigation</string>
<string name="category_Phone_SMS">Téléphone et SMS</string> <string name="category_Phone_SMS">Téléphone et textos</string>
<string name="category_Reading">Lecture</string> <string name="category_Reading">Lecture</string>
<string name="category_Science_Education">Science et éducation</string> <string name="category_Science_Education">Science et éducation</string>
<string name="category_Security">Sécurité</string> <string name="category_Security">Sécurité</string>
@ -210,10 +210,10 @@
<string name="swap_intro">Connectez-vous et échangez des applis avec des personnes autour de vous.</string> <string name="swap_intro">Connectez-vous et échangez des applis avec des personnes autour de vous.</string>
<string name="swap_visible_bluetooth">Visible en Bluetooth</string> <string name="swap_visible_bluetooth">Visible en Bluetooth</string>
<string name="swap_setting_up_bluetooth">Activation du Bluetooth…</string> <string name="swap_setting_up_bluetooth">Activation du Bluetooth…</string>
<string name="swap_not_visible_bluetooth">Non visible en Bluetooth</string> <string name="swap_not_visible_bluetooth">Non visible par le Bluetooth</string>
<string name="swap_visible_wifi">Visible en Wi-Fi</string> <string name="swap_visible_wifi">Visible par le Wi-Fi</string>
<string name="swap_setting_up_wifi">Mise en place du Wi-Fi…</string> <string name="swap_setting_up_wifi">Mise en place du Wi-Fi…</string>
<string name="swap_not_visible_wifi">Non visible en Wi-Fi</string> <string name="swap_not_visible_wifi">Non visible par le Wi-Fi</string>
<string name="swap_wifi_device_name">Nom de lappareil</string> <string name="swap_wifi_device_name">Nom de lappareil</string>
<string name="swap_send_fdroid">Envoyer F-Droid</string> <string name="swap_send_fdroid">Envoyer F-Droid</string>
<string name="swap_no_peers_nearby">Aucune personne n\'a été trouvée à proximité.</string> <string name="swap_no_peers_nearby">Aucune personne n\'a été trouvée à proximité.</string>
@ -246,7 +246,7 @@
<string name="repo_error_empty_username">Nom d\'utilisateur vide, aucune modification effectuée</string> <string name="repo_error_empty_username">Nom d\'utilisateur vide, aucune modification effectuée</string>
<string name="about_license">Licence</string> <string name="about_license">Licence</string>
<string name="empty_search_available_app_list">Aucune application correspondante disponible.</string> <string name="empty_search_available_app_list">Aucune application correspondante disponible.</string>
<string name="status_inserting_apps">Enregistrement des détails de l\'appli</string> <string name="status_inserting_apps">Enregistrement des détails des applis</string>
<string name="crash_dialog_title">F-Droid sest arrêté de manière inattendue</string> <string name="crash_dialog_title">F-Droid sest arrêté de manière inattendue</string>
<string name="crash_dialog_comment_prompt">Vous pouvez ajouter des informations supplémentaires :</string> <string name="crash_dialog_comment_prompt">Vous pouvez ajouter des informations supplémentaires :</string>
<string name="crash_dialog_text">Une erreur inattendue sest produite entraînant larrêt de lappli. Souhaitez envoyer les détails par courriel afin daider à corriger la situation\?</string> <string name="crash_dialog_text">Une erreur inattendue sest produite entraînant larrêt de lappli. Souhaitez envoyer les détails par courriel afin daider à corriger la situation\?</string>
@ -288,14 +288,14 @@
<string name="notification_content_single_downloading_update">Téléchargement de la mise à jour de « %1$s »…</string> <string name="notification_content_single_downloading_update">Téléchargement de la mise à jour de « %1$s »…</string>
<string name="notification_content_single_installing">Installation de « %1$s »…</string> <string name="notification_content_single_installing">Installation de « %1$s »…</string>
<string name="notification_content_single_installed">Installation réussie</string> <string name="notification_content_single_installed">Installation réussie</string>
<string name="notification_title_summary_update_available">Une mise à jour est disponible</string> <string name="notification_title_summary_update_available">Une mise à jour est proposée</string>
<string name="notification_title_summary_downloading">Téléchargement…</string> <string name="notification_title_summary_downloading">Téléchargement…</string>
<string name="notification_title_summary_downloading_update">Téléchargement de la mise à jour…</string> <string name="notification_title_summary_downloading_update">Téléchargement de la mise à jour…</string>
<string name="notification_title_summary_ready_to_install">Prêt pour installation</string> <string name="notification_title_summary_ready_to_install">Prêt pour installation</string>
<string name="notification_title_summary_ready_to_install_update">Mise à jour prête pour installation</string> <string name="notification_title_summary_ready_to_install_update">Mise à jour prête pour installation</string>
<string name="notification_title_summary_installing">Installation</string> <string name="notification_title_summary_installing">Installation</string>
<string name="notification_title_summary_installed">Installé avec succès</string> <string name="notification_title_summary_installed">Installé avec succès</string>
<string name="notification_title_summary_install_error">Linstallation a échoué</string> <string name="notification_title_summary_install_error">Échec dinstallation</string>
<string name="notification_action_update">Mettre à jour</string> <string name="notification_action_update">Mettre à jour</string>
<string name="notification_action_cancel">Annuler</string> <string name="notification_action_cancel">Annuler</string>
<string name="notification_action_install">Installer</string> <string name="notification_action_install">Installer</string>
@ -520,6 +520,4 @@
<string name="theme_follow_system">Suivre le système</string> <string name="theme_follow_system">Suivre le système</string>
<string name="use_pure_black_dark_theme_summary">Recommandé uniquement pour les écrans OLED.</string> <string name="use_pure_black_dark_theme_summary">Recommandé uniquement pour les écrans OLED.</string>
<string name="use_pure_black_dark_theme">Utiliser un fond noir pur pour le thème sombre</string> <string name="use_pure_black_dark_theme">Utiliser un fond noir pur pour le thème sombre</string>
<string name="banner_no_data_or_wifi">Pas de Données ou Wi-Fi actif</string>
<string name="banner_no_internet">Aucune connexion Internet</string>
</resources> </resources>

View File

@ -1,105 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="notification_channel_updates_title">Fernijingen</string>
<string name="keep_forever">Ivich</string>
<string name="keep_year">1 Jier</string>
<string name="keep_month">1 Moanne</string>
<string name="keep_week">1 Wike</string>
<string name="keep_day">1 Dei</string>
<string name="keep_hour">1 Oere</string>
<string name="perms_new_perm_prefix">Nij:</string>
<string name="swap_visible_wifi">Sichtber via Wi-Fi</string>
<string name="open_qr_code_scanner">QR Scanner Iepenje</string>
<string name="repo_name">Namme</string>
<string name="theme">Tema</string>
<string name="allow">Tastean</string>
<string name="menu_opencollective">OpenCollective</string>
<string name="menu_liberapay">Liberapay</string>
<string name="menu_flattr">Flattr</string>
<string name="menu_litecoin">Litecoin</string>
<string name="menu_bitcoin">Bitcoin</string>
<string name="next">Fierder</string>
<string name="overwrite">Oerskrieuwe</string>
<string name="versions">Ferzjes</string>
<string name="update_all">Alles fernije</string>
<string name="app_version_x_installed">Ferzje %1$s</string>
<string name="app_version_x_available">Ferzje %1$s beskikber</string>
<string name="app_not_installed">Net Ynstallearre</string>
<string name="app_new">Nij</string>
<string name="app_installed">Ynstallearre</string>
<string name="app_suggested">Rekommandaasje</string>
<string name="about_license">Lisinsje</string>
<string name="about_source">Boarne koade</string>
<string name="about_version">Ferzje</string>
<string name="app_details_donate_prompt">%1$s is troch %2$s makke. Keapje harren in kofje!</string>
<string name="app_details_donate_prompt_unknown_author">Keapje de ûntwikkelders fan %1$s in kofje!</string>
<string name="repo_edit_credentials">Wachtwurd Feroarje</string>
<string name="login_password">Wachtwurd</string>
<string name="login_name">Brûkersnamme</string>
<string name="notify">Beskikbere fernijingen sjen litte</string>
<string name="notification_title_summary_install_error">Ynstallaasje Mislearre</string>
<string name="notification_title_single_update_available">Fernijing Beskikber</string>
<string tools:ignore="UnusedResources" name="category_System">Systeem</string>
<string tools:ignore="UnusedResources" name="category_Sports_Health">Sport &amp; Sûnens</string>
<string name="wifi">Wi-Fi</string>
<string name="less">Minder</string>
<string name="more">Mear</string>
<string name="updates__tts__download_app">Downloade</string>
<string name="app_list__name__successfully_installed">%1$s is ynstalleare</string>
<string name="about_title">Oer F-Droid</string>
<string name="notification_action_cancel">Ôfbrekke</string>
<string name="notification_action_update">Fernije</string>
<string name="newPerms">Nij</string>
<string name="swap_dont_show_again">Nea wer sjen litte</string>
<string name="swap_welcome">Wolkom by F-Droid!</string>
<string tools:ignore="UnusedResources" name="category_Writing">Skrieuwe</string>
<string tools:ignore="UnusedResources" name="category_Time">Tiid</string>
<string tools:ignore="UnusedResources" name="category_Security">Befeiliging</string>
<string tools:ignore="UnusedResources" name="category_Science_Education">Wittenskip &amp; Edukaasje</string>
<string tools:ignore="UnusedResources" name="category_Reading">Lêze</string>
<string tools:ignore="UnusedResources" name="category_Phone_SMS">Telefoan &amp; SMS</string>
<string tools:ignore="UnusedResources" name="category_Navigation">Navigaasje</string>
<string tools:ignore="UnusedResources" name="category_Money">Jild</string>
<string tools:ignore="UnusedResources" name="category_Internet">Internet</string>
<string tools:ignore="UnusedResources" name="category_Graphics">Grafysk</string>
<string tools:ignore="UnusedResources" name="category_Games">Spultsjes</string>
<string tools:ignore="UnusedResources" name="category_Development">Ûntwikkeling</string>
<string name="skip">Oerslaan</string>
<string name="details_notinstalled">Net ynstalleare</string>
<string name="main_menu__swap_nearby">Tichteby</string>
<string name="main_menu__latest_apps">Nijste</string>
<string name="menu_upgrade">Fernije</string>
<string name="menu_install">Ynstalleare</string>
<string name="menu_share">Diele</string>
<string name="menu_launch">Iepenje</string>
<string name="menu_search">Sykje</string>
<string name="menu_settings">Ynstellings</string>
<string name="cancel">Ôfbrekke</string>
<string name="back">Werom</string>
<string name="yes">Ja</string>
<string name="details_new_in_version">Nij yn ferzje %s</string>
<string name="menu_translation">Oersetting</string>
<string name="menu_source">Boarne Koade</string>
<string name="menu_license">Lisinsje: %s</string>
<string name="menu_video">Fideo</string>
<string name="menu_website">Webstee</string>
<string name="menu_open">Iepenje</string>
<string name="app__install_downloaded_update">Fernijing</string>
<string name="about_site">Webstee</string>
<string name="update_auto_install">Fernijingen automatysk ynstallearje</string>
<string name="over_wifi">Oer Wi-Fi</string>
<string name="other">Oars</string>
<string name="send_to_fdroid_metrics">Brûkersdata ferstjoere</string>
<string name="keep_install_history">Ynstallaasje skiednis bewarje</string>
<string name="install_history">Ynstallaasje skiednis</string>
<string name="hide_all_notifications">Alle notifikaasjes besidebergje</string>
<string name="delete">Fuortsmite</string>
<string name="by_author_format">troch %s</string>
<string name="version">Ferzje</string>
<string name="app_details">App Details</string>
<string name="notification_action_install">Ynstallearje</string>
<string name="no">Nee</string>
<string name="ok">OK</string>
<string name="updates">Fernijingen</string>
<string name="app_name">F-Droid</string>
</resources>

View File

@ -529,6 +529,4 @@
<string name="theme_follow_system">כמו המערכת</string> <string name="theme_follow_system">כמו המערכת</string>
<string name="use_pure_black_dark_theme_summary">מומלץ למסכי OLED בלבד.</string> <string name="use_pure_black_dark_theme_summary">מומלץ למסכי OLED בלבד.</string>
<string name="use_pure_black_dark_theme">להשתמש ברקע שחור טהור בערכת עיצוב כהה</string> <string name="use_pure_black_dark_theme">להשתמש ברקע שחור טהור בערכת עיצוב כהה</string>
<string name="banner_no_data_or_wifi">הרשתות האלחוטית והסלולרית מושבתות</string>
<string name="banner_no_internet">אין אינטרנט</string>
</resources> </resources>

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="delete">मिटाएं</string> <string name="delete">मिटाएं</string>
<string name="enable_nfc_send">NFC द्वारा भेजे को सक्षम करें</string> <string name="enable_nfc_send">NFC द्वारा भेजे …</string>
<string name="version">संस्करण</string> <string name="version">संस्करण</string>
<string name="updates">अपडेट</string> <string name="updates">सॉफ़्ट्वेर अपडेट</string>
<string name="unstable_updates">अस्थिर अद्यतन</string> <string name="unstable_updates">अस्थिर अद्यतन</string>
<string name="unstable_updates_summary">अस्थिर अद्यतन को सुझाव दें</string> <string name="unstable_updates_summary">अस्थिर अद्यतन को सुझाव दें</string>
<string name="other">अन्य</string> <string name="other">अन्य</string>
@ -18,7 +18,7 @@
<string name="login_password">पासवर्ड</string> <string name="login_password">पासवर्ड</string>
<string name="repo_edit_credentials">पासवर्ड बदले</string> <string name="repo_edit_credentials">पासवर्ड बदले</string>
<string name="repo_error_empty_username">खाली उपयोगकर्ता नाम, साख नहीं बदली</string> <string name="repo_error_empty_username">खाली उपयोगकर्ता नाम, साख नहीं बदली</string>
<string name="app_details">ऐप् विवरण</string> <string name="app_details">ऐप् विवरण</string>
<string name="no_such_app">कोई ऐसा एप्लिकेशन नहीं मिला |</string> <string name="no_such_app">कोई ऐसा एप्लिकेशन नहीं मिला |</string>
<string name="about_title">F-Droid के बारे में</string> <string name="about_title">F-Droid के बारे में</string>
<string name="about_version">संस्करण</string> <string name="about_version">संस्करण</string>
@ -37,9 +37,9 @@
<string name="repo_add_title">नया कोष जोड़े</string> <string name="repo_add_title">नया कोष जोड़े</string>
<string name="repo_add_add">जोड़े</string> <string name="repo_add_add">जोड़े</string>
<string name="links">संधियां</string> <string name="links">संधियां</string>
<string name="more">ज़्यादा (अधिक)</string> <string name="more">अधिक</string>
<string name="less">कम</string> <string name="less">कम</string>
<string name="back">पीछे</string> <string name="back">पीछे जाए</string>
<string name="cancel">रद्द करें</string> <string name="cancel">रद्द करें</string>
<string name="enable">सक्षम करे</string> <string name="enable">सक्षम करे</string>
<string name="add_key">कुंजी जोड़े</string> <string name="add_key">कुंजी जोड़े</string>
@ -47,10 +47,10 @@
<string name="theme_light">रोशनी</string> <string name="theme_light">रोशनी</string>
<string name="theme_dark">अंधेरा</string> <string name="theme_dark">अंधेरा</string>
<string name="crash_dialog_title">F-Droid क्रैश हो गया है</string> <string name="crash_dialog_title">F-Droid क्रैश हो गया है</string>
<string name="crash_dialog_text">एक अप्रत्याशित त्रुटि के कारण एप्लीकेशन बंद हो गयी है| क्या आप ईमेल पर डिटेलस भेज कर इस मुद्दे को सुलझाने में मदद करना चाहते हैं\?</string> <string name="crash_dialog_text">एक अप्रत्याशित त्रुटि के कारन एप्लीकेशन बंद हो गयी है| क्या ईमेल भेज कर इस समाधान को सुलझाने में मदद करना चाहते हैं\?</string>
<string name="crash_dialog_comment_prompt">आप अन्य जानकारी और टिप्पणियाँ यहाँ लिख सकते हैं:</string> <string name="crash_dialog_comment_prompt">आप अन्य जानकारी और टिप्पणियाँ यहाँ लिख सकते हैं:</string>
<string name="app_name">एफ-ड्रॉइड</string> <string name="app_name">एफ-ड्रॉइड</string>
<string name="installIncompatible">ऐप्लिकेशन आपके डिवाइस के लिए अनुकुल नहीं है, क्या आप इसे फिर भी स्थापित करना चाहते हैं\?</string> <string name="installIncompatible">सा ज्ञात होता है की ऐप्लिकेशन आपके डिवाइस के लिए अनुकुल नहीं है| क्या आप इसे फिर भी स्थापित करना चाहते हैं\?</string>
<string name="interval_1w">साप्ताहिक अपडेट के लिए जाँच करें</string> <string name="interval_1w">साप्ताहिक अपडेट के लिए जाँच करें</string>
<string name="interval_2w">हर 2 सप्ताह में अपडेट की जाँच करें</string> <string name="interval_2w">हर 2 सप्ताह में अपडेट की जाँच करें</string>
<string name="interval_4h">हर चार घंटे में अपडेट चेक करे</string> <string name="interval_4h">हर चार घंटे में अपडेट चेक करे</string>
@ -93,9 +93,9 @@
<string name="swap_view_available_networks">उपलब्ध नेटवर्क्स को खोलने के लिए स्पर्श करें</string> <string name="swap_view_available_networks">उपलब्ध नेटवर्क्स को खोलने के लिए स्पर्श करें</string>
<string name="swap_switch_to_wifi">वाई-फाई नेटवर्क बदलने के लिए स्पर्श करे</string> <string name="swap_switch_to_wifi">वाई-फाई नेटवर्क बदलने के लिए स्पर्श करे</string>
<string name="open_qr_code_scanner">QR स्कैनर खोले</string> <string name="open_qr_code_scanner">QR स्कैनर खोले</string>
<string name="swap_welcome">F-Droid मं आपका स्वागत है!</string> <string name="swap_welcome">F-Droid मं आपका स्वागत है!</string>
<string name="swap_confirm_connect">क्या आप अभी %1$s से ऐप्स लेना चाहते हैं\?</string> <string name="swap_confirm_connect">क्या आप अभी %1$s से ऐप्स लेना चाहते हैं\?</string>
<string name="swap_dont_show_again">इसे फिर से न दिखाएँ</string> <string name="swap_dont_show_again">इसे फिर से नहीं दिखाएँ</string>
<string name="swap_scan_or_type_url">एक व्यक्ति को ये कोड स्कैन करना होगा या यूआरएल को ब्राउज़र मैं टाइप करना होगा|</string> <string name="swap_scan_or_type_url">एक व्यक्ति को ये कोड स्कैन करना होगा या यूआरएल को ब्राउज़र मैं टाइप करना होगा|</string>
<string name="swap_choose_apps">ऐप्स चुने</string> <string name="swap_choose_apps">ऐप्स चुने</string>
<string name="swap_scan_qr">QR कोड स्कैन करें</string> <string name="swap_scan_qr">QR कोड स्कैन करें</string>
@ -114,17 +114,17 @@
<string name="choose_bt_send">Bluetooth से भेजने का तरीका चुने</string> <string name="choose_bt_send">Bluetooth से भेजने का तरीका चुने</string>
<string name="repo_add_url">रिपॉजिटरी पता</string> <string name="repo_add_url">रिपॉजिटरी पता</string>
<string name="repo_add_fingerprint">अंगुली की छाप(वैकल्पिक)</string> <string name="repo_add_fingerprint">अंगुली की छाप(वैकल्पिक)</string>
<string name="pref_language_default">सिस्टम पूर्वनिर्धारित</string> <string name="pref_language_default">सिस्टम पूर्वनिर्धारित विकल्प</string>
<string name="SignatureMismatch">नया संस्करण किसी दूसरी \'की\' से साईन किया हुआ है। इस नये संस्करण को स्थापित करने के लिए पुराने वाले को अस्थापित करें। कृपया फिर से कोशिश करें। (याद रखें कि अस्थापित करने के बाद ऐप्लिकेशन डेटा नष्ट हो जायेगा)</string> <string name="SignatureMismatch">नया संस्करण किसी दूसरी \'की\' से साईन किया हुआ है। इस नये संस्करण को स्थापित करने के लिए पुराने वाले को अस्थापित करें। कृपया फिर से कोशिश करें। (याद रखें कि अस्थापित करने के बाद ऐप्लिकेशन डेटा नष्ट हो जायेगा)</string>
<string name="keep_install_history">स्थापना इतिहास देखें</string> <string name="keep_install_history">स्थापना इतिहास देखें</string>
<string name="keep_install_history_summary">सभी स्थापनाओं और अस्थापनाओं के लॉग को F-Droid में रखें</string> <string name="keep_install_history_summary">सभी स्थापनाओं और अस्थापनाओं के लॉग को F-Droid में रखें</string>
<string name="menu_settings">सेटिंग</string> <string name="menu_settings">सेटिंग</string>
<string name="menu_search">खोज</string> <string name="menu_search">खोज</string>
<string name="menu_share">साझा करें</string> <string name="menu_share">साझा करें</string>
<string name="main_menu__latest_apps">नवीनतम</string> <string name="main_menu__latest_apps">नवीनतम</string>
<string name="main_menu__categories">श्रेणियां (कैटगरीज़)</string> <string name="main_menu__categories">श्रेणियां</string>
<string name="skip">छोड़ें</string> <string name="skip">छोड़ें</string>
<string name="pref_language">भाषा (लैन्गवेज)</string> <string name="pref_language">भाषा</string>
<string name="category_Games">गेम्स</string> <string name="category_Games">गेम्स</string>
<string name="category_Internet">इंटरनेट</string> <string name="category_Internet">इंटरनेट</string>
<string name="category_Money">धन</string> <string name="category_Money">धन</string>
@ -134,40 +134,40 @@
<string name="category_Writing">लेखन</string> <string name="category_Writing">लेखन</string>
<string name="notification_action_update">अद्यतन (अपडेट)</string> <string name="notification_action_update">अद्यतन (अपडेट)</string>
<string name="notification_action_cancel">रद्द करें</string> <string name="notification_action_cancel">रद्द करें</string>
<string name="app_list__name__downloading_in_progress">%1$s डाउनलोड किया जा रहा है</string> <string name="app_list__name__downloading_in_progress">%1$s को डाउनलोड किया जा रहा है</string>
<string name="warning_no_internet">अद्यतन नही हो पा रहा। क्या आप इंटरनेट से जुड़े हैं\?</string> <string name="warning_no_internet">अद्यतन नही हो सकता। क्या आप इंटरनेट से जुड़े हैं?</string>
<string name="unverified">असत्यापित</string> <string name="unverified">असत्यापित</string>
<string name="repo_last_update">अंतिम अद्यतन</string> <string name="repo_last_update">अंतिम अद्यतन</string>
<string name="wifi">वाई-फ़ाई</string> <string name="wifi">वाई-फ़ाई</string>
<string name="category_Sports_Health">खेल-कूद एवं स्वास्थ्य</string> <string name="category_Sports_Health">खेल-कूद एवं स्वास्थ्य</string>
<string name="notification_title_single_update_available">अद्यतन उपलब्ध है</string> <string name="notification_title_single_update_available">अद्यतन उपलब्ध</string>
<string name="notification_title_summary_install_error">इनस्टॉल असफल</string> <string name="notification_title_summary_install_error">इनस्टॉल असफल</string>
<string name="by_author_format">%s के द्वारा</string> <string name="by_author_format">%s के द्वारा</string>
<string name="hide_all_notifications">सभी अधिसूचनाएं छुपाएं</string> <string name="hide_all_notifications">सभी अधिसूचनाएं छुपाएं</string>
<string name="menu_manage">िपॉज़िटॉरिज़</string> <string name="menu_manage">ेपोसिटोरीए</string>
<string name="menu_add_repo">नई रिपॉजटरी</string> <string name="menu_add_repo">नई रिपॉजिटरी</string>
<string name="menu_launch">खोलें</string> <string name="menu_launch">खोलें</string>
<string name="menu_install">इंस्टॉल करें</string> <string name="menu_install">इंस्टॉल करें</string>
<string name="menu_uninstall">अनइंस्टल करें</string> <string name="menu_uninstall">अनइंस्टल करें</string>
<string name="menu_upgrade">अपडेट</string> <string name="menu_upgrade">अपडेट</string>
<string name="main_menu__swap_nearby">आस–पास</string> <string name="main_menu__swap_nearby">आस–पास</string>
<string name="preference_manage_installed_apps">इंस्टॉल किए गए ऐप्स को प्रबंधित करें</string> <string name="preference_manage_installed_apps">इंस्टॉल किए गए ऐप्स का प्रबंधन करें</string>
<string name="details_notinstalled">इनस्टॉल नहीं है</string> <string name="details_notinstalled">इनस्टॉल नहीं है</string>
<string name="next">आगे</string> <string name="next">आगे</string>
<string name="category_Connectivity">कनेक्टिविटी</string> <string name="category_Connectivity">संपर्क</string>
<string name="category_Development">विकास</string> <string name="category_Development">विकास</string>
<string name="category_Graphics">ग्राफिक्स</string> <string name="category_Graphics">ग्राफिक्स</string>
<string name="category_Multimedia">मल्टीमीडिया</string> <string name="category_Multimedia">मल्टीमीडिया</string>
<string name="category_Phone_SMS">फ़ोन तथा एस-एम-एस</string> <string name="category_Phone_SMS">फ़ोन तथा एस-एम-एस</string>
<string name="category_Science_Education">विज्ञान और शिक्षा</string> <string name="category_Science_Education">विज्ञान और शिक्षा</string>
<string name="category_Time">समय</string> <string name="category_Time">समय</string>
<string name="notification_action_install">इनस्टॉल करें</string> <string name="notification_action_install">इनस्टॉल करें</string>
<string name="app_list__name__successfully_installed">%1$s इन्स्टॉलड</string> <string name="app_list__name__successfully_installed">%1$s इनस्टॉल हो गया</string>
<string name="updates__tts__download_app">डाउनलोड</string> <string name="updates__tts__download_app">डाउनलोड</string>
<string name="antitracklist">यह ऐप आपकी गतिविधि पर नज़र रखता है और रिपोर्ट करता है</string> <string name="antitracklist">यह ऐप आपकी गतिविधि पर नज़र रखता है और रिपोर्ट करता है</string>
<string name="unsigned">अहस्ताक्षरित</string> <string name="unsigned">अहस्ताक्षरित</string>
<string name="repo_details">रिपॉजिटरी</string> <string name="repo_details">रिपॉजिटरी</string>
<string name="not_on_same_wifi">आपका डिवाइस उसी वाई-फाई पर नहीं है जो स्थानीय रेपो आपने जोड़ा है! इस नेटवर्क में शामिल होने का प्रयास करें %s</string> <string name="not_on_same_wifi">आपका डिवाइस आपके द्वारा जोडे गये स्थानीय रेपो के वाई-फाई पर नहीं है! इस नेटवर्क में शामिल होने का प्रयास करें: %s</string>
<string name="category_System">सिस्टम</string> <string name="category_System">सिस्टम</string>
<string name="prompt_to_send_crash_reports">दुर्घटनाओं की रिपोर्ट भेजने की अनुमति मांगें</string> <string name="prompt_to_send_crash_reports">दुर्घटनाओं की रिपोर्ट भेजने की अनुमति मांगें</string>
<string name="prompt_to_send_crash_reports_summary">क्रैश के बारे में डेटा इकट्ठा करें और उन्हें डेवलपर को भेजने के लिए पूछे</string> <string name="prompt_to_send_crash_reports_summary">क्रैश के बारे में डेटा इकट्ठा करें और उन्हें डेवलपर को भेजने के लिए पूछे</string>

View File

@ -488,5 +488,4 @@
<string name="app_details__no_versions__show_incompat_versions">Za prikaz nekompatibilnih verzija omogućite postavku \"%1$s\".</string> <string name="app_details__no_versions__show_incompat_versions">Za prikaz nekompatibilnih verzija omogućite postavku \"%1$s\".</string>
<string name="scan_removable_storage_summary">Traži repozitorije paketa na prijenosnoj pohrani kao što su SD kartice i USB pohrana</string> <string name="scan_removable_storage_summary">Traži repozitorije paketa na prijenosnoj pohrani kao što su SD kartice i USB pohrana</string>
<string name="allow_push_requests_summary">Metapodaci repozitorija mogu uključivati push zahtjeve za instaliranje ili deinstaliranje aplikacija</string> <string name="allow_push_requests_summary">Metapodaci repozitorija mogu uključivati push zahtjeve za instaliranje ili deinstaliranje aplikacija</string>
<string name="theme_follow_system">Slijedi sustav</string>
</resources> </resources>

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@ -102,7 +102,7 @@
<string name="status_download_unknown_size">Mengunduh <string name="status_download_unknown_size">Mengunduh
\n%2$s dari \n%2$s dari
\n%1$s</string> \n%1$s</string>
<string name="banner_updating_repositories">Memperbarui repostori</string> <string name="banner_updating_repositories">Memperbarui repositori</string>
<string name="status_processing_xml_percent">Memproses %2$s / %3$s (%4$d%%) dari %1$s</string> <string name="status_processing_xml_percent">Memproses %2$s / %3$s (%4$d%%) dari %1$s</string>
<string name="status_connecting_to_repo">Menghubungkan ke <string name="status_connecting_to_repo">Menghubungkan ke
\n%1$s</string> \n%1$s</string>
@ -501,6 +501,4 @@
<string name="theme_follow_system">Ikuti sistem</string> <string name="theme_follow_system">Ikuti sistem</string>
<string name="use_pure_black_dark_theme_summary">Direkomendasikan hanya untuk layar OLED.</string> <string name="use_pure_black_dark_theme_summary">Direkomendasikan hanya untuk layar OLED.</string>
<string name="use_pure_black_dark_theme">Gunakan latar belakang hitam murni dalam tema gelap</string> <string name="use_pure_black_dark_theme">Gunakan latar belakang hitam murni dalam tema gelap</string>
<string name="banner_no_data_or_wifi">Data atau WiFi tdkaktif</string>
<string name="banner_no_internet">Tnp Intnet</string>
</resources> </resources>

View File

@ -331,7 +331,7 @@
<string name="installed_apps__activity_title">App Installate</string> <string name="installed_apps__activity_title">App Installate</string>
<string name="installed_app__updates_ignored">Aggiornamenti ignorati</string> <string name="installed_app__updates_ignored">Aggiornamenti ignorati</string>
<string name="installed_app__updates_ignored_for_suggested_version">Aggiornamenti ignorati per Versione %1$s</string> <string name="installed_app__updates_ignored_for_suggested_version">Aggiornamenti ignorati per Versione %1$s</string>
<string name="update_all">Aggiorna tutte</string> <string name="update_all">Aggiorna tutti</string>
<string name="updates__hide_updateable_apps">Nascondi applicazioni</string> <string name="updates__hide_updateable_apps">Nascondi applicazioni</string>
<string name="updates__show_updateable_apps">Mostra applicazioni</string> <string name="updates__show_updateable_apps">Mostra applicazioni</string>
<plurals name="updates__download_updates_for_apps"> <plurals name="updates__download_updates_for_apps">
@ -524,6 +524,4 @@
<string name="use_pure_black_dark_theme">Utilizzare lo sfondo nero puro nel tema scuro</string> <string name="use_pure_black_dark_theme">Utilizzare lo sfondo nero puro nel tema scuro</string>
<string name="use_pure_black_dark_theme_summary">Raccomandato solo per schermi OLED.</string> <string name="use_pure_black_dark_theme_summary">Raccomandato solo per schermi OLED.</string>
<string name="theme_follow_system">Segui il sistema</string> <string name="theme_follow_system">Segui il sistema</string>
<string name="banner_no_data_or_wifi">Nessun dato o Wi-Fi abilitato</string>
<string name="banner_no_internet">Nessuna connessione</string>
</resources> </resources>

View File

@ -486,5 +486,4 @@
<string name="notification_channel_swaps_title">入れ替え</string> <string name="notification_channel_swaps_title">入れ替え</string>
<string name="notification_channel_installs_description">アプリのインストール通知を表示します。</string> <string name="notification_channel_installs_description">アプリのインストール通知を表示します。</string>
<string name="notification_channel_installs_title">インストール</string> <string name="notification_channel_installs_title">インストール</string>
<string name="send_to_fdroid_metrics">使用データを送信</string>
</resources> </resources>

View File

@ -434,7 +434,7 @@
<string name="send_version_and_uuid_summary">이 앱의 버전과 임의의, 고유한 ID를 포함하며, 다음에 앱을 다시 시작하면 영향을 받습니다.</string> <string name="send_version_and_uuid_summary">이 앱의 버전과 임의의, 고유한 ID를 포함하며, 다음에 앱을 다시 시작하면 영향을 받습니다.</string>
<string name="share_repository">저장소 공유</string> <string name="share_repository">저장소 공유</string>
<string name="send_install_history">설치 내역 보내기</string> <string name="send_install_history">설치 내역 보내기</string>
<string name="send_history_csv">%s 설치 내역을 CSV 파일로</string> <string name="send_history_csv">설치 내역을 CSV 파일로 %s</string>
<string name="allow_push_requests">저장소에 앱을 설치/제거할 수 있도록 하기</string> <string name="allow_push_requests">저장소에 앱을 설치/제거할 수 있도록 하기</string>
<string name="allow_push_requests_summary">저장소 메타데이터에는 설치 또는 제거를 위한 푸시 요청을 포함할 수 있습니다</string> <string name="allow_push_requests_summary">저장소 메타데이터에는 설치 또는 제거를 위한 푸시 요청을 포함할 수 있습니다</string>
<string name="updates_disabled_by_settings">모든 업데이트가 데이터/WiFi 설정에 의해 비활성화됨</string> <string name="updates_disabled_by_settings">모든 업데이트가 데이터/WiFi 설정에 의해 비활성화됨</string>
@ -486,18 +486,4 @@
<string name="notification_channel_installs_description">애플리케이션 설치 과정을 알림으로 표시합니다.</string> <string name="notification_channel_installs_description">애플리케이션 설치 과정을 알림으로 표시합니다.</string>
<string name="notification_channel_installs_title">설치</string> <string name="notification_channel_installs_title">설치</string>
<string name="menu_opencollective">OpenCollective</string> <string name="menu_opencollective">OpenCollective</string>
<string name="theme_follow_system">시스템 따르기</string>
<string name="banner_no_data_or_wifi">활성화된 데이터나 WiFi 없음</string>
<string name="banner_no_internet">인터넷 없음</string>
<string name="menu_show_install_history">설치 내역 보기</string>
<string name="use_pure_black_dark_theme_summary">OLED 화면에만 권장됩니다.</string>
<string name="use_pure_black_dark_theme">어두운 테마에서 순수한 검은 배경 사용</string>
<string name="menu_show_fdroid_metrics_report">메트릭 데이터 보이기</string>
<string name="toast_metrics_in_install_history">%s 메트릭 보고서는 설치 내역 뷰어에서 볼 수 있습니다</string>
<string name="send_to_fdroid_metrics_summary">익명으로 데이터를 매주 F-Droid 메트릭으로 보냅니다 (설치 내역 유지 필요)</string>
<string name="send_to_fdroid_metrics">사용 데이터 보내기</string>
<string name="fdroid_metrics_report">%s 메트릭 보고서</string>
<string name="send_fdroid_metrics_report">%s 메트릭 보고서 보내기</string>
<string name="install_history_and_metrics">설치 내역 및 메트릭</string>
<string name="send_fdroid_metrics_json">%s 메트릭 보고서를 JSON 파일로</string>
</resources> </resources>

View File

@ -71,7 +71,7 @@
<string name="local_repo_running">Sirkulering av programmer kan begynne</string> <string name="local_repo_running">Sirkulering av programmer kan begynne</string>
<string name="touch_to_configure_local_repo">Trykk for å se detaljer og for å tillate andre å sirkulere de programmene du har.</string> <string name="touch_to_configure_local_repo">Trykk for å se detaljer og for å tillate andre å sirkulere de programmene du har.</string>
<string name="deleting_repo">Sletter gjeldende pakkebrønn…</string> <string name="deleting_repo">Sletter gjeldende pakkebrønn…</string>
<string name="adding_apks_format">Legger %s til pakkebrønn…</string> <string name="adding_apks_format">Legger til %s til pakkebrønn…</string>
<string name="writing_index_jar">Skriver signert indekseringsfil (index.jar)…</string> <string name="writing_index_jar">Skriver signert indekseringsfil (index.jar)…</string>
<string name="linking_apks">Lenker APK-er inn i pakkebrønn…</string> <string name="linking_apks">Lenker APK-er inn i pakkebrønn…</string>
<string name="copying_icons">Kopierer program-miniatyrbilder til pakkebrønnen…</string> <string name="copying_icons">Kopierer program-miniatyrbilder til pakkebrønnen…</string>
@ -152,7 +152,7 @@
<string name="menu_bitcoin">Bitcoin</string> <string name="menu_bitcoin">Bitcoin</string>
<string name="menu_litecoin">Litecoin</string> <string name="menu_litecoin">Litecoin</string>
<string name="menu_flattr">Flattr</string> <string name="menu_flattr">Flattr</string>
<string name="banner_updating_repositories">Oppdaterer arkiver</string> <string name="banner_updating_repositories">Oppdaterer pakkebrønner</string>
<string name="status_processing_xml_percent">Behandler %2$s / %3$s (%4$d%%) fra %1$s</string> <string name="status_processing_xml_percent">Behandler %2$s / %3$s (%4$d%%) fra %1$s</string>
<string name="repo_details">Pakkebrønn</string> <string name="repo_details">Pakkebrønn</string>
<string name="repo_url">Adresse</string> <string name="repo_url">Adresse</string>
@ -519,9 +519,4 @@
<string name="install_history_and_metrics">Installasjonshistorikk og bruksdata</string> <string name="install_history_and_metrics">Installasjonshistorikk og bruksdata</string>
<string name="send_fdroid_metrics_json">%s bruksmåledata rapport som JSON-fil</string> <string name="send_fdroid_metrics_json">%s bruksmåledata rapport som JSON-fil</string>
<string name="send_fdroid_metrics_report">Send %s bruksmåledata</string> <string name="send_fdroid_metrics_report">Send %s bruksmåledata</string>
<string name="theme_follow_system">Følg systemet</string>
<string name="use_pure_black_dark_theme_summary">Anbefales bare for OLED-skjermer.</string>
<string name="use_pure_black_dark_theme">Bruk ren svart bakgrunn i mørkt tema</string>
<string name="banner_no_data_or_wifi">Ingen data eller WiFi aktivert</string>
<string name="banner_no_internet">Ingen Internett</string>
</resources> </resources>

View File

@ -47,8 +47,6 @@
<item name="backButtonDrawable">@drawable/ic_back</item> <item name="backButtonDrawable">@drawable/ic_back</item>
<item name="clearButtonDrawable">@drawable/ic_close</item> <item name="clearButtonDrawable">@drawable/ic_close</item>
<item name="appDetailsAntiFeatureIconColor">#ffffff</item> <item name="appDetailsAntiFeatureIconColor">#ffffff</item>
<item name="screenshotPlaceholderIconColor">#424242</item>
</style> </style>
<style name="Theme.App.Black" parent="Theme.App"> <style name="Theme.App.Black" parent="Theme.App">

View File

@ -514,6 +514,4 @@
<string name="theme_follow_system">Volg systeem</string> <string name="theme_follow_system">Volg systeem</string>
<string name="use_pure_black_dark_theme_summary">Alleen aanbevolen voor OLED-schermen.</string> <string name="use_pure_black_dark_theme_summary">Alleen aanbevolen voor OLED-schermen.</string>
<string name="use_pure_black_dark_theme">Gebruik puur zwarte achtergrond bij donker thema</string> <string name="use_pure_black_dark_theme">Gebruik puur zwarte achtergrond bij donker thema</string>
<string name="banner_no_data_or_wifi">Data of Wi-Fi niet ingeschakeld</string>
<string name="banner_no_internet">Geen internet</string>
</resources> </resources>

View File

@ -506,9 +506,4 @@
<string name="install_history_and_metrics">Installeringslogg og bruksdata</string> <string name="install_history_and_metrics">Installeringslogg og bruksdata</string>
<string name="send_fdroid_metrics_json">Bruksdata for %s som JSON-fil</string> <string name="send_fdroid_metrics_json">Bruksdata for %s som JSON-fil</string>
<string name="send_fdroid_metrics_report">Send bruksdatarapport for %s</string> <string name="send_fdroid_metrics_report">Send bruksdatarapport for %s</string>
<string name="theme_follow_system">Følg systeminnstillingane</string>
<string name="use_pure_black_dark_theme_summary">Berre tilrådd for OLED-skjermar.</string>
<string name="use_pure_black_dark_theme">Bruk heilt svart bakgrunn i mørkt tema</string>
<string name="banner_no_data_or_wifi">Ikkje mobildata/Wi-Fi</string>
<string name="banner_no_internet">Manglar Internett-tilgang</string>
</resources> </resources>

View File

@ -132,7 +132,7 @@
<string name="antitracklist">Ta aplikacja śledzi i raportuje Twoją aktywność</string> <string name="antitracklist">Ta aplikacja śledzi i raportuje Twoją aktywność</string>
<string name="show_incompat_versions_on">Pokazuj aplikacje, które są niekompatybilne z tym urządzeniem</string> <string name="show_incompat_versions_on">Pokazuj aplikacje, które są niekompatybilne z tym urządzeniem</string>
<string name="status_download">Pobieranie\n%2$s / %3$s (%4$d%%) z\n%1$s</string> <string name="status_download">Pobieranie\n%2$s / %3$s (%4$d%%) z\n%1$s</string>
<string name="banner_updating_repositories">Aktualizacja repozytoriów</string> <string name="banner_updating_repositories">Aktualizowanie repozytoriów</string>
<string name="status_processing_xml_percent">Przetwarzanie %2$s / %3$s (%4$d%%) z %1$s</string> <string name="status_processing_xml_percent">Przetwarzanie %2$s / %3$s (%4$d%%) z %1$s</string>
<string name="no_permissions">Brak uprawnień</string> <string name="no_permissions">Brak uprawnień</string>
<string name="unsigned">Brak podpisu</string> <string name="unsigned">Brak podpisu</string>
@ -543,6 +543,4 @@
<string name="theme_follow_system">Systemowy</string> <string name="theme_follow_system">Systemowy</string>
<string name="use_pure_black_dark_theme_summary">Zalecane jedynie dla ekranów OLED.</string> <string name="use_pure_black_dark_theme_summary">Zalecane jedynie dla ekranów OLED.</string>
<string name="use_pure_black_dark_theme">Użyj czarnego tła w ciemnym motywie</string> <string name="use_pure_black_dark_theme">Użyj czarnego tła w ciemnym motywie</string>
<string name="banner_no_data_or_wifi">Brak danych lub WiFi włączone</string>
<string name="banner_no_internet">Brak Internetu</string>
</resources> </resources>

View File

@ -152,7 +152,7 @@
<string name="bad_fingerprint">Falha na fingerprint</string> <string name="bad_fingerprint">Falha na fingerprint</string>
<string name="invalid_url">Esta não é uma URL válida.</string> <string name="invalid_url">Esta não é uma URL válida.</string>
<string name="menu_changelog">Changelog</string> <string name="menu_changelog">Changelog</string>
<string name="banner_updating_repositories">Atualizando os repositórios</string> <string name="banner_updating_repositories">Atualizando repositórios</string>
<string name="status_processing_xml_percent">Processando %2$s / %3$s (%4$d%%) de %1$s</string> <string name="status_processing_xml_percent">Processando %2$s / %3$s (%4$d%%) de %1$s</string>
<string name="pref_language">Idioma</string> <string name="pref_language">Idioma</string>
<string name="pref_language_default">Padrão do sistema</string> <string name="pref_language_default">Padrão do sistema</string>
@ -530,6 +530,4 @@
<string name="theme_follow_system">O mesmo do sistema</string> <string name="theme_follow_system">O mesmo do sistema</string>
<string name="use_pure_black_dark_theme_summary">Recomendado apenas para telas OLED.</string> <string name="use_pure_black_dark_theme_summary">Recomendado apenas para telas OLED.</string>
<string name="use_pure_black_dark_theme">Use um fundo preto no tema escuro</string> <string name="use_pure_black_dark_theme">Use um fundo preto no tema escuro</string>
<string name="banner_no_data_or_wifi">Dados móveis ou WiFi indisponíveis</string>
<string name="banner_no_internet">Sem Internet</string>
</resources> </resources>

View File

@ -73,7 +73,7 @@
<string name="antinonfreenetlist">Esta aplicação promove serviços de rede não livres</string> <string name="antinonfreenetlist">Esta aplicação promove serviços de rede não livres</string>
<string name="antinonfreedeplist">Esta aplicação depende de aplicações não livres</string> <string name="antinonfreedeplist">Esta aplicação depende de aplicações não livres</string>
<string name="antiupstreamnonfreelist">O código-fonte não é totalmente livre</string> <string name="antiupstreamnonfreelist">O código-fonte não é totalmente livre</string>
<string name="display">Visualização</string> <string name="display">Exibição</string>
<string name="expert">Modo avançado</string> <string name="expert">Modo avançado</string>
<string name="expert_on">Mostrar informações extra e ativar mais definições</string> <string name="expert_on">Mostrar informações extra e ativar mais definições</string>
<string name="search_hint">Pesquisar aplicações</string> <string name="search_hint">Pesquisar aplicações</string>
@ -305,10 +305,10 @@
<string name="warning_no_internet">Não é possível atualizar. Está ligado à Internet?</string> <string name="warning_no_internet">Não é possível atualizar. Está ligado à Internet?</string>
<plurals name="button_view_all_apps_in_category"> <plurals name="button_view_all_apps_in_category">
<item quantity="one">Ver (%d)</item> <item quantity="one">Ver (%d)</item>
<item quantity="other">Ver todas (%d)</item> <item quantity="other">Ver (%d)</item>
</plurals> </plurals>
<string name="nearby_splash__download_apps_from_people_nearby">Sem Internet? Obtenha as aplicações através de pessoas perto de si!</string> <string name="nearby_splash__download_apps_from_people_nearby">Sem Internet? Obtenha as aplicações através de pessoas perto de si!</string>
<string name="nearby_splash__find_people_button">Encontrar pessoas por perto</string> <string name="nearby_splash__find_people_button">Procurar pessoas por perto</string>
<string name="nearby_splash__both_parties_need_fdroid">Ambas as partes necessitam de %1$s.</string> <string name="nearby_splash__both_parties_need_fdroid">Ambas as partes necessitam de %1$s.</string>
<string name="notification_title_single_update_available">Atualização disponível</string> <string name="notification_title_single_update_available">Atualização disponível</string>
<string name="notification_title_single_ready_to_install">Pronta para instalação</string> <string name="notification_title_single_ready_to_install">Pronta para instalação</string>
@ -426,8 +426,8 @@
<string name="repo_official_mirrors">Servidores espelho oficiais</string> <string name="repo_official_mirrors">Servidores espelho oficiais</string>
<string name="repo_user_mirrors">Servidores espelho do utilizador</string> <string name="repo_user_mirrors">Servidores espelho do utilizador</string>
<string name="warning_scaning_qr_code">Parece que a sua câmara não possui foco automático. Poderá ser difícil digitalizar o código.</string> <string name="warning_scaning_qr_code">Parece que a sua câmara não possui foco automático. Poderá ser difícil digitalizar o código.</string>
<string name="prompt_to_send_crash_reports">Pedir para enviar relatórios de craches</string> <string name="prompt_to_send_crash_reports">Pedir para enviar relatórios de erros</string>
<string name="prompt_to_send_crash_reports_summary">Recolher dados sobre os craches e pedir para os enviar ao programador</string> <string name="prompt_to_send_crash_reports_summary">Recolher dados sobre os erros e pedir para os enviar ao programador</string>
<string name="hide_all_notifications">Ocultar todas as notificações</string> <string name="hide_all_notifications">Ocultar todas as notificações</string>
<string name="send_install_history">Enviar histórico de instalações</string> <string name="send_install_history">Enviar histórico de instalações</string>
<string name="install_history">Histórico de instalações</string> <string name="install_history">Histórico de instalações</string>
@ -449,7 +449,7 @@
<string name="swap_toast_invalid_url">URL inválido para trocas: %1$s</string> <string name="swap_toast_invalid_url">URL inválido para trocas: %1$s</string>
<string name="swap_toast_hotspot_enabled">Ponto de acesso Wi-Fi ativado</string> <string name="swap_toast_hotspot_enabled">Ponto de acesso Wi-Fi ativado</string>
<string name="swap_toast_could_not_enable_hotspot">Não foi possível ativar o ponto de acesso Wi-Fi!</string> <string name="swap_toast_could_not_enable_hotspot">Não foi possível ativar o ponto de acesso Wi-Fi!</string>
<string name="send_history_csv">Histórico de instalações de %s como ficheiro CSV</string> <string name="send_history_csv">Histórico de instalações de %s em ficheiro CSV</string>
<string name="send_version_and_uuid_summary">Inclui a versão da aplicação e uma ID aleatória única ao descarregar. Surte efeito após reiniciar a aplicação.</string> <string name="send_version_and_uuid_summary">Inclui a versão da aplicação e uma ID aleatória única ao descarregar. Surte efeito após reiniciar a aplicação.</string>
<string name="allow_push_requests_summary">Os meta-dados do repositório podem incluir pedidos \'push\' para instalar ou desinstalar aplicações</string> <string name="allow_push_requests_summary">Os meta-dados do repositório podem incluir pedidos \'push\' para instalar ou desinstalar aplicações</string>
<string name="send_installed_apps">Partilhar aplicações instaladas</string> <string name="send_installed_apps">Partilhar aplicações instaladas</string>
@ -508,9 +508,4 @@
<string name="install_history_and_metrics">Histórico de instalações e métrica</string> <string name="install_history_and_metrics">Histórico de instalações e métrica</string>
<string name="send_fdroid_metrics_json">Relatório de métrica %s como ficheiro JSON</string> <string name="send_fdroid_metrics_json">Relatório de métrica %s como ficheiro JSON</string>
<string name="send_fdroid_metrics_report">Enviar relatório de métrica %s</string> <string name="send_fdroid_metrics_report">Enviar relatório de métrica %s</string>
<string name="theme_follow_system">Usar o sistema</string>
<string name="use_pure_black_dark_theme_summary">Recomendado apenas para ecrãs OLED.</string>
<string name="use_pure_black_dark_theme">Usar fundo preto puro no tema escuro</string>
<string name="banner_no_data_or_wifi">Dados móveis/WiFi desativados</string>
<string name="banner_no_internet">Sem Internet</string>
</resources> </resources>

View File

@ -58,7 +58,7 @@
<string name="unverified">Não verificada</string> <string name="unverified">Não verificada</string>
<string name="repo_details">Repositório</string> <string name="repo_details">Repositório</string>
<string name="repo_last_update">Última atualização</string> <string name="repo_last_update">Última atualização</string>
<string name="not_on_same_wifi">O seu aparelho não está ligado à rede Wi-Fi do repositório adicionado! Tente entrar nesta rede: %s</string> <string name="not_on_same_wifi">O seu dispositivo não está ligado à rede Wi-Fi do repositório adicionado! Tente entrar nesta rede: %s</string>
<string name="wifi">Wi-Fi</string> <string name="wifi">Wi-Fi</string>
<string name="category_Sports_Health">Desporto e saúde</string> <string name="category_Sports_Health">Desporto e saúde</string>
<string name="category_System">Sistema</string> <string name="category_System">Sistema</string>
@ -68,7 +68,7 @@
<string name="notification_title_single_update_available">Atualização disponível</string> <string name="notification_title_single_update_available">Atualização disponível</string>
<string name="notification_title_summary_install_error">Falha ao instalar</string> <string name="notification_title_summary_install_error">Falha ao instalar</string>
<string name="SignatureMismatch">A nova versão está assinada com uma chave diferente da antiga. Para instalar a nova versão, tem que desinstalar a antiga. Remova a app e tente novamente. (Tenha em atenção que irá apagar todos os dados guardados pela app)</string> <string name="SignatureMismatch">A nova versão está assinada com uma chave diferente da antiga. Para instalar a nova versão, tem que desinstalar a antiga. Remova a app e tente novamente. (Tenha em atenção que irá apagar todos os dados guardados pela app)</string>
<string name="installIncompatible">A aplicação não é compatível com o seu aparelho. Deseja tentar a instalação\?</string> <string name="installIncompatible">A aplicação não é compatível com o seu dispositivo. Deseja tentar a instalação\?</string>
<string name="version">Versão</string> <string name="version">Versão</string>
<string name="by_author_format">de %s</string> <string name="by_author_format">de %s</string>
<string name="delete">Eliminar</string> <string name="delete">Eliminar</string>
@ -124,7 +124,7 @@
<string name="app_details__incompatible_mismatched_signature">Assinatura diferente da versão instalada</string> <string name="app_details__incompatible_mismatched_signature">Assinatura diferente da versão instalada</string>
<string name="app_details__no_versions__show_incompat_versions">Para ainda assim mostrar versões incompatíveis, ative a opção \"%1$s\".</string> <string name="app_details__no_versions__show_incompat_versions">Para ainda assim mostrar versões incompatíveis, ative a opção \"%1$s\".</string>
<string name="app_details__no_versions__no_compatible_signatures">Não existem versões com uma assinatura compatível</string> <string name="app_details__no_versions__no_compatible_signatures">Não existem versões com uma assinatura compatível</string>
<string name="app_details__no_versions__none_compatible_with_device">Não existem versões compatíveis com o aparelho</string> <string name="app_details__no_versions__none_compatible_with_device">Não existem versões compatíveis com o dispositivo</string>
<string name="app_details__no_versions__explain_incompatible_signatures">A versão instalada não é compatível com as versões disponíveis. Desinstalar a app permite-o ver e instalar as versões compatíveis. Normalmente, isto ocorre se instalar apps através da Google Play ou de outras fontes, caso tenham sido assinadas com um certificado distinto.</string> <string name="app_details__no_versions__explain_incompatible_signatures">A versão instalada não é compatível com as versões disponíveis. Desinstalar a app permite-o ver e instalar as versões compatíveis. Normalmente, isto ocorre se instalar apps através da Google Play ou de outras fontes, caso tenham sido assinadas com um certificado distinto.</string>
<string name="about_version">Versão</string> <string name="about_version">Versão</string>
<string name="about_site">Site</string> <string name="about_site">Site</string>
@ -232,11 +232,11 @@
<string name="search_hint">Pesquisar aplicações</string> <string name="search_hint">Pesquisar aplicações</string>
<string name="appcompatibility">Compatibilidade de aplicações</string> <string name="appcompatibility">Compatibilidade de aplicações</string>
<string name="show_incompat_versions">Incluir versões incompatíveis</string> <string name="show_incompat_versions">Incluir versões incompatíveis</string>
<string name="show_incompat_versions_on">Mostrar versões incompatíveis com o seu aparelho</string> <string name="show_incompat_versions_on">Mostrar versões incompatíveis com o seu dispositivo</string>
<string name="show_anti_feature_apps">Incluir aplicações com funcionalidades indesejadas</string> <string name="show_anti_feature_apps">Incluir aplicações com funcionalidades indesejadas</string>
<string name="show_anti_feature_apps_on">Mostrar aplicações que necessitem de funcionalidades indesejadas</string> <string name="show_anti_feature_apps_on">Mostrar aplicações que necessitem de funcionalidades indesejadas</string>
<string name="force_touch_apps">Incluir aplicações de ecrã tátil</string> <string name="force_touch_apps">Incluir aplicações de ecrã tátil</string>
<string name="force_touch_apps_on">Mostrar apps que necessitem de ecrã tátil mesmo que o aparelho não o permita</string> <string name="force_touch_apps_on">Mostrar aplicações que necessitem de ecrã tátil mesmo que o dispositivo não o permita</string>
<string name="local_repo">Repositório local</string> <string name="local_repo">Repositório local</string>
<string name="local_repo_running">F-Droid está pronto para a troca</string> <string name="local_repo_running">F-Droid está pronto para a troca</string>
<string name="touch_to_configure_local_repo">Toque para ver os detalhes e permitir a troca de aplicações.</string> <string name="touch_to_configure_local_repo">Toque para ver os detalhes e permitir a troca de aplicações.</string>
@ -323,7 +323,7 @@
</plurals> </plurals>
<string name="empty_installed_app_list">Não existem aplicações instaladas. <string name="empty_installed_app_list">Não existem aplicações instaladas.
\n \n
\nExistem aplicações no seu aparelho que não estão disponíveis em F-Droid. Talvez tenha que atualizar os seus repositórios ou então as suas aplicações não existem nos repositórios adicionados.</string> \nExistem aplicações no seu dispositivo que não estão disponíveis em F-Droid. Talvez tenha que atualizar os seus repositórios ou então as suas aplicações não existem nos repositórios adicionados.</string>
<string name="empty_can_update_app_list">Parabéns! <string name="empty_can_update_app_list">Parabéns!
\nAs suas aplicações estão atualizadas.</string> \nAs suas aplicações estão atualizadas.</string>
<string name="empty_search_available_app_list">Não há aplicações correspondentes.</string> <string name="empty_search_available_app_list">Não há aplicações correspondentes.</string>
@ -336,7 +336,7 @@
<string name="nearby_splash__read_external_storage">Pesquisar repositórios e espelhos no cartão SD.</string> <string name="nearby_splash__read_external_storage">Pesquisar repositórios e espelhos no cartão SD.</string>
<string name="nearby_splash__request_permission">Experimente</string> <string name="nearby_splash__request_permission">Experimente</string>
<string name="swap_nfc_title">Toque para trocar</string> <string name="swap_nfc_title">Toque para trocar</string>
<string name="swap_nfc_description">Se a outra pessoa tiver F-Droid instalada e NFC ativo, aproximem os vossos aparelhos.</string> <string name="swap_nfc_description">Se a outra pessoa tiver F-Droid instalada e NFC ativo, aproximem os vossos dispositivos.</string>
<string name="swap_join_same_wifi">Junte-se à mesma rede Wi-Fi da outra pessoa</string> <string name="swap_join_same_wifi">Junte-se à mesma rede Wi-Fi da outra pessoa</string>
<string name="swap_join_same_wifi_desc">Para trocar através de Wi-Fi, certifique-se que estão ambos na mesma rede. Se não estiverem na mesma rede, um de vós pode criar um ponto de acesso (hotspot) Wi-Fi.</string> <string name="swap_join_same_wifi_desc">Para trocar através de Wi-Fi, certifique-se que estão ambos na mesma rede. Se não estiverem na mesma rede, um de vós pode criar um ponto de acesso (hotspot) Wi-Fi.</string>
<string name="swap_join_this_hotspot">Ajude a outra pessoa a entrar no seu ponto de acesso</string> <string name="swap_join_this_hotspot">Ajude a outra pessoa a entrar no seu ponto de acesso</string>
@ -362,7 +362,7 @@
<string name="swap_setting_up_wifi">A configurar Wi-Fi…</string> <string name="swap_setting_up_wifi">A configurar Wi-Fi…</string>
<string name="swap_stopping_wifi">A parar Wi-Fi…</string> <string name="swap_stopping_wifi">A parar Wi-Fi…</string>
<string name="swap_not_visible_wifi">Não visível por Wi-Fi</string> <string name="swap_not_visible_wifi">Não visível por Wi-Fi</string>
<string name="swap_wifi_device_name">Nome do aparelho</string> <string name="swap_wifi_device_name">Nome do dispositivo</string>
<string name="swap_cant_find_peers">Não encontra o que procura\?</string> <string name="swap_cant_find_peers">Não encontra o que procura\?</string>
<string name="swap_no_peers_nearby">Não foram encontradas pessoas na sua vizinhança.</string> <string name="swap_no_peers_nearby">Não foram encontradas pessoas na sua vizinhança.</string>
<string name="swap_connecting">A ligar</string> <string name="swap_connecting">A ligar</string>
@ -372,7 +372,7 @@
<string name="loading">A carregar…</string> <string name="loading">A carregar…</string>
<string name="swap_connection_misc_error">Ocorreu um erro ao estabelecer a ligação e não será possível a troca!</string> <string name="swap_connection_misc_error">Ocorreu um erro ao estabelecer a ligação e não será possível a troca!</string>
<string name="not_visible_nearby">Proximidade não ativada</string> <string name="not_visible_nearby">Proximidade não ativada</string>
<string name="not_visible_nearby_description">Antes de trocar com aparelho próximos, torne o seu visível.</string> <string name="not_visible_nearby_description">Antes de trocar com dispositivos próximos, torne o seu visível.</string>
<string name="swap_toast_using_path">A utilizar %1$s</string> <string name="swap_toast_using_path">A utilizar %1$s</string>
<string name="swap_toast_not_removable_storage">A escolha não coincide com um armazenamento amovível, tente novamente!</string> <string name="swap_toast_not_removable_storage">A escolha não coincide com um armazenamento amovível, tente novamente!</string>
<string name="swap_toast_find_removeable_storage">Escolha o seu cartão SD ou USB</string> <string name="swap_toast_find_removeable_storage">Escolha o seu cartão SD ou USB</string>
@ -509,6 +509,4 @@
<string name="theme_follow_system">Usar o sistema</string> <string name="theme_follow_system">Usar o sistema</string>
<string name="use_pure_black_dark_theme_summary">Recomendado apenas para ecrãs OLED.</string> <string name="use_pure_black_dark_theme_summary">Recomendado apenas para ecrãs OLED.</string>
<string name="use_pure_black_dark_theme">Usar fundo preto puro no tema escuro</string> <string name="use_pure_black_dark_theme">Usar fundo preto puro no tema escuro</string>
<string name="banner_no_data_or_wifi">Dados móveis/WiFi desativados</string>
<string name="banner_no_internet">Sem Internet</string>
</resources> </resources>

View File

@ -148,7 +148,7 @@
<string name="status_download">Descărcare <string name="status_download">Descărcare
\n%2$s / %3$s (%4$d%%) din \n%2$s / %3$s (%4$d%%) din
\n%1$s</string> \n%1$s</string>
<string name="banner_updating_repositories">Actualizare depozite</string> <string name="banner_updating_repositories">Actualizare depozit</string>
<string name="status_connecting_to_repo">Conectare la\n%1$s</string> <string name="status_connecting_to_repo">Conectare la\n%1$s</string>
<string name="global_error_updating_repos">Eroare la actualizare: %s</string> <string name="global_error_updating_repos">Eroare la actualizare: %s</string>
<string name="permissions">Permisiuni</string> <string name="permissions">Permisiuni</string>
@ -520,6 +520,4 @@
<string name="theme_follow_system">Folosește tema sistemului</string> <string name="theme_follow_system">Folosește tema sistemului</string>
<string name="use_pure_black_dark_theme_summary">Recomandat numai pentru ecrane OLED.</string> <string name="use_pure_black_dark_theme_summary">Recomandat numai pentru ecrane OLED.</string>
<string name="use_pure_black_dark_theme">Utilizați un fundal negru pur în tema întunecată</string> <string name="use_pure_black_dark_theme">Utilizați un fundal negru pur în tema întunecată</string>
<string name="banner_no_data_or_wifi">Nu sunt activate date mobile sau Wi-Fi</string>
<string name="banner_no_internet">Fără internet</string>
</resources> </resources>

View File

@ -530,6 +530,4 @@
<string name="theme_follow_system">Как в системе</string> <string name="theme_follow_system">Как в системе</string>
<string name="use_pure_black_dark_theme_summary">Рекомендуется только для экранов OLED.</string> <string name="use_pure_black_dark_theme_summary">Рекомендуется только для экранов OLED.</string>
<string name="use_pure_black_dark_theme">Использовать абсолютно черный фон в темной теме</string> <string name="use_pure_black_dark_theme">Использовать абсолютно черный фон в темной теме</string>
<string name="banner_no_data_or_wifi">Передача данных или WiFi отключены</string>
<string name="banner_no_internet">Нет интернета</string>
</resources> </resources>

View File

@ -537,6 +537,4 @@
<string name="theme_follow_system">Sighi su sistema</string> <string name="theme_follow_system">Sighi su sistema</string>
<string name="use_pure_black_dark_theme_summary">Racumandadu pro sos ischermos OLED.</string> <string name="use_pure_black_dark_theme_summary">Racumandadu pro sos ischermos OLED.</string>
<string name="use_pure_black_dark_theme">Imprea un\'isfundu nieddu de su totu in su tema iscuru</string> <string name="use_pure_black_dark_theme">Imprea un\'isfundu nieddu de su totu in su tema iscuru</string>
<string name="banner_no_data_or_wifi">Peruna connessione mòbile o Wifi ativa</string>
<string name="banner_no_internet">Chene ìnternet</string>
</resources> </resources>

View File

@ -75,7 +75,7 @@
<string name="app_details">Podrobnosti aplikacije</string> <string name="app_details">Podrobnosti aplikacije</string>
<string name="about_title">Več o F-Droid</string> <string name="about_title">Več o F-Droid</string>
<string name="app_list__name__downloading_in_progress">Prenašanje %1$s</string> <string name="app_list__name__downloading_in_progress">Prenašanje %1$s</string>
<string name="app_list__name__successfully_installed">%1$s nameščen</string> <string name="app_list__name__successfully_installed">%1$s nameščena</string>
<string name="more">Več</string> <string name="more">Več</string>
<string name="less">Manj</string> <string name="less">Manj</string>
<string name="antitracklist">Ta aplikacija vam sledi in poroča o vaši aktivnosti</string> <string name="antitracklist">Ta aplikacija vam sledi in poroča o vaši aktivnosti</string>

View File

@ -509,6 +509,4 @@
<string name="theme_follow_system">Ndiq sistemin</string> <string name="theme_follow_system">Ndiq sistemin</string>
<string name="use_pure_black_dark_theme_summary">E rekomanduar vetëm për ekranë OLED.</string> <string name="use_pure_black_dark_theme_summary">E rekomanduar vetëm për ekranë OLED.</string>
<string name="use_pure_black_dark_theme">Përdor sfond të zi në temë të errët</string> <string name="use_pure_black_dark_theme">Përdor sfond të zi në temë të errët</string>
<string name="banner_no_internet">Pa Internet</string>
<string name="banner_no_data_or_wifi">Pa të Dhëna ose WiFi aktive</string>
</resources> </resources>

View File

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="SignatureMismatch">Нова верзија је потписана различитим кључем. Да инсталирате нову верзију, прво треба да уклоните стару. (Уклањањем такође бришете унутрашње податке програма.)</string> <string name="SignatureMismatch">Ново издање је потписано другачијим кључем од старог. Ради уградње новог издања, најпре уклоните старо. (Имајте на уму да уклањањем такође бришете унутрашње податке програма.)</string>
<string name="installIncompatible">Програм не одговара овом уређају. Свеједно инсталирати\?</string> <string name="installIncompatible">Програм не одговара овом уређају, да ли га свеједно уградити\?</string>
<string name="version">Верзија</string> <string name="version">Издање</string>
<string name="delete">Обриши</string> <string name="delete">Избриши</string>
<string name="enable_nfc_send">Укључи НФЦ слање</string> <string name="enable_nfc_send">Омогући слање преко НФЦ-а</string>
<string name="cache_downloaded">Чувај кеширане програме</string> <string name="cache_downloaded">Чувај захваћене програме</string>
<string name="updates">Ажурирања</string> <string name="updates">Надградње</string>
<string name="other">Друго</string> <string name="other">Друго</string>
<string name="update_interval">Међувреме самосталног освежавања</string> <string name="update_interval">Међувреме самосталног освежавања</string>
<string name="notify">Прикажи доступне надградње</string> <string name="notify">Прикажи доступне надградње</string>
@ -15,7 +15,7 @@
<string name="system_installer_on">Користи повлашћено проширење за уградњу, надградњу и уклањање пакета</string> <string name="system_installer_on">Користи повлашћено проширење за уградњу, надградњу и уклањање пакета</string>
<string name="local_repo_name">Назив месне ризнице</string> <string name="local_repo_name">Назив месне ризнице</string>
<string name="local_repo_https_on">Користи шифровану везу ХТТПС:// за ову ризницу</string> <string name="local_repo_https_on">Користи шифровану везу ХТТПС:// за ову ризницу</string>
<string name="app_details">Детаљи програма</string> <string name="app_details">Појединости програма</string>
<string name="no_such_app">Нема таквог програма.</string> <string name="no_such_app">Нема таквог програма.</string>
<string name="about_title">О Ф-дроиду</string> <string name="about_title">О Ф-дроиду</string>
<string name="about_site">Мрежна страница</string> <string name="about_site">Мрежна страница</string>
@ -25,7 +25,7 @@
<string name="app_inst_known_source">Уграђено (из %s)</string> <string name="app_inst_known_source">Уграђено (из %s)</string>
<string name="app_inst_unknown_source">Уграђено (из непознатог извора)</string> <string name="app_inst_unknown_source">Уграђено (из непознатог извора)</string>
<string name="added_on">Додато у %s</string> <string name="added_on">Додато у %s</string>
<string name="ok">У реду</string> <string name="ok">Потврди</string>
<string name="yes">Да</string> <string name="yes">Да</string>
<string name="no">Не</string> <string name="no">Не</string>
<string name="repo_add_title">Додај нову ризницу</string> <string name="repo_add_title">Додај нову ризницу</string>
@ -39,22 +39,22 @@
<string name="repo_add_url">Адреса ризнице</string> <string name="repo_add_url">Адреса ризнице</string>
<string name="repo_add_fingerprint">Отисак (додатно)</string> <string name="repo_add_fingerprint">Отисак (додатно)</string>
<string name="malformed_repo_uri">Занемарујем лошу адресу ризнице: %s</string> <string name="malformed_repo_uri">Занемарујем лошу адресу ризнице: %s</string>
<string name="menu_manage">Складишта</string> <string name="menu_manage">Ризнице</string>
<string name="menu_search">Тражи</string> <string name="menu_search">Претражи</string>
<string name="menu_add_repo">Ново складиште</string> <string name="menu_add_repo">Нова ризница</string>
<string name="menu_launch">Отвори</string> <string name="menu_launch">Отвори</string>
<string name="menu_share">Дели</string> <string name="menu_share">Дели</string>
<string name="menu_install">Инсталирај</string> <string name="menu_install">Угради</string>
<string name="menu_uninstall">Уклони</string> <string name="menu_uninstall">Уклони</string>
<string name="menu_ignore_all">Занемари све надградње</string> <string name="menu_ignore_all">Занемари све надградње</string>
<string name="menu_ignore_this">Занемари ову надградњу</string> <string name="menu_ignore_this">Занемари ову надградњу</string>
<string name="menu_website">Мрежна страница</string> <string name="menu_website">Мрежна страница</string>
<string name="menu_issues">Праћење недостатака</string> <string name="menu_issues">Праћење недостатака</string>
<string name="menu_source">Изворни кôд</string> <string name="menu_source">Изворни кôд</string>
<string name="menu_upgrade">Ажурирај</string> <string name="menu_upgrade">Надгради</string>
<string name="details_notinstalled">Није инсталиран</string> <string name="details_notinstalled">Није уграђен</string>
<string name="antiadslist">Овај програм садржи огласе</string> <string name="antiadslist">Овај програм садржи огласе</string>
<string name="antitracklist">Програм прати и пријављује ваше активности</string> <string name="antitracklist">Овај програм прати и пријављује Ваша дејства</string>
<string name="antinonfreeadlist">Овај програм предлаже неслободне додатке</string> <string name="antinonfreeadlist">Овај програм предлаже неслободне додатке</string>
<string name="antinonfreenetlist">Овај програм предлаже неслободне мрежне услуге</string> <string name="antinonfreenetlist">Овај програм предлаже неслободне мрежне услуге</string>
<string name="antinonfreedeplist">Овај програм зависи од неслободних програма</string> <string name="antinonfreedeplist">Овај програм зависи од неслободних програма</string>
@ -94,12 +94,12 @@
<string name="no_permissions">Нема дозвола</string> <string name="no_permissions">Нема дозвола</string>
<string name="no_handler_app">Немате уграђен програм за %s.</string> <string name="no_handler_app">Немате уграђен програм за %s.</string>
<string name="theme">Тема</string> <string name="theme">Тема</string>
<string name="unsigned">Непотписано</string> <string name="unsigned">Непотписана</string>
<string name="unverified">Неоверено</string> <string name="unverified">Неоверена</string>
<string name="repo_num_apps">Број програма</string> <string name="repo_num_apps">Број програма</string>
<string name="repo_fingerprint">Отисак кључа за потписивање (СХА-256)</string> <string name="repo_fingerprint">Отисак кључа за потписивање (СХА-256)</string>
<string name="repo_description">Опис</string> <string name="repo_description">Опис</string>
<string name="repo_last_update">Последње ажурирање</string> <string name="repo_last_update">Последње освежавање</string>
<string name="repo_name">Назив</string> <string name="repo_name">Назив</string>
<string name="unsigned_description">Ово значи да списак програма није могао бити оверен. Требате бити опрезни са преузетим програмима преко садржаја без потписа.</string> <string name="unsigned_description">Ово значи да списак програма није могао бити оверен. Требате бити опрезни са преузетим програмима преко садржаја без потписа.</string>
<string name="repo_not_yet_updated">Ова ризница још није коришћена. Омогућите је да бисте видели програме које садржи.</string> <string name="repo_not_yet_updated">Ова ризница још није коришћена. Омогућите је да бисте видели програме које садржи.</string>
@ -107,21 +107,20 @@
<string name="repo_confirm_delete_title">Обрисати ризницу?</string> <string name="repo_confirm_delete_title">Обрисати ризницу?</string>
<string name="repo_confirm_delete_body">Брисање ризнице значи да њени програми више неће бити доступни. <string name="repo_confirm_delete_body">Брисање ризнице значи да њени програми више неће бити доступни.
\n \n
\nНапомена: Сви претходно уграђени програми ће остати на уређају.</string>
<string name="repo_disabled_notification">Онемогућена „%1$s“.
\n \n
\nМораћете поново да омогућите ову ризницу ради уградње програма из ње.</string> \nНапомена: Сви претходно уграђени програми ће остати на уређају.</string>
<string name="repo_disabled_notification">Онемогућена „%1$s“. Мораћете поново да омогућите ову ризницу ради уградње програма из ње.</string>
<string name="repo_added">Сачувана је ризница %1$s.</string> <string name="repo_added">Сачувана је ризница %1$s.</string>
<string name="repo_searching_address">Тражим ризницу на <string name="repo_searching_address">Тражим ризницу на
\n%1$s</string> \n%1$s</string>
<string name="not_on_same_wifi">Ваш уређај није на истој бежичној мрежи са локалним складиштем које сте додали! Пробајте ову мрежу: %s</string> <string name="not_on_same_wifi">Ваш уређај није на истој бежичној мрежи са месном ризницом коју сте управо додали! Придружите се овој мрежи: %s</string>
<string name="requires_features">Захтева: %1$s</string> <string name="requires_features">Захтева: %1$s</string>
<string name="category_Development">Развој</string> <string name="category_Development">Развој</string>
<string name="category_Games">Игре</string> <string name="category_Games">Игре</string>
<string name="category_Internet">Интернет</string> <string name="category_Internet">Интернет</string>
<string name="category_Multimedia">Мултимедија</string> <string name="category_Multimedia">Мултимедија</string>
<string name="category_Navigation">Навигација</string> <string name="category_Navigation">Навођење</string>
<string name="category_Phone_SMS">Телефон и СМС</string> <string name="category_Phone_SMS">Телазвон и поруке</string>
<string name="category_Reading">Читање</string> <string name="category_Reading">Читање</string>
<string name="category_Science_Education">Наука и образовање</string> <string name="category_Science_Education">Наука и образовање</string>
<string name="category_Security">Безбедност</string> <string name="category_Security">Безбедност</string>
@ -135,8 +134,8 @@
<string name="swap_welcome">Добро дошли у Ф-дроид!</string> <string name="swap_welcome">Добро дошли у Ф-дроид!</string>
<string name="swap_confirm_connect">Желите ли да добавите програме са %1$s одмах\?</string> <string name="swap_confirm_connect">Желите ли да добавите програме са %1$s одмах\?</string>
<string name="app_name">Ф-дроид</string> <string name="app_name">Ф-дроид</string>
<string name="unstable_updates">Нестабилна ажурирања</string> <string name="unstable_updates">Нестабилне надградње</string>
<string name="unstable_updates_summary">Предлаже и надоградње на нестабилне верзије</string> <string name="unstable_updates_summary">Предлагање надоградњи на нестабилна издања</string>
<string name="about_source">Изворни кôд</string> <string name="about_source">Изворни кôд</string>
<string name="app_incompatible">Неодговарајуће</string> <string name="app_incompatible">Неодговарајуће</string>
<string name="links">Везе</string> <string name="links">Везе</string>
@ -144,14 +143,14 @@
<string name="bad_fingerprint">Лош отисак</string> <string name="bad_fingerprint">Лош отисак</string>
<string name="invalid_url">Ово није исправна адреса.</string> <string name="invalid_url">Ово није исправна адреса.</string>
<string name="menu_changelog">Дневник измена</string> <string name="menu_changelog">Дневник измена</string>
<string name="banner_updating_repositories">Ажурирам складишта</string> <string name="banner_updating_repositories">Освежавам ризнице</string>
<string name="status_processing_xml_percent">Обрађујем %2$s / %3$s (%4$d%%) од %1$s</string> <string name="status_processing_xml_percent">Обрађујем %2$s / %3$s (%4$d%%) од %1$s</string>
<string name="pref_language">Језик</string> <string name="pref_language">Језик</string>
<string name="pref_language_default">Системски подразумеван</string> <string name="pref_language_default">Системски подразумеван</string>
<string name="wifi">Бежично</string> <string name="wifi">Wi-Fi</string>
<string name="wifi_ap">Врућа тачка</string> <string name="wifi_ap">Врућа тачка</string>
<string name="category_Connectivity">Повезивање</string> <string name="category_Connectivity">Повезивање</string>
<string name="category_Graphics">Графика</string> <string name="category_Graphics">Цртање</string>
<string name="category_Money">Новац</string> <string name="category_Money">Новац</string>
<string name="category_Sports_Health">Спорт и здравље</string> <string name="category_Sports_Health">Спорт и здравље</string>
<string name="category_Theming">Теме</string> <string name="category_Theming">Теме</string>
@ -212,20 +211,20 @@
<string name="swap_no_peers_nearby">Нисам нашао никога у близини за размену.</string> <string name="swap_no_peers_nearby">Нисам нашао никога у близини за размену.</string>
<string name="download_error">Преузимање није успело!</string> <string name="download_error">Преузимање није успело!</string>
<string name="perms_description_app">Достављен од стране %1$s.</string> <string name="perms_description_app">Достављен од стране %1$s.</string>
<string name="more">опширније</string> <string name="more">Више</string>
<string name="less">сажетије</string> <string name="less">Мање</string>
<string name="status_download_unknown_size">Преузимам <string name="status_download_unknown_size">Преузимам
\n%2$s од \n%2$s од
\n%1$s</string> \n%1$s</string>
<string name="permissions">Дозволе</string> <string name="permissions">Дозволе</string>
<string name="repo_details">Складиште</string> <string name="repo_details">Ризница</string>
<string name="repo_url">Адреса</string> <string name="repo_url">Адреса</string>
<string name="system_install_denied_permissions">Повлашћене дозволе нису одобрене за проширење! Пријавите грешку! <string name="system_install_denied_permissions">Повлашћене дозволе нису одобрене за проширење! Пријавите грешку!
</string> </string>
<string name="menu_bitcoin">Биткоин</string> <string name="menu_bitcoin">Биткоин</string>
<string name="menu_litecoin">Лајткоин</string> <string name="menu_litecoin">Лајткоин</string>
<string name="menu_flattr">Флатр</string> <string name="menu_flattr">Флатр</string>
<string name="menu_settings">Поставке</string> <string name="menu_settings">Подешавања</string>
<string name="swap_connection_misc_error">Десила се грешка приликом повезивања са уређајем, не можемо размењивати са њим!</string> <string name="swap_connection_misc_error">Десила се грешка приликом повезивања са уређајем, не можемо размењивати са њим!</string>
<string name="swap_join_same_wifi_desc">Да бисте размењивали преко бежичног морате бити на истој мрежи. Ако немате <string name="swap_join_same_wifi_desc">Да бисте размењивали преко бежичног морате бити на истој мрежи. Ако немате
приступ истој мрежи, једно од вас може да направи бежичну врућу тачку. приступ истој мрежи, једно од вас може да направи бежичну врућу тачку.
@ -243,7 +242,7 @@
<string name="install_confirm_update_no_perms">Да ли желите да инсталирате ажурирање ове постојеће апликације? Постојећи подаци неће бити изгубљени. Није потребан посебан приступ.</string> <string name="install_confirm_update_no_perms">Да ли желите да инсталирате ажурирање ове постојеће апликације? Постојећи подаци неће бити изгубљени. Није потребан посебан приступ.</string>
<string name="install_confirm_update_system_no_perms">Да ли желите да инсталирате ажурирање ове уграђене апликације? Постојећи подаци неће бити изгубљени. Није потребан посебан приступ.</string> <string name="install_confirm_update_system_no_perms">Да ли желите да инсталирате ажурирање ове уграђене апликације? Постојећи подаци неће бити изгубљени. Није потребан посебан приступ.</string>
<string name="crash_dialog_title">Ф-дроид се срушио</string> <string name="crash_dialog_title">Ф-дроид се срушио</string>
<string name="crash_dialog_text">Неочекивана грешка је зауставила програм. Хоћете ли да е-поштом пријавите проблем и помогнете у решавању проблема\?</string> <string name="crash_dialog_text">Неочекивана грешка је присилила програм да се заустави. Желите ли да пошаљете податке е-поштом и тиме помогнете у решавању проблема\?</string>
<string name="crash_dialog_comment_prompt">Можете да унесете додатне податке и напомене овде:</string> <string name="crash_dialog_comment_prompt">Можете да унесете додатне податке и напомене овде:</string>
<string name="antinonfreeassetslist">Овај програм поседује неслободан садржај</string> <string name="antinonfreeassetslist">Овај програм поседује неслободан садржај</string>
<string name="menu_email">Пошаљи е-пошту творцу</string> <string name="menu_email">Пошаљи е-пошту творцу</string>
@ -269,7 +268,7 @@
<string name="keep_install_history">Чувај историјат уградњи</string> <string name="keep_install_history">Чувај историјат уградњи</string>
<string name="keep_install_history_summary">Чувај дневник свих уградњи и уклањања унутар личног складишта</string> <string name="keep_install_history_summary">Чувај дневник свих уградњи и уклањања унутар личног складишта</string>
<string name="versions">Издања</string> <string name="versions">Издања</string>
<string name="warning_no_internet">Не могу да ажурирам. Да ли сте повезани на интернет\?</string> <string name="warning_no_internet">Не могу да освежим, да ли сте повезани на интернет?</string>
<string name="app_details_donate_prompt_unknown_author">Почастите програмере %1$s кафом!</string> <string name="app_details_donate_prompt_unknown_author">Почастите програмере %1$s кафом!</string>
<string name="app_details_donate_prompt">%1$s су направили %2$s. Почастите их кафом!</string> <string name="app_details_donate_prompt">%1$s су направили %2$s. Почастите их кафом!</string>
<string name="app_version_x_available">Издање %1$s је доступно</string> <string name="app_version_x_available">Издање %1$s је доступно</string>
@ -278,7 +277,7 @@
<string name="repositories_summary">Додај додатне изворе програма</string> <string name="repositories_summary">Додај додатне изворе програма</string>
<string name="main_menu__latest_apps">Најновије</string> <string name="main_menu__latest_apps">Најновије</string>
<string name="main_menu__categories">Категорије</string> <string name="main_menu__categories">Категорије</string>
<string name="notification_title_single_update_available">Доступно је ажурирање</string> <string name="notification_title_single_update_available">Доступна је надградња</string>
<string name="notification_title_single_ready_to_install">Спреман за уградњу</string> <string name="notification_title_single_ready_to_install">Спреман за уградњу</string>
<string name="notification_title_single_ready_to_install_update">Надградња је спремна</string> <string name="notification_title_single_ready_to_install_update">Надградња је спремна</string>
<string name="notification_title_single_install_error">Уградња није успела</string> <string name="notification_title_single_install_error">Уградња није успела</string>
@ -292,10 +291,10 @@
<string name="notification_title_summary_ready_to_install">Спреман за уградњу</string> <string name="notification_title_summary_ready_to_install">Спреман за уградњу</string>
<string name="notification_title_summary_installing">Уграђујем</string> <string name="notification_title_summary_installing">Уграђујем</string>
<string name="notification_title_summary_installed">Успешно је уграђен</string> <string name="notification_title_summary_installed">Успешно је уграђен</string>
<string name="notification_title_summary_install_error">Инсталација неуспешна</string> <string name="notification_title_summary_install_error">Уградња није успела</string>
<string name="notification_action_update">Освежи</string> <string name="notification_action_update">Освежи</string>
<string name="notification_action_cancel">Откажи</string> <string name="notification_action_cancel">Одустани</string>
<string name="notification_action_install">Инсталирај</string> <string name="notification_action_install">Угради</string>
<string name="main_menu__swap_nearby">Оближње</string> <string name="main_menu__swap_nearby">Оближње</string>
<plurals name="button_view_all_apps_in_category"> <plurals name="button_view_all_apps_in_category">
<item quantity="one">Прикажи %d</item> <item quantity="one">Прикажи %d</item>
@ -309,7 +308,7 @@
<string name="installed_app__updates_ignored">Надградње су занемарене</string> <string name="installed_app__updates_ignored">Надградње су занемарене</string>
<string name="installed_app__updates_ignored_for_suggested_version">Надградње за издање %1$s су занемарене</string> <string name="installed_app__updates_ignored_for_suggested_version">Надградње за издање %1$s су занемарене</string>
<string name="preference_category__my_apps">Моји програми</string> <string name="preference_category__my_apps">Моји програми</string>
<string name="preference_manage_installed_apps">Управљај инсталираним програмима</string> <string name="preference_manage_installed_apps">Управљај уграђеним програмима</string>
<string name="tts_category_name">Категорија %1$s</string> <string name="tts_category_name">Категорија %1$s</string>
<string name="app__install_downloaded_update">Надгради</string> <string name="app__install_downloaded_update">Надгради</string>
<string name="app_list__name__downloading_in_progress">Преузимам %1$s</string> <string name="app_list__name__downloading_in_progress">Преузимам %1$s</string>
@ -335,7 +334,7 @@
<item quantity="few">Надграђена пре %1$d дана</item> <item quantity="few">Надграђена пре %1$d дана</item>
<item quantity="other">Надграђена пре %1$d дана</item> <item quantity="other">Надграђена пре %1$d дана</item>
</plurals> </plurals>
<string name="app_list__name__successfully_installed">%1$s инсталиран</string> <string name="app_list__name__successfully_installed">%1$s је уграђен</string>
<string name="nearby_splash__download_apps_from_people_nearby">Немате интернета? Преузмите апликације од људи у близини!</string> <string name="nearby_splash__download_apps_from_people_nearby">Немате интернета? Преузмите апликације од људи у близини!</string>
<string name="nearby_splash__find_people_button">Пронађи људе у близини</string> <string name="nearby_splash__find_people_button">Пронађи људе у близини</string>
<string name="nearby_splash__both_parties_need_fdroid">Обе стране треба да користе %1$s да би користиле близинску размену.</string> <string name="nearby_splash__both_parties_need_fdroid">Обе стране треба да користе %1$s да би користиле близинску размену.</string>
@ -348,7 +347,7 @@
<string name="app__tts__cancel_download">Откажи преузимање</string> <string name="app__tts__cancel_download">Откажи преузимање</string>
<string name="menu_license">Лиценца: %s</string> <string name="menu_license">Лиценца: %s</string>
<string name="app__tts__downloading_progress">Преузимам, %1$d%% завршено</string> <string name="app__tts__downloading_progress">Преузимам, %1$d%% завршено</string>
<string name="by_author_format">%s</string> <string name="by_author_format">од %s</string>
<plurals name="notification_summary_more"> <plurals name="notification_summary_more">
<item quantity="one">+још %1$d…</item> <item quantity="one">+још %1$d…</item>
<item quantity="few">+још %1$d…</item> <item quantity="few">+још %1$d…</item>
@ -394,14 +393,14 @@
<string name="updates__app_with_known_vulnerability__ignore">Занемари</string> <string name="updates__app_with_known_vulnerability__ignore">Занемари</string>
<string name="hide_all_notifications">Сакриј сва обавештења</string> <string name="hide_all_notifications">Сакриј сва обавештења</string>
<string name="install_history">Историјат уградњи</string> <string name="install_history">Историјат уградњи</string>
<string name="send_install_history">Шаљи историјат инсталација</string> <string name="send_install_history">Шаљи историјат уградњи</string>
<string name="about_forum">Сабор за подршку</string> <string name="about_forum">Сабор за подршку</string>
<string name="app_suggested">Предложено</string> <string name="app_suggested">Предложено</string>
<string name="app_size">Величина: %1$s</string> <string name="app_size">Величина: %1$s</string>
<string name="send_installed_apps">Дели уграђене програме</string> <string name="send_installed_apps">Дели уграђене програме</string>
<string name="prompt_to_send_crash_reports">Питај за слање извештаја о паду</string> <string name="prompt_to_send_crash_reports">Питај да шаљеш извештај о рушењу</string>
<string name="prompt_to_send_crash_reports_summary">Скупљај податке о падовима и питај да ли да се шаљу програмерима</string> <string name="prompt_to_send_crash_reports_summary">Скупљај податке у рушењима и питај да ли да се пошаљу програмерима</string>
<string name="hide_all_notifications_summary">Не приказуј никакве радње у траци статуса нити обавештења.</string> <string name="hide_all_notifications_summary">Забрани приказ свих радњи у траци стања и обавештења.</string>
<string name="install_history_summary">Види лични дневник свих уградњи и брисања</string> <string name="install_history_summary">Види лични дневник свих уградњи и брисања</string>
<string name="send_version_and_uuid">Шаљи издање и УУИД служитељима</string> <string name="send_version_and_uuid">Шаљи издање и УУИД служитељима</string>
<string name="send_version_and_uuid_summary">Укључи издање овог програма и случајни, јединствени ЛБ приликом преузимања, ступа на снагу од следећег покретања програма.</string> <string name="send_version_and_uuid_summary">Укључи издање овог програма и случајни, јединствени ЛБ приликом преузимања, ступа на снагу од следећег покретања програма.</string>
@ -511,17 +510,4 @@
<string name="notification_channel_updates_title">Обнављања</string> <string name="notification_channel_updates_title">Обнављања</string>
<string name="notification_channel_installs_title">Уградње</string> <string name="notification_channel_installs_title">Уградње</string>
<string name="send_to_fdroid_metrics">Пошаљи податке о коришћењу</string> <string name="send_to_fdroid_metrics">Пошаљи податке о коришћењу</string>
<string name="toast_metrics_in_install_history">%s извештај метрике се може видети у приказу историје уградњи</string>
<string name="theme_follow_system">Прати систем</string>
<string name="use_pure_black_dark_theme_summary">Препоручљиво само на ОЛЕД екранима.</string>
<string name="use_pure_black_dark_theme">Користи чисто црну позадину у тамној теми</string>
<string name="banner_no_data_or_wifi">Нема везе за пренос</string>
<string name="banner_no_internet">Нема интернета</string>
<string name="menu_show_install_history">Прикажи историју уградњи</string>
<string name="menu_show_fdroid_metrics_report">Прикажи извештај метрике</string>
<string name="send_to_fdroid_metrics_summary">Недељно шаље анонимне податке на Ф-дроид метрику (уз укључено чување историје уградњи)</string>
<string name="fdroid_metrics_report">%s извештај метрике</string>
<string name="install_history_and_metrics">Историјат уградњи и метрика</string>
<string name="send_fdroid_metrics_json">%s извештај метрике као JSON фајл</string>
<string name="send_fdroid_metrics_report">Шаљи извештај метрике за %s</string>
</resources> </resources>

Some files were not shown because too many files have changed in this diff Show More