mirror of
https://github.com/nextcloud/android.git
synced 2024-12-22 00:34:31 +03:00
Merge remote-tracking branch 'origin/master' into dev
This commit is contained in:
commit
32018f0d14
9 changed files with 338 additions and 108 deletions
|
@ -17,6 +17,7 @@ import android.Manifest;
|
|||
import android.accounts.Account;
|
||||
import android.accounts.AccountManager;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
|
@ -33,29 +34,42 @@ import android.os.IBinder;
|
|||
import android.preference.PreferenceManager;
|
||||
import android.text.TextUtils;
|
||||
import android.util.AndroidRuntimeException;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.Gravity;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.webkit.CookieManager;
|
||||
import android.webkit.CookieSyncManager;
|
||||
import android.webkit.WebResourceRequest;
|
||||
import android.webkit.WebResourceResponse;
|
||||
import android.webkit.WebView;
|
||||
import android.widget.Button;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.TextView.OnEditorActionListener;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.blikoon.qrcodescanner.QrCodeActivity;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.nextcloud.android.common.ui.color.ColorUtil;
|
||||
import com.nextcloud.android.common.ui.theme.utils.ColorRole;
|
||||
import com.nextcloud.client.account.User;
|
||||
import com.nextcloud.client.account.UserAccountManager;
|
||||
import com.nextcloud.client.device.DeviceInfo;
|
||||
import com.nextcloud.client.di.Injectable;
|
||||
import com.nextcloud.client.network.ClientFactory;
|
||||
import com.nextcloud.client.onboarding.FirstRunActivity;
|
||||
import com.nextcloud.client.onboarding.OnboardingService;
|
||||
import com.nextcloud.client.preferences.AppPreferences;
|
||||
import com.nextcloud.common.PlainClient;
|
||||
import com.nextcloud.operations.PostMethod;
|
||||
import com.nextcloud.utils.extensions.BundleExtensionsKt;
|
||||
import com.owncloud.android.MainApp;
|
||||
import com.owncloud.android.R;
|
||||
|
@ -100,6 +114,8 @@ import com.owncloud.android.utils.WebViewUtil;
|
|||
import com.owncloud.android.utils.theme.CapabilityUtils;
|
||||
import com.owncloud.android.utils.theme.ViewThemeUtils;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.net.URLDecoder;
|
||||
import java.util.HashMap;
|
||||
|
@ -107,9 +123,13 @@ import java.util.Locale;
|
|||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
@ -125,6 +145,8 @@ import de.cotech.hw.fido.ui.FidoDialogOptions;
|
|||
import de.cotech.hw.fido2.WebViewWebauthnBridge;
|
||||
import de.cotech.hw.fido2.ui.WebauthnDialogOptions;
|
||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||
import okhttp3.FormBody;
|
||||
import okhttp3.RequestBody;
|
||||
|
||||
import static com.owncloud.android.utils.PermissionUtil.PERMISSIONS_CAMERA;
|
||||
|
||||
|
@ -162,7 +184,17 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
|
|||
private static final String KEY_USERNAME = "USERNAME";
|
||||
private static final String KEY_PASSWORD = "PASSWORD";
|
||||
private static final String KEY_ASYNC_TASK_IN_PROGRESS = "AUTH_IN_PROGRESS";
|
||||
public static final String WEB_LOGIN = "/index.php/login/flow";
|
||||
|
||||
/**
|
||||
* Login Flow v1
|
||||
*/
|
||||
// public static final String WEB_LOGIN = "/index.php/login/flow";
|
||||
|
||||
/**
|
||||
* Login Flow v2
|
||||
*/
|
||||
public static final String WEB_LOGIN = "/index.php/login/v2";
|
||||
|
||||
public static final String PROTOCOL_SUFFIX = "://";
|
||||
public static final String LOGIN_URL_DATA_KEY_VALUE_SEPARATOR = ":";
|
||||
public static final String HTTPS_PROTOCOL = "https://";
|
||||
|
@ -171,7 +203,6 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
|
|||
public static final int NO_ICON = 0;
|
||||
public static final String EMPTY_STRING = "";
|
||||
|
||||
private static final int REQUEST_CODE_QR_SCAN = 101;
|
||||
public static final int REQUEST_CODE_FIRST_RUN = 102;
|
||||
|
||||
/// parameters from EXTRAs in starter Intent
|
||||
|
@ -218,6 +249,9 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
|
|||
@Inject PassCodeManager passCodeManager;
|
||||
@Inject ViewThemeUtils.Factory viewThemeUtilsFactory;
|
||||
@Inject ColorUtil colorUtil;
|
||||
@Inject ClientFactory clientFactory;
|
||||
|
||||
private String token;
|
||||
|
||||
private boolean onlyAdd = false;
|
||||
@SuppressLint("ResourceAsColor") @ColorInt
|
||||
|
@ -242,7 +276,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
|
|||
viewThemeUtils = viewThemeUtilsFactory.withPrimaryAsBackground();
|
||||
viewThemeUtils.platform.themeStatusBar(this, ColorRole.PRIMARY);
|
||||
|
||||
WebViewUtil webViewUtil = new WebViewUtil(this);
|
||||
// WebViewUtil webViewUtil = new WebViewUtil(this);
|
||||
|
||||
Uri data = getIntent().getData();
|
||||
boolean directLogin = data != null && data.toString().startsWith(getString(R.string.login_data_own_scheme));
|
||||
|
@ -298,7 +332,8 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
|
|||
if (webViewLoginMethod) {
|
||||
accountSetupWebviewBinding = AccountSetupWebviewBinding.inflate(getLayoutInflater());
|
||||
setContentView(accountSetupWebviewBinding.getRoot());
|
||||
initWebViewLogin(webloginUrl, false);
|
||||
anonymouslyPostLoginRequest(webloginUrl);
|
||||
// initWebViewLogin(webloginUrl, false);
|
||||
} else {
|
||||
accountSetupBinding = AccountSetupBinding.inflate(getLayoutInflater());
|
||||
setContentView(accountSetupBinding.getRoot());
|
||||
|
@ -314,7 +349,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
|
|||
|
||||
initServerPreFragment(savedInstanceState);
|
||||
|
||||
webViewUtil.checkWebViewVersion();
|
||||
// webViewUtil.checkWebViewVersion();
|
||||
}
|
||||
|
||||
private void deleteCookies() {
|
||||
|
@ -326,11 +361,57 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
|
|||
}
|
||||
}
|
||||
|
||||
private String baseUrl;
|
||||
|
||||
/**
|
||||
* This function facilitates the login process by anonymously posting a login request to a specified URL.
|
||||
* After posting the request, it retrieves the login URL for completing the login flow.
|
||||
* The login flow version used is v2.
|
||||
*
|
||||
* @param url The URL where the login request is to be anonymously posted.
|
||||
* This URL should handle the login request and return the login URL.
|
||||
* It's typically the entry point for the login process.
|
||||
* Example: "https://example.com/index.php/login/v2"
|
||||
*/
|
||||
private void anonymouslyPostLoginRequest(String url) {
|
||||
baseUrl = url;
|
||||
|
||||
Thread thread = new Thread(() -> {
|
||||
PostMethod post = new PostMethod(baseUrl, false, new FormBody.Builder().build());
|
||||
|
||||
PlainClient client = clientFactory.createPlainClient();
|
||||
post.execute(client);
|
||||
String response = post.getResponseBodyAsString();
|
||||
JsonObject jsonObject = JsonParser.parseString(response).getAsJsonObject();
|
||||
String login = jsonObject.get("login").getAsString();
|
||||
if (login == null) {
|
||||
login = getResources().getString(R.string.webview_login_url);
|
||||
}
|
||||
|
||||
String loginUrl = login;
|
||||
runOnUiThread(() -> {
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(loginUrl));
|
||||
loginFlowResultLauncher.launch(intent);
|
||||
});
|
||||
|
||||
token = jsonObject.getAsJsonObject("poll").get("token").getAsString();
|
||||
});
|
||||
|
||||
thread.start();
|
||||
}
|
||||
|
||||
private final ActivityResultLauncher<Intent> loginFlowResultLauncher = registerForActivityResult(
|
||||
new ActivityResultContracts.StartActivityForResult(), result -> poolLogin(clientFactory.createPlainClient()));
|
||||
|
||||
private static String getWebLoginUserAgent() {
|
||||
return Build.MANUFACTURER.substring(0, 1).toUpperCase(Locale.getDefault()) +
|
||||
Build.MANUFACTURER.substring(1).toLowerCase(Locale.getDefault()) + " " + Build.MODEL + " (Android)";
|
||||
}
|
||||
|
||||
/**
|
||||
* @Deprecated This function is deprecated. Please use the {@link #anonymouslyPostLoginRequest(String)} method instead, which utilizes the improved login flow v2.
|
||||
*/
|
||||
@Deprecated
|
||||
@SuppressFBWarnings("ANDROID_WEB_VIEW_JAVASCRIPT")
|
||||
@SuppressLint("SetJavaScriptEnabled")
|
||||
private void initWebViewLogin(String baseURL, boolean useGenericUserAgent) {
|
||||
|
@ -680,7 +761,8 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
|
|||
if (intent.getBooleanExtra(EXTRA_USE_PROVIDER_AS_WEBLOGIN, false)) {
|
||||
accountSetupWebviewBinding = AccountSetupWebviewBinding.inflate(getLayoutInflater());
|
||||
setContentView(accountSetupWebviewBinding.getRoot());
|
||||
initWebViewLogin(getString(R.string.provider_registration_server), true);
|
||||
anonymouslyPostLoginRequest(getString(R.string.provider_registration_server));
|
||||
// initWebViewLogin(getString(R.string.provider_registration_server), true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -915,7 +997,16 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
|
|||
|
||||
accountSetupWebviewBinding = AccountSetupWebviewBinding.inflate(getLayoutInflater());
|
||||
setContentView(accountSetupWebviewBinding.getRoot());
|
||||
initWebViewLogin(mServerInfo.mBaseUrl + WEB_LOGIN, false);
|
||||
|
||||
if (!isLoginProcessCompleted) {
|
||||
if (!isRedirectedToTheDefaultBrowser) {
|
||||
anonymouslyPostLoginRequest(mServerInfo.mBaseUrl + WEB_LOGIN);
|
||||
isRedirectedToTheDefaultBrowser = true;
|
||||
} else {
|
||||
initLoginInfoView();
|
||||
}
|
||||
// initWebViewLogin(mServerInfo.mBaseUrl + WEB_LOGIN, false);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
updateServerStatusIconAndText(result);
|
||||
|
@ -928,6 +1019,19 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
|
|||
}
|
||||
}
|
||||
|
||||
// region LoginInfoView
|
||||
private void initLoginInfoView() {
|
||||
LinearLayout loginFlowLayout = accountSetupWebviewBinding.loginFlowV2.getRoot();
|
||||
MaterialButton cancelButton = accountSetupWebviewBinding.loginFlowV2.cancelButton;
|
||||
loginFlowLayout.setVisibility(View.VISIBLE);
|
||||
|
||||
cancelButton.setOnClickListener(v -> {
|
||||
loginFlowExecutorService.shutdown();
|
||||
recreate();
|
||||
});
|
||||
}
|
||||
// endregion
|
||||
|
||||
/**
|
||||
* Chooses the right icon and text to show to the user for the received operation result.
|
||||
*
|
||||
|
@ -1169,7 +1273,8 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
|
|||
|
||||
} else { // authorization fail due to client side - probably wrong credentials
|
||||
if (accountSetupWebviewBinding != null) {
|
||||
initWebViewLogin(mServerInfo.mBaseUrl + WEB_LOGIN, false);
|
||||
anonymouslyPostLoginRequest(mServerInfo.mBaseUrl + WEB_LOGIN);
|
||||
// initWebViewLogin(mServerInfo.mBaseUrl + WEB_LOGIN, false);
|
||||
DisplayUtils.showSnackMessage(this,
|
||||
accountSetupWebviewBinding.loginWebview, R.string.auth_access_failed,
|
||||
result.getLogMessage());
|
||||
|
@ -1340,9 +1445,37 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
|
|||
|
||||
private void startQRScanner() {
|
||||
Intent intent = new Intent(this, QrCodeActivity.class);
|
||||
startActivityForResult(intent, REQUEST_CODE_QR_SCAN);
|
||||
qrScanResultLauncher.launch(intent);
|
||||
}
|
||||
|
||||
private final ActivityResultLauncher<Intent> qrScanResultLauncher = registerForActivityResult(
|
||||
new ActivityResultContracts.StartActivityForResult(),
|
||||
result -> {
|
||||
if (result.getResultCode() == Activity.RESULT_OK) {
|
||||
Intent data = result.getData();
|
||||
|
||||
if (data == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
String resultData = data.getStringExtra("com.blikoon.qrcodescanner.got_qr_scan_relult");
|
||||
|
||||
if (resultData == null || !resultData.startsWith(getString(R.string.login_data_own_scheme))) {
|
||||
mServerStatusIcon = R.drawable.ic_alert;
|
||||
mServerStatusText = "QR Code could not be read!";
|
||||
showServerStatus();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!getResources().getBoolean(R.bool.multiaccount_support) &&
|
||||
accountManager.getAccounts().length == 1) {
|
||||
Toast.makeText(this, R.string.no_mutliple_accounts_allowed, Toast.LENGTH_LONG).show();
|
||||
} else {
|
||||
parseAndLoginFromWebView(resultData);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode,
|
||||
@NonNull String[] permissions,
|
||||
|
@ -1362,7 +1495,9 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
|
|||
* server.
|
||||
*/
|
||||
private void showServerStatus() {
|
||||
if (accountSetupBinding == null) return;
|
||||
if (accountSetupBinding == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mServerStatusIcon == NO_ICON && EMPTY_STRING.equals(mServerStatusText)) {
|
||||
accountSetupBinding.serverStatusText.setVisibility(View.INVISIBLE);
|
||||
|
@ -1486,32 +1621,69 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
if (requestCode == REQUEST_CODE_QR_SCAN) {
|
||||
if (data == null) {
|
||||
return;
|
||||
}
|
||||
private final ScheduledExecutorService loginFlowExecutorService = Executors.newSingleThreadScheduledExecutor();
|
||||
private boolean isLoginProcessCompleted = false;
|
||||
private boolean isRedirectedToTheDefaultBrowser = false;
|
||||
|
||||
String result = data.getStringExtra("com.blikoon.qrcodescanner.got_qr_scan_relult");
|
||||
|
||||
if (result == null || !result.startsWith(getString(R.string.login_data_own_scheme))) {
|
||||
mServerStatusIcon = R.drawable.ic_alert;
|
||||
mServerStatusText = "QR Code could not be read!";
|
||||
showServerStatus();
|
||||
return;
|
||||
private void poolLogin(PlainClient client) {
|
||||
loginFlowExecutorService.scheduleAtFixedRate(() -> {
|
||||
if (!isLoginProcessCompleted) {
|
||||
performLoginFlowV2(client);
|
||||
}
|
||||
}, 0, 30, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
if (!getResources().getBoolean(R.bool.multiaccount_support) &&
|
||||
accountManager.getAccounts().length == 1) {
|
||||
Toast.makeText(this, R.string.no_mutliple_accounts_allowed, Toast.LENGTH_LONG).show();
|
||||
} else {
|
||||
parseAndLoginFromWebView(result);
|
||||
}
|
||||
private void performLoginFlowV2(PlainClient client) {
|
||||
String postRequestUrl = baseUrl + "/poll";
|
||||
|
||||
RequestBody requestBody = new FormBody.Builder()
|
||||
.add("token", token)
|
||||
.build();
|
||||
|
||||
PostMethod post = new PostMethod(postRequestUrl, false, requestBody);
|
||||
int status = post.execute(client);
|
||||
String response = post.getResponseBodyAsString();
|
||||
|
||||
Log_OC.d(TAG, "performLoginFlowV2 status: " + status);
|
||||
Log_OC.d(TAG, "performLoginFlowV2 response: " + response);
|
||||
|
||||
if (!response.isEmpty()) {
|
||||
runOnUiThread(() -> completeLoginFlow(response, status));
|
||||
}
|
||||
}
|
||||
|
||||
private void completeLoginFlow(String response, int status) {
|
||||
try {
|
||||
JSONObject jsonObject = new JSONObject(response);
|
||||
|
||||
String server = jsonObject.getString("server");
|
||||
String loginName = jsonObject.getString("loginName");
|
||||
String appPassword = jsonObject.getString("appPassword");
|
||||
|
||||
LoginUrlInfo loginUrlInfo = new LoginUrlInfo();
|
||||
loginUrlInfo.serverAddress = server;
|
||||
loginUrlInfo.username = loginName;
|
||||
loginUrlInfo.password = appPassword;
|
||||
|
||||
isLoginProcessCompleted = (status == 200 && !server.isEmpty() && !loginName.isEmpty() && !appPassword.isEmpty());
|
||||
|
||||
if (accountSetupBinding != null) {
|
||||
accountSetupBinding.hostUrlInput.setText("");
|
||||
}
|
||||
mServerInfo.mBaseUrl = AuthenticatorUrlUtils.INSTANCE.normalizeUrlSuffix(loginUrlInfo.serverAddress);
|
||||
webViewUser = loginUrlInfo.username;
|
||||
webViewPassword = loginUrlInfo.password;
|
||||
} catch (Exception e) {
|
||||
Log_OC.d(TAG, "Error caught at completeLoginFlow: " + e);
|
||||
mServerStatusIcon = R.drawable.ic_alert;
|
||||
mServerStatusText = getString(R.string.qr_could_not_be_read);
|
||||
showServerStatus();
|
||||
}
|
||||
|
||||
checkOcServer();
|
||||
loginFlowExecutorService.shutdown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Called from SslValidatorDialog when a new server certificate was correctly saved.
|
||||
*/
|
||||
|
|
|
@ -7,21 +7,31 @@
|
|||
~ SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
-->
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:orientation="vertical">
|
||||
|
||||
<!-- Login Flow V1 -->
|
||||
<WebView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:visibility="gone"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:id="@+id/login_webview">
|
||||
</WebView>
|
||||
|
||||
<!-- Login Flow V2 -->
|
||||
<include
|
||||
tools:visibility="visible"
|
||||
android:visibility="gone"
|
||||
android:id="@+id/login_flow_v2"
|
||||
layout="@layout/login_flow_info_layout_v2" />
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/login_webview_progress_bar"
|
||||
style="?android:attr/progressBarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:indeterminate="true"/>
|
||||
android:indeterminate="true" />
|
||||
</FrameLayout>
|
||||
|
|
41
app/src/main/res/layout/login_flow_info_layout_v2.xml
Normal file
41
app/src/main/res/layout/login_flow_info_layout_v2.xml
Normal file
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Nextcloud - Android Client
|
||||
~
|
||||
~ SPDX-FileCopyrightText: 2024 Your Name <your@email.com>
|
||||
~ SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
-->
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/login_flow_info_v2"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:orientation="vertical"
|
||||
android:gravity="center"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<TextView
|
||||
android:text="@string/authenticator_activity_please_complete_login_process"
|
||||
android:layout_width="match_parent"
|
||||
android:gravity="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/splash_text_size"
|
||||
android:layout_marginBottom="@dimen/standard_double_margin"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/cancel_button"
|
||||
app:backgroundTint="@color/white"
|
||||
android:textColor="@color/black"
|
||||
android:theme="@style/Widget.Material3.Button.OutlinedButton"
|
||||
android:layout_width="300dp"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
app:strokeColor="@color/white"
|
||||
android:layout_marginBottom="@dimen/standard_double_margin"
|
||||
android:layout_height="wrap_content"
|
||||
app:cornerRadius="@dimen/button_corner_radius"
|
||||
android:text="@string/authenticator_activity_cancel_login" />
|
||||
|
||||
</LinearLayout>
|
|
@ -13,6 +13,7 @@
|
|||
<string name="action_send_share">Kirim/Bagi</string>
|
||||
<string name="action_switch_grid_view">Tampilan kotak</string>
|
||||
<string name="action_switch_list_view">Tampilan lis</string>
|
||||
<string name="actionbar_calendar_contacts_restore">Pulihkan kontak dan kalender</string>
|
||||
<string name="actionbar_mkdir">Folder baru</string>
|
||||
<string name="actionbar_move_or_copy">Pindah atau Salin</string>
|
||||
<string name="actionbar_open_with">Buka dengan</string>
|
||||
|
@ -32,10 +33,30 @@
|
|||
<string name="add_to_cloud">Tambahkan ke %1$s</string>
|
||||
<string name="advanced_settings">Pengaturan Tambahan</string>
|
||||
<string name="allow_resharing">Izinkan pembagian ulang</string>
|
||||
<string name="app_widget_description">Menampilkan satu gawit dari dasbor</string>
|
||||
<string name="appbar_search_in">Cari dalam %s</string>
|
||||
<string name="assistant_screen_all_task_type">Semua</string>
|
||||
<string name="assistant_screen_create_task_alert_dialog_input_field_placeholder">Tulis beberapa teks</string>
|
||||
<string name="assistant_screen_delete_task_alert_dialog_description">Apakah Anda yakin ingin menghapus tugas ini?</string>
|
||||
<string name="assistant_screen_delete_task_alert_dialog_title">Hapus Tugas</string>
|
||||
<string name="assistant_screen_failed_task_text">Gagal</string>
|
||||
<string name="assistant_screen_loading">Daftar Tugas sedang dimuat, mohon tunggu</string>
|
||||
<string name="assistant_screen_no_task_available_for_all_task_filter_text">Tidak ada tugas yang tersedia. Pilih jenis tugas untuk membuat tugas baru.</string>
|
||||
<string name="assistant_screen_no_task_available_text">Tidak ada tugas yang tersedia untuk jenis tugas %s, Anda dapat membuat tugas baru dari pojok kanan bawah.</string>
|
||||
<string name="assistant_screen_running_task_text">Sedang Berlangsung</string>
|
||||
<string name="assistant_screen_scheduled_task_status_text">Dijadwalkan</string>
|
||||
<string name="assistant_screen_successful_task_text">Selesai</string>
|
||||
<string name="assistant_screen_task_create_fail_message">Terjadi kesalahan saat membuat tugas</string>
|
||||
<string name="assistant_screen_task_create_success_message">Tugas berhasil dibuat</string>
|
||||
<string name="assistant_screen_task_delete_fail_message">Terjadi kesalahan saat menghapus tugas</string>
|
||||
<string name="assistant_screen_task_delete_success_message">Tugas berhasil dihapus</string>
|
||||
<string name="assistant_screen_task_list_error_state_message">Tidak dapat memperoleh daftar tugas, mohon periksa koneksi internet Anda.</string>
|
||||
<string name="assistant_screen_task_more_actions_bottom_sheet_delete_action">Hapus Tugas</string>
|
||||
<string name="assistant_screen_task_types_error_state_message">Tidak dapat memperoleh jenis tugas, mohon periksa koneksi internet Anda.</string>
|
||||
<string name="assistant_screen_top_bar_title">Asisten</string>
|
||||
<string name="assistant_screen_unknown_task_status_text">Tidak diketahui</string>
|
||||
<string name="assistant_task_detail_screen_input_button_title">Input</string>
|
||||
<string name="assistant_task_detail_screen_output_button_title">Output</string>
|
||||
<string name="associated_account_not_found">Akun terkait tidak ditemukan!</string>
|
||||
<string name="auth_access_failed">Akses gagal: %1$s</string>
|
||||
<string name="auth_account_does_not_exist">Akun ini belum ditambahkan ke perangkat ini</string>
|
||||
|
@ -74,9 +95,11 @@
|
|||
<string name="autoupload_custom_folder">Pasang folder kostum.</string>
|
||||
<string name="autoupload_disable_power_save_check">Non-aktifkan pemeriksaan mode hemat daya</string>
|
||||
<string name="autoupload_hide_folder">Sembunyikan folder</string>
|
||||
<string name="autoupload_worker_foreground_info">Menyiapkan unggah otomatis</string>
|
||||
<string name="avatar">Avatar</string>
|
||||
<string name="away">Jauh</string>
|
||||
<string name="backup_settings">Pengaturan Pencadangan</string>
|
||||
<string name="backup_title">Pencadangan kontak dan kalender</string>
|
||||
<string name="battery_optimization_close">Tutup</string>
|
||||
<string name="battery_optimization_disable">Nonaktifkan</string>
|
||||
<string name="battery_optimization_message">Optimisasi baterai perangkat Anda mungkin sedang aktif.
|
||||
|
@ -87,11 +110,13 @@ Otomatis unggah hanya bekerja dengan baik apabila Anda mengeluarkan aplikasi ini
|
|||
<string name="calendars">Kalender</string>
|
||||
<string name="certificate_load_problem">Terjadi permasalahan memuat sertifikat.</string>
|
||||
<string name="changelog_dev_version">Perubahan versi dev</string>
|
||||
<string name="check_back_later_or_reload">Periksa kembali nanti atau muat ulang.</string>
|
||||
<string name="checkbox">Kotak centang</string>
|
||||
<string name="choose_local_folder">Pilih folder lokal…</string>
|
||||
<string name="choose_remote_folder">Pilih folder remot…</string>
|
||||
<string name="choose_template_helper_text">Mohon pilih templat dan masukkan nama file.</string>
|
||||
<string name="choose_which_file">Pilih file mana yang ditahan!</string>
|
||||
<string name="choose_widget">Pilih gawit</string>
|
||||
<string name="clear_notifications_failed">Gagal membersihkan notifikasi</string>
|
||||
<string name="clear_status_message">Kosongkan status pesan</string>
|
||||
<string name="clear_status_message_after">Kosongkan status pesan setelah</string>
|
||||
|
@ -127,6 +152,7 @@ Otomatis unggah hanya bekerja dengan baik apabila Anda mengeluarkan aplikasi ini
|
|||
<string name="community_beta_text">Ini termasuk semua fitur yang akan datang. Bug/galat bisa terjadi, bila terjadi harap laporkan ke kami.</string>
|
||||
<string name="community_contribute_forum_forum">forum</string>
|
||||
<string name="community_contribute_forum_text">Bantu yang lain di</string>
|
||||
<string name="community_contribute_github_text">Tinjau, ubah, dan tulis kode, lihat %1$suntuk detailnya.</string>
|
||||
<string name="community_contribute_headline">Berkontribusi Aktif</string>
|
||||
<string name="community_contribute_translate_text">aplikasi</string>
|
||||
<string name="community_contribute_translate_translate">Terjemahkan</string>
|
||||
|
@ -146,6 +172,7 @@ Otomatis unggah hanya bekerja dengan baik apabila Anda mengeluarkan aplikasi ini
|
|||
<string name="confirmation_remove_folder_alert">Apakah anda yakin ingin menghapus %1$s beserta isinya?</string>
|
||||
<string name="confirmation_remove_folders_alert">Apa anda yakin ingin menghapus item yang terpilih beserta isinya?</string>
|
||||
<string name="confirmation_remove_local">Lokal saja</string>
|
||||
<string name="conflict_dialog_error">Dialog penyelesaian konflik tidak dapat dibuat</string>
|
||||
<string name="conflict_file_headline">File konflik %1$s</string>
|
||||
<string name="conflict_local_file">File lokal</string>
|
||||
<string name="conflict_message_description">Jika Anda memilih kedua versi, nama dari berkas lokal akan ditambahi angka.</string>
|
||||
|
@ -218,18 +245,23 @@ Otomatis unggah hanya bekerja dengan baik apabila Anda mengeluarkan aplikasi ini
|
|||
<string name="downloader_download_in_progress_ticker">Mengunduh…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s terunduh</string>
|
||||
<string name="downloader_download_succeeded_ticker">Unggahan</string>
|
||||
<string name="downloader_file_download_cancelled">Berkas tertentu dibatalkan saat pengunduhan oleh pengguna</string>
|
||||
<string name="downloader_file_download_failed">Terjadi kesalahan saat mengunduh berkas</string>
|
||||
<string name="downloader_not_downloaded_yet">Belum diunduh</string>
|
||||
<string name="downloader_unexpected_error">Terjadi kesalahan tidak terduga saat mengunduh berkas</string>
|
||||
<string name="drawer_close">Tutup jendela samping</string>
|
||||
<string name="drawer_community">Komunitas</string>
|
||||
<string name="drawer_header_background">Gambar latar belakang tajuk laci</string>
|
||||
<string name="drawer_item_activities">Aktivitas</string>
|
||||
<string name="drawer_item_all_files">Semua berkas</string>
|
||||
<string name="drawer_item_assistant">Asisten</string>
|
||||
<string name="drawer_item_favorites">Disukai</string>
|
||||
<string name="drawer_item_gallery">Media</string>
|
||||
<string name="drawer_item_groupfolders">Folder kelompok</string>
|
||||
<string name="drawer_item_home">Beranda</string>
|
||||
<string name="drawer_item_notifications">Pemberitahuan</string>
|
||||
<string name="drawer_item_on_device">Dalam perangkat</string>
|
||||
<string name="drawer_item_personal_files">Berkas pribadi</string>
|
||||
<string name="drawer_item_recently_modified">Baru diubah</string>
|
||||
<string name="drawer_item_shared">Dibagikan</string>
|
||||
<string name="drawer_item_trashbin">Berkas terhapus</string>
|
||||
|
@ -241,6 +273,7 @@ Otomatis unggah hanya bekerja dengan baik apabila Anda mengeluarkan aplikasi ini
|
|||
<string name="drawer_synced_folders">Unggah otomatis.</string>
|
||||
<string name="e2e_not_yet_setup">E2E belum dipersiapkan</string>
|
||||
<string name="e2e_offline">Tidak bisa dilakukan tanpa koneksi internet</string>
|
||||
<string name="ecosystem_apps_display_assistant">Asisten</string>
|
||||
<string name="ecosystem_apps_display_more">Lainnya</string>
|
||||
<string name="ecosystem_apps_display_notes">Catatan</string>
|
||||
<string name="ecosystem_apps_display_talk">Talk</string>
|
||||
|
@ -270,6 +303,7 @@ Otomatis unggah hanya bekerja dengan baik apabila Anda mengeluarkan aplikasi ini
|
|||
<string name="error_choosing_date">Terjadi kesalahan dalam memilih tanggal</string>
|
||||
<string name="error_comment_file">Error saat mengomentari file</string>
|
||||
<string name="error_creating_file_from_template">Galat saat membuat berkas dari templat</string>
|
||||
<string name="error_file_actions">Kesalahan menampilkan aksi berkas</string>
|
||||
<string name="error_file_lock">Error saat mengubah status kunci file</string>
|
||||
<string name="error_report_issue_action">Laporan</string>
|
||||
<string name="error_retrieving_file">Galat saat menerima file</string>
|
||||
|
@ -278,6 +312,7 @@ Otomatis unggah hanya bekerja dengan baik apabila Anda mengeluarkan aplikasi ini
|
|||
<string name="error_starting_direct_camera_upload">Galat saat mengaktifkan kamera</string>
|
||||
<string name="error_starting_doc_scan">Galat memulai pemindaian dokumen</string>
|
||||
<string name="etm_accounts">Akun</string>
|
||||
<string name="etm_background_job_created">Dibuat</string>
|
||||
<string name="etm_background_job_name">Nama pekerjaan</string>
|
||||
<string name="etm_background_job_progress">Kemajuan</string>
|
||||
<string name="etm_background_job_state">Kondisi</string>
|
||||
|
|
|
@ -37,9 +37,12 @@
|
|||
<string name="app_widget_description">ダッシュボードから一つのウィジェットを表示</string>
|
||||
<string name="appbar_search_in">%s の中を検索</string>
|
||||
<string name="assistant_screen_all_task_type">すべて</string>
|
||||
<string name="assistant_screen_create_task_alert_dialog_input_field_placeholder">テキストを入力</string>
|
||||
<string name="assistant_screen_failed_task_text">失敗</string>
|
||||
<string name="assistant_screen_successful_task_text">完了</string>
|
||||
<string name="assistant_screen_unknown_task_status_text">不明</string>
|
||||
<string name="assistant_task_detail_screen_input_button_title">入力</string>
|
||||
<string name="assistant_task_detail_screen_output_button_title">出力</string>
|
||||
<string name="associated_account_not_found">関連付けられたアカウントが見つかりません!</string>
|
||||
<string name="auth_access_failed">アクセスに失敗しました: %1$s</string>
|
||||
<string name="auth_account_does_not_exist">このアカウントはまだこのデバイスに追加されていません</string>
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
<string name="action_send_share">Wyślij/Udostępnij</string>
|
||||
<string name="action_switch_grid_view">Widok siatki</string>
|
||||
<string name="action_switch_list_view">Widok listy</string>
|
||||
<string name="actionbar_calendar_contacts_restore">Przywróć kontakty i kalendarz</string>
|
||||
<string name="actionbar_mkdir">Nowy katalog</string>
|
||||
<string name="actionbar_move_or_copy">Przenieś lub kopiuj</string>
|
||||
<string name="actionbar_open_with">Otwórz za pomocą</string>
|
||||
|
@ -36,10 +37,27 @@
|
|||
<string name="app_widget_description">Pokazuje jeden widżet z pulpitu nawigacyjnego</string>
|
||||
<string name="appbar_search_in">Szukaj w %s</string>
|
||||
<string name="assistant_screen_all_task_type">Wszystkie</string>
|
||||
<string name="assistant_screen_create_task_alert_dialog_input_field_placeholder">Wpisz jakiś tekst</string>
|
||||
<string name="assistant_screen_delete_task_alert_dialog_description">Czy na pewno chcesz usunąć to zadanie?</string>
|
||||
<string name="assistant_screen_delete_task_alert_dialog_title">Usuń zadanie</string>
|
||||
<string name="assistant_screen_failed_task_text">Nie powiodło się</string>
|
||||
<string name="assistant_screen_loading">Trwa wczytywanie listy zadań. Proszę czekać</string>
|
||||
<string name="assistant_screen_no_task_available_for_all_task_filter_text">Brak dostępnych zadań. Wybierz typ zadania, aby utworzyć nowe zadanie.</string>
|
||||
<string name="assistant_screen_no_task_available_text">Brak dostępnych zadań dla typu zadania %s. Możesz utworzyć nowe zadanie w prawym dolnym rogu.</string>
|
||||
<string name="assistant_screen_running_task_text">W trakcie</string>
|
||||
<string name="assistant_screen_scheduled_task_status_text">Zaplanowane</string>
|
||||
<string name="assistant_screen_successful_task_text">Zakończone</string>
|
||||
<string name="assistant_screen_task_create_fail_message">Wystąpił błąd podczas tworzenia zadania</string>
|
||||
<string name="assistant_screen_task_create_success_message">Zadanie pomyślnie utworzone</string>
|
||||
<string name="assistant_screen_task_delete_fail_message">Wystąpił błąd podczas usuwania zadania</string>
|
||||
<string name="assistant_screen_task_delete_success_message">Zadanie pomyślnie usunięte</string>
|
||||
<string name="assistant_screen_task_list_error_state_message">Nie można pobrać listy zadań. Sprawdź swoje połączenie internetowe.</string>
|
||||
<string name="assistant_screen_task_more_actions_bottom_sheet_delete_action">Usuń zadanie</string>
|
||||
<string name="assistant_screen_task_types_error_state_message">Nie można pobrać typów zadań. Sprawdź swoje połączenie internetowe.</string>
|
||||
<string name="assistant_screen_top_bar_title">Asystent</string>
|
||||
<string name="assistant_screen_unknown_task_status_text">Nieznany</string>
|
||||
<string name="assistant_task_detail_screen_input_button_title">Wejście</string>
|
||||
<string name="assistant_task_detail_screen_output_button_title">Wyjście</string>
|
||||
<string name="associated_account_not_found">Nie znaleziono powiązanego konta!</string>
|
||||
<string name="auth_access_failed">Dostęp nieudany: %1$s</string>
|
||||
<string name="auth_account_does_not_exist">Konto nie jest jeszcze dodane na tym urządzeniu</string>
|
||||
|
@ -78,9 +96,11 @@
|
|||
<string name="autoupload_custom_folder">Ustaw własny katalog</string>
|
||||
<string name="autoupload_disable_power_save_check">Wyłącz kontrolę oszczędzania energii</string>
|
||||
<string name="autoupload_hide_folder">Ukryj katalog</string>
|
||||
<string name="autoupload_worker_foreground_info">Przygotowanie do automatycznego przesyłania</string>
|
||||
<string name="avatar">Awatar</string>
|
||||
<string name="away">Bezczynny</string>
|
||||
<string name="backup_settings">Ustawienia kopii zapasowej</string>
|
||||
<string name="backup_title">Kopia zapasowa kontaktów i kalendarza</string>
|
||||
<string name="battery_optimization_close">Zamknij</string>
|
||||
<string name="battery_optimization_disable">Wyłącz</string>
|
||||
<string name="battery_optimization_message">Twoje urządzenie może mieć włączoną optymalizację baterii. Automatyczne wysyłanie działa poprawnie tylko wtedy, gdy wykluczysz z niej tę aplikację.</string>
|
||||
|
@ -152,6 +172,7 @@
|
|||
<string name="confirmation_remove_folder_alert">Czy na pewno chcesz usunąć %1$s wraz z zawartością?</string>
|
||||
<string name="confirmation_remove_folders_alert">Czy na pewno chcesz usunąć wybrane pozycje i ich zawartość?</string>
|
||||
<string name="confirmation_remove_local">Tylko lokalnie</string>
|
||||
<string name="conflict_dialog_error">Nie można utworzyć okna dialogowego rozwiązywania konfliktów</string>
|
||||
<string name="conflict_file_headline">Plik powodujący konflikt %1$s</string>
|
||||
<string name="conflict_local_file">Plik lokalny</string>
|
||||
<string name="conflict_message_description">Jeśli wybierzesz obie wersje, to do nazwy pliku lokalnego zostanie dodany numer.</string>
|
||||
|
@ -221,22 +242,28 @@
|
|||
<string name="downloader_download_failed_credentials_error">Pobieranie nieudane, zaloguj się ponownie</string>
|
||||
<string name="downloader_download_failed_ticker">Pobieranie nie powiodło się</string>
|
||||
<string name="downloader_download_file_not_found">Ten plik nie jest już dostępny na serwerze</string>
|
||||
<string name="downloader_download_in_progress">%1$d%%%2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Pobieranie %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Pobieranie…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s pobrano</string>
|
||||
<string name="downloader_download_succeeded_ticker">Pobrano</string>
|
||||
<string name="downloader_file_download_cancelled">Niektóre pliki zostały anulowane podczas pobierania przez użytkownika</string>
|
||||
<string name="downloader_file_download_failed">Wystąpił błąd podczas pobierania plików</string>
|
||||
<string name="downloader_not_downloaded_yet">Jeszcze nie pobrane</string>
|
||||
<string name="downloader_unexpected_error">Wystąpił nieoczekiwany błąd podczas pobierania plików</string>
|
||||
<string name="drawer_close">Zamknij pasek boczny</string>
|
||||
<string name="drawer_community">Społeczność</string>
|
||||
<string name="drawer_header_background">Tło nagłówka menu rozwijanego</string>
|
||||
<string name="drawer_item_activities">Aktywność</string>
|
||||
<string name="drawer_item_all_files">Wszystkie pliki</string>
|
||||
<string name="drawer_item_assistant">Asystent</string>
|
||||
<string name="drawer_item_favorites">Ulubione</string>
|
||||
<string name="drawer_item_gallery">Media</string>
|
||||
<string name="drawer_item_groupfolders">Katalog grupowy</string>
|
||||
<string name="drawer_item_home">Start</string>
|
||||
<string name="drawer_item_notifications">Powiadomienia</string>
|
||||
<string name="drawer_item_on_device">Na urządzeniu</string>
|
||||
<string name="drawer_item_personal_files">Pliki osobiste</string>
|
||||
<string name="drawer_item_recently_modified">Ostatnio modyfikowane</string>
|
||||
<string name="drawer_item_shared">Udostępnione</string>
|
||||
<string name="drawer_item_trashbin">Usunięte pliki</string>
|
||||
|
@ -248,6 +275,7 @@
|
|||
<string name="drawer_synced_folders">Automatyczne wysyłanie</string>
|
||||
<string name="e2e_not_yet_setup">E2E jeszcze nie skonfigurowane</string>
|
||||
<string name="e2e_offline">Niemożliwe bez połączenia z internetem</string>
|
||||
<string name="ecosystem_apps_display_assistant">Asystent</string>
|
||||
<string name="ecosystem_apps_display_more">Więcej</string>
|
||||
<string name="ecosystem_apps_display_notes">Notatki</string>
|
||||
<string name="ecosystem_apps_display_talk">Talk</string>
|
||||
|
@ -840,6 +868,8 @@
|
|||
<string name="updating_share_failed">Zmiana udostępniania nie powiodła się</string>
|
||||
<string name="upload_action_failed_clear">Wyczyść nieudane wysyłanie</string>
|
||||
<string name="upload_action_failed_retry">Ponów nieudane wysyłanie</string>
|
||||
<string name="upload_action_global_upload_pause">Wstrzymaj wszystkie przesyłania</string>
|
||||
<string name="upload_action_global_upload_resume">Wznów wszystkie przesyłania</string>
|
||||
<string name="upload_cannot_create_file">Nie można utworzyć pliku lokalnego</string>
|
||||
<string name="upload_chooser_title">Wyślij plik z…</string>
|
||||
<string name="upload_content_from_other_apps">Wyślij z innej aplikacji</string>
|
||||
|
@ -851,6 +881,7 @@
|
|||
<string name="upload_file_dialog_filetype_snippet_text">Fragment tekstu plik(.txt)</string>
|
||||
<string name="upload_file_dialog_title">Wprowadź nazwę i typ pliku do wysłania</string>
|
||||
<string name="upload_files">Wyślij pliki</string>
|
||||
<string name="upload_global_pause_title">Wszystkie przesyłania zostały wstrzymane</string>
|
||||
<string name="upload_item_action_button">Przycisk wysyłania elementu</string>
|
||||
<string name="upload_list_delete">Usuń</string>
|
||||
<string name="upload_list_empty_headline">Brak wysłanych plików</string>
|
||||
|
@ -859,6 +890,7 @@
|
|||
<string name="upload_local_storage_full">Pamięć lokalna pełna</string>
|
||||
<string name="upload_local_storage_not_copied">Nie można skopiować pliku do lokalnej pamięci</string>
|
||||
<string name="upload_lock_failed">Nie udało się zablokować katalogu</string>
|
||||
<string name="upload_manually_cancelled">Przesyłanie zostało anulowane przez użytkownika</string>
|
||||
<string name="upload_old_android">Szyfrowanie jest możliwe tylko przy >= Android 5.0</string>
|
||||
<string name="upload_query_move_foreign_files">Brak wystarczającego miejsca, aby skopiować wybrane pliki do katalogu %1$s. Czy chcesz je tam przenieść?</string>
|
||||
<string name="upload_quota_exceeded">Limit przekroczony</string>
|
||||
|
@ -876,6 +908,7 @@
|
|||
<string name="uploader_file_not_found_message">Plik nie znaleziony. Czy jesteś pewien, że ten plik istnieje lub poprzedni konflikt został rozwiązany?</string>
|
||||
<string name="uploader_file_not_found_on_server_message">Nie mogliśmy odnaleźć pliku na serwerze. Inny użytkownik mógł usunąć plik</string>
|
||||
<string name="uploader_info_dirname">Nazwa katalogu</string>
|
||||
<string name="uploader_local_files_uploaded">Spróbuj ponownie przesłać pliki lokalne, które nie powiodły się</string>
|
||||
<string name="uploader_top_message">Wybierz katalog do wysłania</string>
|
||||
<string name="uploader_upload_failed_content_single">Nie udało się wysłać %1$s</string>
|
||||
<string name="uploader_upload_failed_credentials_error">Wysyłanie nie powiodło się, zaloguj się ponownie</string>
|
||||
|
@ -888,6 +921,7 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Zachowaj plik w katalogu źródłowym</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Skasuj plik z katalogu źródłowego</string>
|
||||
<string name="uploader_upload_forbidden_permissions">do wysłania do tego katalogu</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%%%2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% Wysyłanie %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Wysyłanie…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">Wysłano %1$s</string>
|
||||
|
@ -913,6 +947,7 @@
|
|||
<string name="uploads_view_upload_status_fetching_server_version">Pobieram wersję serwera…</string>
|
||||
<string name="uploads_view_upload_status_service_interrupted">Aplikacja została zatrzymana</string>
|
||||
<string name="uploads_view_upload_status_succeeded">Ukończono</string>
|
||||
<string name="uploads_view_upload_status_succeeded_same_file">Ten sam plik znaleziony zdalnie, pomijanie przesyłania</string>
|
||||
<string name="uploads_view_upload_status_unknown_fail">Nieznany błąd</string>
|
||||
<string name="uploads_view_upload_status_virus_detected">Wykryto wirusa. Wysyłanie nie może być ukończone!</string>
|
||||
<string name="uploads_view_upload_status_waiting_exit_power_save_mode">Oczekiwanie na wyjście z trybu oszczędzania energii</string>
|
||||
|
|
|
@ -56,6 +56,8 @@
|
|||
<string name="assistant_screen_task_types_error_state_message">Nie je možné načítať typy úloh, skontrolujte svoje internetové pripojenie.</string>
|
||||
<string name="assistant_screen_top_bar_title">Asistent</string>
|
||||
<string name="assistant_screen_unknown_task_status_text">Neznámy</string>
|
||||
<string name="assistant_task_detail_screen_input_button_title">Vstup</string>
|
||||
<string name="assistant_task_detail_screen_output_button_title">Výstup</string>
|
||||
<string name="associated_account_not_found">Priradený účet sa nenašiel</string>
|
||||
<string name="auth_access_failed">Prístup zamietnutý: %1$s</string>
|
||||
<string name="auth_account_does_not_exist">Účet zatiaľ v zariadení neexistuje</string>
|
||||
|
@ -170,6 +172,7 @@
|
|||
<string name="confirmation_remove_folder_alert">Naozaj chcete odstrániť %1$s a jeho obsah?</string>
|
||||
<string name="confirmation_remove_folders_alert">Naozaj chcete odstrániť vybraté položky a ich obsah?</string>
|
||||
<string name="confirmation_remove_local">Iba lokálne</string>
|
||||
<string name="conflict_dialog_error">Dialógové okno riešenia konfliktov nemožno vytvoriť</string>
|
||||
<string name="conflict_file_headline">Konfliktný súbor %1$s</string>
|
||||
<string name="conflict_local_file">Lokálny súbor</string>
|
||||
<string name="conflict_message_description">Ak vyberiete obe verzie, miestny súbor bude mať k svojmu názvu pridané číslo.</string>
|
||||
|
|
|
@ -334,6 +334,9 @@
|
|||
<string name="auth_account_does_not_exist">The account is not added on this device yet</string>
|
||||
<string name="auth_access_failed">Access failed: %1$s</string>
|
||||
|
||||
<string name="authenticator_activity_cancel_login">Cancel Login</string>
|
||||
<string name="authenticator_activity_please_complete_login_process">Please complete login process in your browser</string>
|
||||
|
||||
<string name="favorite">Add to favorites</string>
|
||||
<string name="unset_favorite">Remove from favourites</string>
|
||||
<string name="encrypted">Set as encrypted</string>
|
||||
|
|
|
@ -5316,22 +5316,6 @@
|
|||
<sha256 value="fb90434eefdf0540aa685dd01c8605c8f65d5a0f44e5713cd65e9f75a0c89038" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="com.github.nextcloud" name="android-library" version="b74aee55088548deb9f596c5a34a9644db878785">
|
||||
<artifact name="android-library-b74aee55088548deb9f596c5a34a9644db878785.aar">
|
||||
<sha256 value="638229c571aea3f28168a84323307806c34ef6e90459242ff115add9c6ca4a67" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
<artifact name="android-library-b74aee55088548deb9f596c5a34a9644db878785.module">
|
||||
<sha256 value="c7b9aca49ea2f717abd220c8411e0c513753b0de32eb59dd2a9fd68c1bff689a" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="com.github.nextcloud" name="android-library" version="b8e979dc1f94632d8d772fe9d0f47b094b145279">
|
||||
<artifact name="android-library-b8e979dc1f94632d8d772fe9d0f47b094b145279.aar">
|
||||
<sha256 value="adec67393e6d6a05d1d96ed4e4dd2e675999e43ca544ea069cee1dbac4d3132c" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
<artifact name="android-library-b8e979dc1f94632d8d772fe9d0f47b094b145279.module">
|
||||
<sha256 value="dbf4aa8cb703b7282d6087795e69e8ebfe25ab8e6796f1f88d937208ad1d7641" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="com.github.nextcloud" name="android-library" version="be87ba7948ba2067eaa6193b6c02f5e85b5bfdf1">
|
||||
<artifact name="android-library-be87ba7948ba2067eaa6193b6c02f5e85b5bfdf1.aar">
|
||||
<sha256 value="55469f2cbaafc625115fe68a2ba1104af007b5a3bd828f388ce909ba76ba0f72" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
|
@ -5340,62 +5324,6 @@
|
|||
<sha256 value="66afb9f2eea39427f6f03c14c5b82ca240157e22b8b2a764f0a7c8ad87cb2d3e" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="com.github.nextcloud" name="android-library" version="c4b285a988bd5dfa0d243983688a0d4768af1f0e">
|
||||
<artifact name="android-library-c4b285a988bd5dfa0d243983688a0d4768af1f0e.aar">
|
||||
<sha256 value="55469f2cbaafc625115fe68a2ba1104af007b5a3bd828f388ce909ba76ba0f72" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
<artifact name="android-library-c4b285a988bd5dfa0d243983688a0d4768af1f0e.module">
|
||||
<sha256 value="029d02160e440e1943e698ec76ebb1cc5a3958ece404df02781c4227dbb28f39" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="com.github.nextcloud" name="android-library" version="db4f4b4bc9259c081306c2716f9f1417d7f65709">
|
||||
<artifact name="android-library-db4f4b4bc9259c081306c2716f9f1417d7f65709.aar">
|
||||
<sha256 value="4d4dde663ce61bea1d2ef519d2a7b02cfed56c49fe8bddd3a96a61e4ee49de27" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
<artifact name="android-library-db4f4b4bc9259c081306c2716f9f1417d7f65709.module">
|
||||
<sha256 value="a8de17c3f6d372e0ac67298de44352640b64d471fc24aff8eab8bc0eb30e8997" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="com.github.nextcloud" name="android-library" version="e4b7de004b43bf93a232725940bc10afdc00b667">
|
||||
<artifact name="android-library-e4b7de004b43bf93a232725940bc10afdc00b667.aar">
|
||||
<sha256 value="4d4dde663ce61bea1d2ef519d2a7b02cfed56c49fe8bddd3a96a61e4ee49de27" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
<artifact name="android-library-e4b7de004b43bf93a232725940bc10afdc00b667.module">
|
||||
<sha256 value="2a6202ce274208c71a58ca641eabe1feb04d727d68d601b7b05b7e2130a0e097" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="com.github.nextcloud" name="android-library" version="e66304e2daa2a30886f7e7764452987679533a66">
|
||||
<artifact name="android-library-e66304e2daa2a30886f7e7764452987679533a66.aar">
|
||||
<sha256 value="9c3a87487717acd878305a00f0d6f2337b9f5512d541f7ac46b9bdb5a53020b9" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
<artifact name="android-library-e66304e2daa2a30886f7e7764452987679533a66.module">
|
||||
<sha256 value="07b04264e680f2f1b2e6eba2b9318ef7f6ea1a558ea52c6d6811d6e5f7225ca6" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="com.github.nextcloud" name="android-library" version="e9f238dfcdd97a6c029e240d9fa0e5d4d1ae1d11">
|
||||
<artifact name="android-library-e9f238dfcdd97a6c029e240d9fa0e5d4d1ae1d11.aar">
|
||||
<sha256 value="2bae1a11ea687d92fcf6a76a52f4c20ee338e710d2281ce4cd8cae5d1e108151" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
<artifact name="android-library-e9f238dfcdd97a6c029e240d9fa0e5d4d1ae1d11.module">
|
||||
<sha256 value="3a52f7305e1aa77f82fb1d658cc9f2482269ce11f8f774bec407a7b5e59504f0" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="com.github.nextcloud" name="android-library" version="f50e8e39bda03afdfa8a105bc2c322a698c4b1e5">
|
||||
<artifact name="android-library-f50e8e39bda03afdfa8a105bc2c322a698c4b1e5.aar">
|
||||
<sha256 value="adec67393e6d6a05d1d96ed4e4dd2e675999e43ca544ea069cee1dbac4d3132c" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
<artifact name="android-library-f50e8e39bda03afdfa8a105bc2c322a698c4b1e5.module">
|
||||
<sha256 value="06c47f7f6cb789960ec4b327d4194d8a4004914fec1b104bb5ed13ab249ac891" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="com.github.nextcloud" name="android-library" version="f8bebf237680bb04a566c9555776a035f8040a4e">
|
||||
<artifact name="android-library-f8bebf237680bb04a566c9555776a035f8040a4e.aar">
|
||||
<sha256 value="7592d0d821f8698b511b9038c526c19880a1965347b2b5500f9b8e19697711ae" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
<artifact name="android-library-f8bebf237680bb04a566c9555776a035f8040a4e.module">
|
||||
<sha256 value="894eb942a5ab5368718f3402a38a9f34893d8f4e61118596ba0baf6ab12772bd" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="com.github.nextcloud" name="android-library" version="fb3552a4322c83ed32bbbdfa988fa2c16dba529a">
|
||||
<artifact name="android-library-fb3552a4322c83ed32bbbdfa988fa2c16dba529a.aar">
|
||||
<sha256 value="bdc44e874f1e14338213ae5723e71710940a31416ff1c52c9eb2f282e5d3f29a" origin="Generated by Gradle" reason="Artifact is not signed"/>
|
||||
|
|
Loading…
Reference in a new issue