1
mirror of https://github.com/m2049r/xmrwallet synced 2025-09-03 08:23:04 +02:00

Compare commits

...

4 Commits

Author SHA1 Message Date
m2049r
0712efec78 allow seed offset generation & wallet restore (#804) 2022-01-02 20:50:07 +01:00
Katant Savelev
341df6c6a3 Update RU translation (#798)
* Update help.xml

* Update strings.xml
2022-01-02 14:10:33 +01:00
m2049r
ab8fb82c1b fix unit tests (#803) 2022-01-02 14:07:23 +01:00
m2049r
22d9173cea store only through service & setPassword (#802) 2022-01-02 13:05:46 +01:00
46 changed files with 468 additions and 176 deletions

View File

@@ -8,8 +8,8 @@ android {
applicationId "com.m2049r.xmrwallet"
minSdkVersion 21
targetSdkVersion 30
versionCode 1201
versionName "2.2.1 'René'"
versionCode 1301
versionName "2.3.1 'Doménikos'"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {

View File

@@ -229,7 +229,7 @@ std::vector<std::string> java2cpp(JNIEnv *env, jobject arrayList) {
return result;
}
jobject cpp2java(JNIEnv *env, const std::vector<std::string>& vector) {
jobject cpp2java(JNIEnv *env, const std::vector<std::string> &vector) {
jmethodID java_util_ArrayList_ = env->GetMethodID(class_ArrayList, "<init>", "(I)V");
jmethodID java_util_ArrayList_add = env->GetMethodID(class_ArrayList, "add",
@@ -301,12 +301,13 @@ Java_com_m2049r_xmrwallet_model_WalletManager_openWalletJ(JNIEnv *env, jobject i
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_recoveryWalletJ(JNIEnv *env, jobject instance,
jstring path, jstring password,
jstring mnemonic,
jstring mnemonic, jstring offset,
jint networkType,
jlong restoreHeight) {
const char *_path = env->GetStringUTFChars(path, nullptr);
const char *_password = env->GetStringUTFChars(password, nullptr);
const char *_mnemonic = env->GetStringUTFChars(mnemonic, nullptr);
const char *_offset = env->GetStringUTFChars(offset, nullptr);
Monero::NetworkType _networkType = static_cast<Monero::NetworkType>(networkType);
Bitmonero::Wallet *wallet =
@@ -315,11 +316,14 @@ Java_com_m2049r_xmrwallet_model_WalletManager_recoveryWalletJ(JNIEnv *env, jobje
std::string(_password),
std::string(_mnemonic),
_networkType,
(uint64_t) restoreHeight);
(uint64_t) restoreHeight,
1, // kdf_rounds
std::string(_offset));
env->ReleaseStringUTFChars(path, _path);
env->ReleaseStringUTFChars(password, _password);
env->ReleaseStringUTFChars(mnemonic, _mnemonic);
env->ReleaseStringUTFChars(offset, _offset);
return reinterpret_cast<jlong>(wallet);
}
@@ -533,7 +537,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_resolveOpenAlias(JNIEnv *env, jobj
JNIEXPORT jboolean JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_setProxy(JNIEnv *env, jobject instance,
jstring address) {
jstring address) {
const char *_address = env->GetStringUTFChars(address, nullptr);
bool rc =
Bitmonero::WalletManagerFactory::getWalletManager()->setProxy(std::string(_address));
@@ -570,9 +574,12 @@ Java_com_m2049r_xmrwallet_model_WalletManager_closeJ(JNIEnv *env, jobject instan
/**********************************/
JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getSeed(JNIEnv *env, jobject instance) {
Java_com_m2049r_xmrwallet_model_Wallet_getSeed(JNIEnv *env, jobject instance, jstring seedOffset) {
const char *_seedOffset = env->GetStringUTFChars(seedOffset, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
return env->NewStringUTF(wallet->seed().c_str());
jstring seed = env->NewStringUTF(wallet->seed(std::string(_seedOffset)).c_str());
env->ReleaseStringUTFChars(seedOffset, _seedOffset);
return seed;
}
JNIEXPORT jstring JNICALL
@@ -740,7 +747,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_getConnectionStatusJ(JNIEnv *env, jobject
JNIEXPORT jboolean JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_setProxy(JNIEnv *env, jobject instance,
jstring address) {
jstring address) {
const char *_address = env->GetStringUTFChars(address, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
bool rc = wallet->setProxy(std::string(_address));
@@ -1262,7 +1269,7 @@ jobject newTransactionInfo(JNIEnv *env, Bitmonero::TransactionInfo *info) {
#include <stdio.h>
#include <stdlib.h>
jobject cpp2java(JNIEnv *env, const std::vector<Bitmonero::TransactionInfo *>& vector) {
jobject cpp2java(JNIEnv *env, const std::vector<Bitmonero::TransactionInfo *> &vector) {
jmethodID java_util_ArrayList_ = env->GetMethodID(class_ArrayList, "<init>", "(I)V");
jmethodID java_util_ArrayList_add = env->GetMethodID(class_ArrayList, "add",

View File

@@ -81,6 +81,9 @@ public class GenerateFragment extends Fragment {
private TextInputLayout etWalletRestoreHeight;
private Button bGenerate;
private Button bSeedOffset;
private TextInputLayout etSeedOffset;
private String type = null;
private void clearErrorOnTextEntry(final TextInputLayout textInputLayout) {
@@ -118,6 +121,8 @@ public class GenerateFragment extends Fragment {
etWalletSpendKey = view.findViewById(R.id.etWalletSpendKey);
etWalletRestoreHeight = view.findViewById(R.id.etWalletRestoreHeight);
bGenerate = view.findViewById(R.id.bGenerate);
bSeedOffset = view.findViewById(R.id.bSeedOffset);
etSeedOffset = view.findViewById(R.id.etSeedOffset);
etWalletAddress.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
etWalletViewKey.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
@@ -222,6 +227,8 @@ public class GenerateFragment extends Fragment {
}
return false;
});
bSeedOffset.setVisibility(View.VISIBLE);
bSeedOffset.setOnClickListener(v -> toggleSeedOffset());
break;
case TYPE_KEY:
case TYPE_VIEWONLY:
@@ -288,6 +295,18 @@ public class GenerateFragment extends Fragment {
return view;
}
void toggleSeedOffset() {
if (etSeedOffset.getVisibility() == View.VISIBLE) {
etSeedOffset.getEditText().getText().clear();
etSeedOffset.setVisibility(View.GONE);
bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_down_24, 0, 0, 0);
} else {
etSeedOffset.setVisibility(View.VISIBLE);
bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_up_24, 0, 0, 0);
etSeedOffset.requestFocusFromTouch();
}
}
private boolean checkName() {
String name = etWalletName.getEditText().getText().toString();
boolean ok = true;
@@ -422,12 +441,13 @@ public class GenerateFragment extends Fragment {
break;
case TYPE_SEED:
if (!checkMnemonic()) return;
String seed = etWalletMnemonic.getEditText().getText().toString();
final String seed = etWalletMnemonic.getEditText().getText().toString();
bGenerate.setEnabled(false);
if (fingerprintAuthAllowed) {
KeyStoreHelper.saveWalletUserPass(requireActivity(), name, password);
}
activityCallback.onGenerate(name, crazyPass, seed, height);
final String offset = etSeedOffset.getEditText().getText().toString();
activityCallback.onGenerate(name, crazyPass, seed, offset, height);
break;
case TYPE_LEDGER:
bGenerate.setEnabled(false);
@@ -491,7 +511,7 @@ public class GenerateFragment extends Fragment {
public interface Listener {
void onGenerate(String name, String password);
void onGenerate(String name, String password, String seed, long height);
void onGenerate(String name, String password, String seed, String offset, long height);
void onGenerate(String name, String password, String address, String viewKey, String spendKey, long height);

View File

@@ -929,7 +929,8 @@ public class LoginActivity extends BaseActivity
}
@Override
public void onGenerate(final String name, final String password, final String seed,
public void onGenerate(final String name, final String password,
final String seed, final String offset,
final long restoreHeight) {
createWallet(name, password,
new WalletCreator() {
@@ -941,7 +942,7 @@ public class LoginActivity extends BaseActivity
@Override
public boolean createWallet(File aFile, String password) {
Wallet newWallet = WalletManager.getInstance()
.recoveryWallet(aFile, password, seed, restoreHeight);
.recoveryWallet(aFile, password, seed, offset, restoreHeight);
return checkAndCloseWallet(newWallet);
}
});

View File

@@ -67,6 +67,8 @@ public class SubaddressFragment extends Fragment implements SubaddressInfoAdapte
void setToolbarButton(int type);
void showSubaddress(View view, final int subaddressIndex);
void saveWallet();
}
public interface ProgressListener {
@@ -217,7 +219,9 @@ public class SubaddressFragment extends Fragment implements SubaddressInfoAdapte
protected Boolean doInBackground(Void... params) {
if (params.length != 0) return false;
wallet.getNewSubaddress();
wallet.store();
if (activityCallback != null) {
activityCallback.saveWallet();
}
return true;
}

View File

@@ -505,6 +505,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
Timber.d("onResume()");
}
@Override
public void saveWallet() {
if (mIsBound) { // no point in talking to unbound service
Intent intent = new Intent(getApplicationContext(), WalletService.class);
@@ -609,9 +610,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
@Override
public void onWalletStored(final boolean success) {
runOnUiThread(() -> {
if (success) {
Toast.makeText(WalletActivity.this, getString(R.string.status_wallet_unloaded), Toast.LENGTH_SHORT).show();
} else {
if (!success) {
Toast.makeText(WalletActivity.this, getString(R.string.status_wallet_unload_failed), Toast.LENGTH_LONG).show();
}
});

View File

@@ -129,7 +129,7 @@ public class Wallet {
ConnectionStatus_WrongVersion
}
public native String getSeed();
public native String getSeed(String offset);
public native String getSeedLanguage();
@@ -147,7 +147,7 @@ public class Wallet {
private native Status statusWithErrorString();
public native boolean setPassword(String password);
public native synchronized boolean setPassword(String password);
public String getAddress() {
return getAddress(accountIndex);
@@ -203,12 +203,10 @@ public class Wallet {
public native String getSecretSpendKey();
public boolean store() {
final boolean ok = store("");
Timber.d("stored");
return ok;
return store("");
}
public native boolean store(String path);
public native synchronized boolean store(String path);
public boolean close() {
disposePendingTransaction();

View File

@@ -124,19 +124,19 @@ public class WalletManager {
private native long openWalletJ(String path, String password, int networkType);
public Wallet recoveryWallet(File aFile, String password, String mnemonic) {
return recoveryWallet(aFile, password, mnemonic, 0);
}
public Wallet recoveryWallet(File aFile, String password, String mnemonic, long restoreHeight) {
long walletHandle = recoveryWalletJ(aFile.getAbsolutePath(), password, mnemonic,
public Wallet recoveryWallet(File aFile, String password,
String mnemonic, String offset,
long restoreHeight) {
long walletHandle = recoveryWalletJ(aFile.getAbsolutePath(), password,
mnemonic, offset,
getNetworkType().getValue(), restoreHeight);
Wallet wallet = new Wallet(walletHandle);
manageWallet(wallet);
return wallet;
}
private native long recoveryWalletJ(String path, String password, String mnemonic,
private native long recoveryWalletJ(String path, String password,
String mnemonic, String offset,
int networkType, long restoreHeight);
public Wallet createWalletWithKeys(File aFile, String password, String language, long restoreHeight,

View File

@@ -323,6 +323,7 @@ public class NetCipherHelper implements StatusCallback {
}
private OkHttpClient getClient() {
if (mockClient != null) return mockClient; // Unit-test mode
final OkHttpClient client = getInstance().client;
if ((username != null) && (!username.isEmpty())) {
final DigestAuthenticator authenticator = new DigestAuthenticator(new Credentials(username, password));
@@ -349,6 +350,9 @@ public class NetCipherHelper implements StatusCallback {
}
return builder.build();
}
// for unit tests only
static public OkHttpClient mockClient = null;
}
private static final String PREFS_NAME = "tor";

View File

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?colorPrimaryVariant"
android:pathData="M12,2C6.47,2 2,6.47 2,12s4.47,10 10,10 10,-4.47 10,-10S17.53,2 12,2zM17,15.59L15.59,17 12,13.41 8.41,17 7,15.59 10.59,12 7,8.41 8.41,7 12,10.59 15.59,7 17,8.41 13.41,12 17,15.59z" />
</vector>

View File

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?colorPrimaryVariant"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?colorPrimaryVariant"
android:pathData="M7.41,8.59L12,13.17l4.59,-4.58L18,10l-6,6 -6,-6 1.41,-1.41z" />
</vector>

View File

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?colorPrimaryVariant"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?colorPrimaryVariant"
android:pathData="M7.41,15.41L12,10.83l4.59,4.58L18,14l-6,-6 -6,6z" />
</vector>

View File

@@ -15,7 +15,6 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first"
app:errorEnabled="true">
<com.google.android.material.textfield.TextInputEditText
@@ -34,7 +33,7 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first"
android:layout_marginTop="@dimen/header_top_first"
app:boxStrokeErrorColor="@color/monerujoPrimary"
app:errorEnabled="true"
app:errorIconDrawable="@drawable/ic_smiley_gunther_filled"
@@ -78,7 +77,7 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first"
android:layout_marginTop="@dimen/header_top_first"
android:visibility="gone"
app:errorEnabled="true">
@@ -92,12 +91,41 @@
android:textAlignment="textStart" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/bSeedOffset"
style="@style/MoneroIconButton.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"
android:background="?android:selectableItemBackground"
android:text="@string/label_seed_offset_encrypt"
app:icon="@drawable/ic_baseline_keyboard_arrow_down_24" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/etSeedOffset"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first"
android:visibility="gone">
<com.google.android.material.textfield.TextInputEditText
style="@style/MoneroEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/seed_offset_hint"
android:inputType="textVisiblePassword"
android:maxLines="1"
android:textAlignment="textStart" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/etWalletAddress"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first"
android:layout_marginTop="@dimen/header_top_first"
android:visibility="gone"
app:counterEnabled="true"
app:counterMaxLength="95"
@@ -118,7 +146,7 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first"
android:layout_marginTop="@dimen/header_top_first"
android:visibility="gone"
app:counterEnabled="true"
app:counterMaxLength="64"
@@ -139,7 +167,7 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first"
android:layout_marginTop="@dimen/header_top_first"
android:visibility="gone"
app:counterEnabled="true"
app:counterMaxLength="64"
@@ -160,7 +188,7 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first"
android:layout_marginTop="@dimen/header_top_first"
android:visibility="gone"
app:errorEnabled="true">
@@ -179,7 +207,7 @@
style="@style/MoneroButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginTop="@dimen/header_top_first"
android:text="@string/generate_buttonGenerate" />
</LinearLayout>

View File

@@ -18,12 +18,11 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
android:visibility="gone" />
android:visibility="invisible" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/header_top">
android:layout_height="wrap_content">
<TextView
style="@style/MoneroLabel.Heading"
@@ -57,7 +56,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/header_top"
android:orientation="vertical"
android:visibility="gone">
android:visibility="visible">
<TextView
style="@style/MoneroLabel.Heading"
@@ -66,15 +65,49 @@
android:layout_gravity="center"
android:text="@string/generate_mnemonic_label" />
<TextView
android:id="@+id/tvWalletMnemonic"
style="@style/MoneroText.Monospace.Mnemonic"
<FrameLayout
android:id="@+id/flWalletMnemonic"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/data_top"
android:background="@drawable/backgound_seed"
android:textAlignment="center"
tools:text="tucks slackens vehicle doctor oaks aloof balding knife rays wise haggled cuisine navy ladder suitcase dusted last thorn pixels karate ticket nibs violin zapped slackens" />
android:layout_marginTop="@dimen/data_top">
<TextView
android:id="@+id/tvWalletMnemonic"
style="@style/MoneroText.Monospace.Mnemonic"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/backgound_seed"
android:textAlignment="center"
tools:text="tucks slackens vehicle doctor oaks aloof balding knife rays wise haggled cuisine navy ladder suitcase dusted last thorn pixels karate ticket nibs violin zapped slackens" />
</FrameLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/bSeedOffset"
style="@style/MoneroIconButton.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="?android:selectableItemBackground"
android:text="@string/label_seed_offset_encrypt"
app:icon="@drawable/ic_baseline_keyboard_arrow_down_24" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/etSeedOffset"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first"
android:visibility="gone">
<com.google.android.material.textfield.TextInputEditText
style="@style/MoneroEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/seed_offset_hint"
android:inputType="textVisiblePassword"
android:maxLines="1"
android:textAlignment="textStart" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<LinearLayout
@@ -148,7 +181,7 @@
android:drawablePadding="4dp"
android:text="@string/label_wallet_advanced_details"
android:visibility="gone"
app:icon="@drawable/ic_add_circle_outline" />
app:icon="@drawable/ic_baseline_keyboard_arrow_down_24" />
<LinearLayout
android:id="@+id/llAdvancedInfo"
@@ -163,7 +196,6 @@
android:id="@+id/llViewKey"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/header_top"
android:orientation="vertical"
android:visibility="gone">

View File

@@ -23,7 +23,7 @@
<string name="label_ok">D\'acord</string>
<string name="label_cancel">Cancel·lar</string>
<string name="label_close">Tancar</string>
<string name="label_wallet_advanced_details">Premi aquí per informació més detallada</string>
<string name="label_wallet_advanced_details">Informació més detallada</string>
<string name="label_send_success">Enviat correctament!</string>
<string name="label_send_done">Fet</string>
@@ -431,4 +431,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -24,7 +24,7 @@
<string name="label_ok">OK</string>
<string name="label_cancel">Abbrechen</string>
<string name="label_close">Schließen</string>
<string name="label_wallet_advanced_details">Berühren für Detailinfos</string>
<string name="label_wallet_advanced_details">Detailinfos</string>
<string name="label_send_success">Erfolgreich gesendet</string>
<string name="label_send_done">Fertig</string>
@@ -432,4 +432,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -22,7 +22,7 @@
<string name="label_ok">OK</string>
<string name="label_cancel">Άκυρο</string>
<string name="label_close">Κλείσιμο</string>
<string name="label_wallet_advanced_details">Πάτησε για λεπτομερείς πληροφορίες</string>
<string name="label_wallet_advanced_details">Λεπτομερείς πληροφορίες</string>
<string name="label_send_success">Αποστολή με επιτυχία</string>
<string name="label_send_done">Έγινε</string>
@@ -433,4 +433,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -23,7 +23,7 @@
<string name="label_ok">OK</string>
<string name="label_cancel">Nuligi</string>
<string name="label_close">Fermi</string>
<string name="label_wallet_advanced_details">Tuŝi por pli detalaj informoj.</string>
<string name="label_wallet_advanced_details">Detalaj informoj</string>
<string name="label_send_success">Sukcese sendis</string>
<string name="label_send_done">Farite</string>
@@ -433,4 +433,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -23,7 +23,7 @@
<string name="label_ok">Aceptar</string>
<string name="label_cancel">Cancelar</string>
<string name="label_close">Cerrar</string>
<string name="label_wallet_advanced_details">Toca para información más detallada</string>
<string name="label_wallet_advanced_details">Información más detallada</string>
<string name="label_send_success">¡Éxito!</string>
<string name="label_send_done">Hecho</string>
@@ -424,4 +424,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -23,7 +23,7 @@
<string name="label_ok">OK</string>
<string name="label_cancel">Katkesta</string>
<string name="label_close">Sulge</string>
<string name="label_wallet_advanced_details">Puuduta lisainfo saamiseks</string>
<string name="label_wallet_advanced_details">Lisainfo</string>
<string name="label_send_success">Edukalt saadetud</string>
<string name="label_send_done">Tehtud</string>
@@ -431,4 +431,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -23,7 +23,7 @@
<string name="label_ok">OK</string>
<string name="label_cancel">Annuler</string>
<string name="label_close">Fermer</string>
<string name="label_wallet_advanced_details">Toucher pour plus d\'infos</string>
<string name="label_wallet_advanced_details">Plus d\'infos</string>
<string name="label_send_success">Envoi réussi</string>
<string name="label_send_done">Fait</string>
@@ -437,4 +437,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -23,7 +23,7 @@
<string name="label_ok">OK</string>
<string name="label_cancel">Mégsem</string>
<string name="label_close">Bezárás</string>
<string name="label_wallet_advanced_details">Koppints a részletes informcáióért</string>
<string name="label_wallet_advanced_details">Részletes információk</string>
<string name="label_send_success">Sikeresen elküldve</string>
<string name="label_send_done">Kész</string>
@@ -435,4 +435,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -23,7 +23,7 @@
<string name="label_ok">OK</string>
<string name="label_cancel">Cancella</string>
<string name="label_close">Chiudi</string>
<string name="label_wallet_advanced_details">Tocca per informazioni dettagliate</string>
<string name="label_wallet_advanced_details">Informazioni dettagliate</string>
<string name="label_send_success">Invio riuscito</string>
<string name="label_send_done">Fatto</string>
@@ -430,10 +430,13 @@
<string name="restore_failed">Importazione fallita!</string>
<string name="menu_deletecache">Resetta portafogli!</string>
<string name="deletecache_alert_message">Il reset del portafogli cancellerà tutte le informazioni locali (note, nomi di account &amp; sottoindirizzi, chiavi di transazione private, ...)! Procedi solo se il portafogli è corrotto e non si carica!</string>
<string name="deletecache_alert_message"><![CDATA[Il reset del portafogli cancellerà tutte le informazioni locali (note, nomi di account & sottoindirizzi, chiavi di transazione private, )! Procedi solo se il portafogli è corrotto e non si carica!]]></string>
<string name="node_tor_error">Tor required</string>
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -23,7 +23,6 @@
<string name="label_ok">OK</string>
<string name="label_cancel">キャンセル</string>
<string name="label_close">閉じる</string>
<string name="label_wallet_advanced_details">タッチして詳細情報を見る</string>
<string name="label_send_success">送金成功</string>
<string name="label_send_done">完了</string>
@@ -436,4 +435,8 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_wallet_advanced_details">タッチして詳細情報を見る</string> <!-- Please chnage to "Detailed information" -->
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -23,7 +23,7 @@
<string name="label_ok">OK</string>
<string name="label_cancel">Avbryt</string>
<string name="label_close">Lukk</string>
<string name="label_wallet_advanced_details">Trykk for detaljert informasjon</string>
<string name="label_wallet_advanced_details">Detaljert informasjon</string>
<string name="label_send_success">Sendt suksessfullt!</string>
<string name="label_send_done">Ferdig</string>
@@ -433,4 +433,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -23,7 +23,7 @@
<string name="label_ok">OK</string>
<string name="label_cancel">Annuleren</string>
<string name="label_close">Sluiten</string>
<string name="label_wallet_advanced_details">Tik voor meer informatie</string>
<string name="label_wallet_advanced_details">Meer informatie</string>
<string name="label_send_success">Verzonden</string>
<string name="label_send_done">Klaar</string>
@@ -433,4 +433,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -23,7 +23,7 @@
<string name="label_ok">OK</string>
<string name="label_cancel">Cancelar</string>
<string name="label_close">Fechar</string>
<string name="label_wallet_advanced_details">Toque para mais detalhes</string>
<string name="label_wallet_advanced_details">Mais detalhes</string>
<string name="label_send_success">Enviado com sucesso</string>
<string name="label_send_done">Concluído</string>
@@ -420,10 +420,13 @@ aqui.</string>
<string name="restore_failed">Importação falhou!</string>
<string name="menu_deletecache">Resetar carteira!</string>
<string name="deletecache_alert_message">Esta carteira será resetada, perdendo todos os dados "off-chain" (como notas, contas &amp; nomes de subendereços, chaves de transações privadas, ...)! Use isso SOMENTE se esta carteira estiver corrompida e não carrega!</string>
<string name="deletecache_alert_message"><![CDATA[Esta carteira será resetada, perdendo todos os dados "off-chain" (como notas, contas & nomes de subendereços, chaves de transações privadas, )! Use isso SOMENTE se esta carteira estiver corrompida e não carrega!]]></string>
<string name="node_tor_error">Tor required</string>
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -23,7 +23,7 @@
<string name="label_ok">OK</string>
<string name="label_cancel">Cancelar</string>
<string name="label_close">Fechar</string>
<string name="label_wallet_advanced_details">Toca para informação detalhada</string>
<string name="label_wallet_advanced_details">Informação detalhada</string>
<string name="label_send_success">Enviado com sucesso</string>
<string name="label_send_done">Feito</string>
@@ -437,4 +437,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -22,7 +22,7 @@
<string name="label_ok">OK</string>
<string name="label_cancel">Anulează</string>
<string name="label_close">Închide</string>
<string name="label_wallet_advanced_details">Atinge pentru informații detaliate</string>
<string name="label_wallet_advanced_details">Informații detaliate</string>
<string name="label_send_success">Trimis cu succes</string>
<string name="label_send_done">Gata</string>
@@ -433,4 +433,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

View File

@@ -298,24 +298,22 @@
<string name="help_ok">Я понял!</string> <!-- Note: "Got it" as in "I understand this" -->
<string name="help_nok">Nah…</string> <!-- Note: "Nah..." as in "I don't want this" -->
<string name="help_getorbot">Get Orbot!</string>
<string name="help_nok">Не…</string> <!-- Note: "Nah..." as in "I don't want this" -->
<string name="help_getorbot">Скачать Orbot!</string>
<string name="help_tor"><![CDATA[
<h1>Tor</h1>
<p>Tor, short for The Onion Router, is free and open-source software for enabling anonymous
communication.</p>
<p>Enabling Tor will route your connection through several relays and hide your IP address
from the node. Keep in mind this is more private but also <b>slower</b>.</p>
<p>In order to use Tor with Monerujo, you\'ll need Orbot installed on your phone. After
installing Orbot, make sure to enable it by clicking the network icon on the wallet list
screen.</p>
<p>If you have issues connecting with Tor, try to get a new Identity in the Orbot App (icon
on the top right).</p>
<p>Tor, сокр. от The Onion Router, бесплатное и программное обеспечение с открытым исходным кодом для обеспечения анонимного общения.</p>
<p>Включение Tor перенаправит подключение к нескольким узлам и скроет IP-адрес от узла.
Имейте в виду, что это более приватно, но и <b>медленнее</b>.</p>
<p>Для того, чтобы использовать Tor с Monerujo, вам понадобится Orbot на вашем телефоне. После установки Orbot убедитесь,
что вы включили его, нажав значок сети на экране списка кошельков.</p>
<p>Если у вас есть проблемы с подключением к Tor, попробуйте получить новую идентичность в приложении Orbot (значок
в правом верхнем углу).</p>
]]></string>
<string name="help_tor_enable"><![CDATA[
<h1>Tor Node</h1>
<p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
<img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
<h1>Tor узел</h1>
<p>Это .onion узел. Для того, чтобы использовать его, вы должны включить Tor, нажав
<img src="ic_network_clearnet"/> значок в верхней части страницы списка кошельков.</p>
]]></string>
</resources>

View File

@@ -23,7 +23,7 @@
<string name="label_ok">Ок</string>
<string name="label_cancel">Отмена</string>
<string name="label_close">Закрыть</string>
<string name="label_wallet_advanced_details">Нажмите для доп. информации</string>
<string name="label_wallet_advanced_details">Дополнительная информация</string>
<string name="label_send_success">Успешно отправлено</string>
<string name="label_send_done">Готово</string>
@@ -431,10 +431,13 @@
<string name="restore_failed">Ошибка импорта!</string>
<string name="menu_deletecache">Сбросить кошелек</string>
<string name="deletecache_alert_message">This wallet will be reset, losing all off-chain data (like notes, account &amp; subaddress names, private transaction keys, &#8230;)! Use this ONLY if this wallet is corrupt and does not load!</string>
<string name="deletecache_alert_message">Этот кошелек будет сброшен, потеряв всю локальную информацию (например: заметки, имена адресов, приватные ключи транзакций, &#8230;)! Используйте это ТОЛЬКО если кошелек поврежден и не загружается!</string>
<string name="node_tor_error">Tor required</string>
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="node_tor_error">Необходим Tor</string>
<string name="node_waiting">\u00A0ОЖИДАНИЕ УЗЛА\u00A0</string>
<string name="tor_enable_background">Необходимо выбрать "Allow Background Starts" в настройках Orbot для использования Tor!</string>
<string name="tor_noshift">SideShift.ai не поддерживает Tor.\nОтключите Tor для обмена XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources>

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