tunnel: remove kernel module downloader
Nathan Chance dropped the ball repeatedly and never maintained this in a consistent way that anybody could use. With Android 12 out now, just drop it all together. A bummer, but I don't see much of a choice. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
parent
447b06ec2c
commit
a03ad51622
@ -53,6 +53,10 @@ public final class WgQuickBackend implements Backend {
|
||||
this.toolsInstaller = toolsInstaller;
|
||||
}
|
||||
|
||||
public static boolean hasKernelSupport() {
|
||||
return new File("/sys/module/wireguard").exists();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getRunningTunnelNames() {
|
||||
final List<String> output = new ArrayList<>();
|
||||
|
@ -1,215 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2019-2020 WireGuard LLC. All Rights Reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package com.wireguard.android.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.system.OsConstants;
|
||||
import android.util.Base64;
|
||||
|
||||
import com.wireguard.android.util.RootShell.RootShellException;
|
||||
import com.wireguard.crypto.Ed25519;
|
||||
import com.wireguard.util.NonNullForAll;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.InvalidParameterException;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* Class that implements the logic for downloading and loading signed, prebuilt modules for
|
||||
* WireGuard into the running kernel.
|
||||
*/
|
||||
@NonNullForAll
|
||||
@SuppressWarnings("MagicNumber")
|
||||
public class ModuleLoader {
|
||||
private static final String MODULE_LIST_URL = "https://download.wireguard.com/android-module/modules.txt.sig";
|
||||
private static final String MODULE_NAME = "wireguard-%s.ko";
|
||||
private static final String MODULE_PUBLIC_KEY_BASE64 = "RWRmHuT9PSqtwfsLtEx+QS06BJtLgFYteL9WCNjH7yuyu5Y1DieSN7If";
|
||||
private static final String MODULE_URL = "https://download.wireguard.com/android-module/%s";
|
||||
private final File moduleDir;
|
||||
private final RootShell rootShell;
|
||||
private final File tmpDir;
|
||||
private final String userAgent;
|
||||
|
||||
/**
|
||||
* Public constructor for ModuleLoader
|
||||
*
|
||||
* @param context A {@link Context} instance.
|
||||
* @param rootShell A {@link RootShell} instance used to run elevated commands required for module
|
||||
* loading.
|
||||
* @param userAgent A {@link String} that represents the User-Agent string used for connections
|
||||
* to the upstream server.
|
||||
*/
|
||||
public ModuleLoader(final Context context, final RootShell rootShell, final String userAgent) {
|
||||
moduleDir = new File(context.getCacheDir(), "kmod");
|
||||
tmpDir = new File(context.getCacheDir(), "tmp");
|
||||
this.rootShell = rootShell;
|
||||
this.userAgent = userAgent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether a WireGuard module is already loaded into the kernel.
|
||||
*
|
||||
* @return boolean indicating if WireGuard is already enabled in the kernel.
|
||||
*/
|
||||
public static boolean isModuleLoaded() {
|
||||
return new File("/sys/module/wireguard").exists();
|
||||
}
|
||||
|
||||
/**
|
||||
* Download the correct WireGuard module for the device
|
||||
*
|
||||
* @return {@link OsConstants}.EXIT_SUCCESS if everything succeeds, ENOENT otherwise.
|
||||
* @throws IOException if the remote hash list was not found or empty.
|
||||
* @throws RootShellException if {@link RootShell} has a failure executing elevated commands.
|
||||
* @throws NoSuchAlgorithmException if SHA256 algorithm is not available in device JDK.
|
||||
*/
|
||||
public Integer download() throws IOException, RootShellException, NoSuchAlgorithmException {
|
||||
final List<String> output = new ArrayList<>();
|
||||
rootShell.run(output, "sha256sum /proc/version|cut -d ' ' -f 1");
|
||||
if (output.size() != 1 || output.get(0).length() != 64)
|
||||
throw new InvalidParameterException("Invalid sha256 of /proc/version");
|
||||
final String moduleName = String.format(MODULE_NAME, output.get(0));
|
||||
HttpURLConnection connection = (HttpURLConnection) new URL(MODULE_LIST_URL).openConnection();
|
||||
connection.setRequestProperty("User-Agent", userAgent);
|
||||
connection.connect();
|
||||
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK)
|
||||
throw new IOException("Hash list could not be found");
|
||||
final byte[] input = new byte[1024 * 1024 * 3 /* 3MiB */];
|
||||
int len;
|
||||
try (final InputStream inputStream = connection.getInputStream()) {
|
||||
int offset = 0;
|
||||
while (input.length - offset > 0 && (len = inputStream.read(input, offset, input.length - offset)) > 0) {
|
||||
offset += len;
|
||||
}
|
||||
len = offset;
|
||||
}
|
||||
if (len <= 0)
|
||||
throw new IOException("Hash list was empty");
|
||||
final Map<String, Sha256Digest> modules = verifySignedHashes(new String(input, 0, len, StandardCharsets.UTF_8));
|
||||
if (modules == null)
|
||||
throw new InvalidParameterException("The signature did not verify or invalid hash list format");
|
||||
if (!modules.containsKey(moduleName))
|
||||
return OsConstants.ENOENT;
|
||||
connection = (HttpURLConnection) new URL(String.format(MODULE_URL, moduleName)).openConnection();
|
||||
connection.setRequestProperty("User-Agent", userAgent);
|
||||
connection.connect();
|
||||
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK)
|
||||
throw new IOException("Module file could not be found, despite being on hash list");
|
||||
|
||||
tmpDir.mkdirs();
|
||||
moduleDir.mkdir();
|
||||
File tempFile = null;
|
||||
try {
|
||||
tempFile = File.createTempFile("UNVERIFIED-", null, tmpDir);
|
||||
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
|
||||
try (final InputStream inputStream = connection.getInputStream();
|
||||
final FileOutputStream outputStream = new FileOutputStream(tempFile)) {
|
||||
int total = 0;
|
||||
while ((len = inputStream.read(input)) > 0) {
|
||||
total += len;
|
||||
if (total > 1024 * 1024 * 15 /* 15 MiB */)
|
||||
throw new IOException("File too big");
|
||||
outputStream.write(input, 0, len);
|
||||
digest.update(input, 0, len);
|
||||
}
|
||||
outputStream.getFD().sync();
|
||||
}
|
||||
if (!Arrays.equals(digest.digest(), modules.get(moduleName).bytes))
|
||||
throw new IOException("Incorrect file hash");
|
||||
|
||||
if (!tempFile.renameTo(new File(moduleDir, moduleName)))
|
||||
throw new IOException("Unable to rename to final destination");
|
||||
} finally {
|
||||
if (tempFile != null)
|
||||
tempFile.delete();
|
||||
}
|
||||
return OsConstants.EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the downloaded module. ModuleLoader#download must be called before this.
|
||||
*
|
||||
* @throws IOException if {@link RootShell} has a failure executing elevated commands.
|
||||
* @throws RootShellException if {@link RootShell} has a failure executing elevated commands.
|
||||
*/
|
||||
public void loadModule() throws IOException, RootShellException {
|
||||
rootShell.run(null, String.format("insmod \"%s/wireguard-$(sha256sum /proc/version|cut -d ' ' -f 1).ko\"", moduleDir.getAbsolutePath()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the module might already exist in the app's data.
|
||||
*
|
||||
* @return boolean indicating whether downloadable module might exist already.
|
||||
*/
|
||||
public boolean moduleMightExist() {
|
||||
return moduleDir.exists() && moduleDir.isDirectory();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private Map<String, Sha256Digest> verifySignedHashes(final String signifyDigest) {
|
||||
byte[] publicKeyBytes = Base64.decode(MODULE_PUBLIC_KEY_BASE64, Base64.DEFAULT);
|
||||
|
||||
if (publicKeyBytes == null || publicKeyBytes.length != 32 + 10 || publicKeyBytes[0] != 'E' || publicKeyBytes[1] != 'd')
|
||||
return null;
|
||||
|
||||
final String[] lines = signifyDigest.split("\n", 3);
|
||||
if (lines.length != 3)
|
||||
return null;
|
||||
if (!lines[0].startsWith("untrusted comment: "))
|
||||
return null;
|
||||
|
||||
byte[] signatureBytes = Base64.decode(lines[1], Base64.DEFAULT);
|
||||
if (signatureBytes == null || signatureBytes.length != 64 + 10)
|
||||
return null;
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
if (signatureBytes[i] != publicKeyBytes[i])
|
||||
return null;
|
||||
}
|
||||
publicKeyBytes = Arrays.copyOfRange(publicKeyBytes, 10, 10 + 32);
|
||||
signatureBytes = Arrays.copyOfRange(signatureBytes, 10, 10 + 64);
|
||||
if (!Ed25519.verify(lines[2].getBytes(StandardCharsets.UTF_8), signatureBytes, publicKeyBytes))
|
||||
return null;
|
||||
|
||||
final Map<String, Sha256Digest> hashes = new HashMap<>();
|
||||
for (final String line : lines[2].split("\n")) {
|
||||
final String[] components = line.split(" {2}", 2);
|
||||
if (components.length != 2)
|
||||
return null;
|
||||
try {
|
||||
hashes.put(components[1], new Sha256Digest(components[0]));
|
||||
} catch (final Exception ignored) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return hashes;
|
||||
}
|
||||
|
||||
private static final class Sha256Digest {
|
||||
private final byte[] bytes;
|
||||
|
||||
private Sha256Digest(final String hex) {
|
||||
if (hex.length() != 64)
|
||||
throw new InvalidParameterException("SHA256 hashes must be 32 bytes long");
|
||||
bytes = new byte[32];
|
||||
for (int i = 0; i < 32; ++i)
|
||||
bytes[i] = (byte) Integer.parseInt(hex.substring(i * 2, i * 2 + 2), 16);
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -21,7 +21,6 @@ import com.wireguard.android.backend.GoBackend
|
||||
import com.wireguard.android.backend.WgQuickBackend
|
||||
import com.wireguard.android.configStore.FileConfigStore
|
||||
import com.wireguard.android.model.TunnelManager
|
||||
import com.wireguard.android.util.ModuleLoader
|
||||
import com.wireguard.android.util.RootShell
|
||||
import com.wireguard.android.util.ToolsInstaller
|
||||
import com.wireguard.android.util.UserKnobs
|
||||
@ -42,7 +41,6 @@ class Application : android.app.Application() {
|
||||
private val futureBackend = CompletableDeferred<Backend>()
|
||||
private val coroutineScope = CoroutineScope(Job() + Dispatchers.Main.immediate)
|
||||
private var backend: Backend? = null
|
||||
private lateinit var moduleLoader: ModuleLoader
|
||||
private lateinit var rootShell: RootShell
|
||||
private lateinit var preferencesDataStore: DataStore<Preferences>
|
||||
private lateinit var toolsInstaller: ToolsInstaller
|
||||
@ -67,15 +65,7 @@ class Application : android.app.Application() {
|
||||
private suspend fun determineBackend(): Backend {
|
||||
var backend: Backend? = null
|
||||
var didStartRootShell = false
|
||||
if (!ModuleLoader.isModuleLoaded() && moduleLoader.moduleMightExist()) {
|
||||
try {
|
||||
rootShell.start()
|
||||
didStartRootShell = true
|
||||
moduleLoader.loadModule()
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
}
|
||||
if (!UserKnobs.disableKernelModule.first() && ModuleLoader.isModuleLoaded()) {
|
||||
if (UserKnobs.enableKernelModule.first() && WgQuickBackend.hasKernelSupport()) {
|
||||
try {
|
||||
if (!didStartRootShell)
|
||||
rootShell.start()
|
||||
@ -100,7 +90,6 @@ class Application : android.app.Application() {
|
||||
super.onCreate()
|
||||
rootShell = RootShell(applicationContext)
|
||||
toolsInstaller = ToolsInstaller(applicationContext, rootShell)
|
||||
moduleLoader = ModuleLoader(applicationContext, rootShell, USER_AGENT)
|
||||
preferencesDataStore = PreferenceDataStoreFactory.create { applicationContext.preferencesDataStoreFile("settings") }
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
|
||||
coroutineScope.launch {
|
||||
@ -140,9 +129,6 @@ class Application : android.app.Application() {
|
||||
@JvmStatic
|
||||
suspend fun getBackend() = get().futureBackend.await()
|
||||
|
||||
@JvmStatic
|
||||
fun getModuleLoader() = get().moduleLoader
|
||||
|
||||
@JvmStatic
|
||||
fun getRootShell() = get().rootShell
|
||||
|
||||
|
@ -17,7 +17,6 @@ import com.wireguard.android.R
|
||||
import com.wireguard.android.backend.WgQuickBackend
|
||||
import com.wireguard.android.preference.PreferencesPreferenceDataStore
|
||||
import com.wireguard.android.util.AdminKnobs
|
||||
import com.wireguard.android.util.ModuleLoader
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
@ -79,30 +78,19 @@ class SettingsActivity : ThemeChangeAwareActivity() {
|
||||
startActivity(Intent(requireContext(), LogViewerActivity::class.java))
|
||||
true
|
||||
}
|
||||
val moduleInstaller = preferenceManager.findPreference<Preference>("module_downloader")
|
||||
val kernelModuleDisabler = preferenceManager.findPreference<Preference>("kernel_module_disabler")
|
||||
moduleInstaller?.isVisible = false
|
||||
if (ModuleLoader.isModuleLoaded()) {
|
||||
moduleInstaller?.parent?.removePreference(moduleInstaller)
|
||||
val kernelModuleEnabler = preferenceManager.findPreference<Preference>("kernel_module_enabler")
|
||||
if (WgQuickBackend.hasKernelSupport()) {
|
||||
lifecycleScope.launch {
|
||||
if (Application.getBackend() !is WgQuickBackend) {
|
||||
try {
|
||||
withContext(Dispatchers.IO) { Application.getRootShell().start() }
|
||||
} catch (_: Throwable) {
|
||||
kernelModuleDisabler?.parent?.removePreference(kernelModuleDisabler)
|
||||
kernelModuleEnabler?.parent?.removePreference(kernelModuleEnabler)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
kernelModuleDisabler?.parent?.removePreference(kernelModuleDisabler)
|
||||
lifecycleScope.launch {
|
||||
try {
|
||||
withContext(Dispatchers.IO) { Application.getRootShell().start() }
|
||||
moduleInstaller?.isVisible = true
|
||||
} catch (_: Throwable) {
|
||||
moduleInstaller?.parent?.removePreference(moduleInstaller)
|
||||
}
|
||||
}
|
||||
kernelModuleEnabler?.parent?.removePreference(kernelModuleEnabler)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
class KernelModuleDisablerPreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
|
||||
class KernelModuleEnablerPreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
|
||||
private var state = State.UNKNOWN
|
||||
|
||||
init {
|
||||
@ -44,10 +44,10 @@ class KernelModuleDisablerPreference(context: Context, attrs: AttributeSet?) : P
|
||||
activity.lifecycleScope.launch {
|
||||
if (state == State.DISABLED) {
|
||||
setState(State.ENABLING)
|
||||
UserKnobs.setDisableKernelModule(false)
|
||||
UserKnobs.setEnableKernelModule(true)
|
||||
} else if (state == State.ENABLED) {
|
||||
setState(State.DISABLING)
|
||||
UserKnobs.setDisableKernelModule(true)
|
||||
UserKnobs.setEnableKernelModule(false)
|
||||
}
|
||||
val observableTunnels = Application.getTunnelManager().getTunnels()
|
||||
val downings = observableTunnels.map { async(SupervisorJob()) { it.setStateAsync(Tunnel.State.DOWN) } }
|
||||
@ -76,13 +76,13 @@ class KernelModuleDisablerPreference(context: Context, attrs: AttributeSet?) : P
|
||||
|
||||
private enum class State(val titleResourceId: Int, val summaryResourceId: Int, val shouldEnableView: Boolean, val visible: Boolean) {
|
||||
UNKNOWN(0, 0, false, false),
|
||||
ENABLED(R.string.module_disabler_enabled_title, R.string.module_disabler_enabled_summary, true, true),
|
||||
DISABLED(R.string.module_disabler_disabled_title, R.string.module_disabler_disabled_summary, true, true),
|
||||
ENABLING(R.string.module_disabler_disabled_title, R.string.success_application_will_restart, false, true),
|
||||
DISABLING(R.string.module_disabler_enabled_title, R.string.success_application_will_restart, false, true);
|
||||
ENABLED(R.string.module_enabler_enabled_title, R.string.module_enabler_enabled_summary, true, true),
|
||||
DISABLED(R.string.module_enabler_disabled_title, R.string.module_enabler_disabled_summary, true, true),
|
||||
ENABLING(R.string.module_enabler_disabled_title, R.string.success_application_will_restart, false, true),
|
||||
DISABLING(R.string.module_enabler_enabled_title, R.string.success_application_will_restart, false, true);
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val TAG = "WireGuard/KernelModuleDisablerPreference"
|
||||
private const val TAG = "WireGuard/KernelModuleEnablerPreference"
|
||||
}
|
||||
}
|
@ -1,70 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2019 WireGuard LLC. All Rights Reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
package com.wireguard.android.preference
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.system.OsConstants
|
||||
import android.util.AttributeSet
|
||||
import android.widget.Toast
|
||||
import androidx.preference.Preference
|
||||
import com.wireguard.android.Application
|
||||
import com.wireguard.android.R
|
||||
import com.wireguard.android.activity.SettingsActivity
|
||||
import com.wireguard.android.util.ErrorMessages
|
||||
import com.wireguard.android.util.UserKnobs
|
||||
import com.wireguard.android.util.lifecycleScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
class ModuleDownloaderPreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
|
||||
private var state = State.INITIAL
|
||||
override fun getSummary() = context.getString(state.messageResourceId)
|
||||
|
||||
override fun getTitle() = context.getString(R.string.module_installer_title)
|
||||
|
||||
override fun onClick() {
|
||||
setState(State.WORKING)
|
||||
lifecycleScope.launch {
|
||||
try {
|
||||
when (withContext(Dispatchers.IO) { Application.getModuleLoader().download() }) {
|
||||
OsConstants.ENOENT -> setState(State.NOTFOUND)
|
||||
OsConstants.EXIT_SUCCESS -> {
|
||||
setState(State.SUCCESS)
|
||||
UserKnobs.setDisableKernelModule(null)
|
||||
withContext(Dispatchers.IO) {
|
||||
val restartIntent = Intent(context, SettingsActivity::class.java)
|
||||
restartIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
|
||||
restartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
Application.get().startActivity(restartIntent)
|
||||
exitProcess(0)
|
||||
}
|
||||
}
|
||||
else -> setState(State.FAILURE)
|
||||
}
|
||||
} catch (e: Throwable) {
|
||||
setState(State.FAILURE)
|
||||
Toast.makeText(context, ErrorMessages[e], Toast.LENGTH_LONG).show()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setState(state: State) {
|
||||
if (this.state == state) return
|
||||
this.state = state
|
||||
if (isEnabled != state.shouldEnableView) isEnabled = state.shouldEnableView
|
||||
notifyChanged()
|
||||
}
|
||||
|
||||
private enum class State(val messageResourceId: Int, val shouldEnableView: Boolean) {
|
||||
INITIAL(R.string.module_installer_initial, true),
|
||||
FAILURE(R.string.module_installer_error, true),
|
||||
WORKING(R.string.module_installer_working, false),
|
||||
SUCCESS(R.string.success_application_will_restart, false),
|
||||
NOTFOUND(R.string.module_installer_not_found, false);
|
||||
}
|
||||
}
|
@ -14,18 +14,18 @@ import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.map
|
||||
|
||||
object UserKnobs {
|
||||
private val DISABLE_KERNEL_MODULE = booleanPreferencesKey("disable_kernel_module")
|
||||
val disableKernelModule: Flow<Boolean>
|
||||
private val ENABLE_KERNEL_MODULE = booleanPreferencesKey("enable_kernel_module")
|
||||
val enableKernelModule: Flow<Boolean>
|
||||
get() = Application.getPreferencesDataStore().data.map {
|
||||
it[DISABLE_KERNEL_MODULE] ?: false
|
||||
it[ENABLE_KERNEL_MODULE] ?: false
|
||||
}
|
||||
|
||||
suspend fun setDisableKernelModule(disable: Boolean?) {
|
||||
suspend fun setEnableKernelModule(enable: Boolean?) {
|
||||
Application.getPreferencesDataStore().edit {
|
||||
if (disable == null)
|
||||
it.remove(DISABLE_KERNEL_MODULE)
|
||||
if (enable == null)
|
||||
it.remove(ENABLE_KERNEL_MODULE)
|
||||
else
|
||||
it[DISABLE_KERNEL_MODULE] = disable
|
||||
it[ENABLE_KERNEL_MODULE] = enable
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -142,9 +142,9 @@
|
||||
<string name="log_viewer_pref_title">Mostra el registre d\'aplicació</string>
|
||||
<string name="log_viewer_title">Registre</string>
|
||||
<string name="logcat_error">No es pot executar logcat: </string>
|
||||
<string name="module_disabler_disabled_summary">El mòdul experimental del kernel pot millorar el rendiment</string>
|
||||
<string name="module_disabler_disabled_title">Activa el backend del mòdul del kernel</string>
|
||||
<string name="module_disabler_enabled_title">Desactiva el backend del mòdul del kernel</string>
|
||||
<string name="module_enabler_disabled_summary">El mòdul experimental del kernel pot millorar el rendiment</string>
|
||||
<string name="module_enabler_disabled_title">Activa el backend del mòdul del kernel</string>
|
||||
<string name="module_enabler_enabled_title">Desactiva el backend del mòdul del kernel</string>
|
||||
<string name="module_installer_error">Alguna cosa ha anat malament. Si us plau, prova de nou</string>
|
||||
<string name="module_installer_not_found">El vostre dispositiu no té mòduls disponibles</string>
|
||||
<string name="module_installer_title">Descàrega i instala el mòdul kernel</string>
|
||||
|
@ -119,9 +119,9 @@
|
||||
<string name="log_viewer_pref_title">Zobrazit log aplikace</string>
|
||||
<string name="log_viewer_title">Log</string>
|
||||
<string name="logcat_error">Nelze spustit logcat: </string>
|
||||
<string name="module_disabler_disabled_summary">Experimentální kernel modul může zlepšit výkon</string>
|
||||
<string name="module_disabler_disabled_title">Povolit backend kernel modulu</string>
|
||||
<string name="module_disabler_enabled_title">Vypnout backend kernel modulu</string>
|
||||
<string name="module_enabler_disabled_summary">Experimentální kernel modul může zlepšit výkon</string>
|
||||
<string name="module_enabler_disabled_title">Povolit backend kernel modulu</string>
|
||||
<string name="module_enabler_enabled_title">Vypnout backend kernel modulu</string>
|
||||
<string name="module_installer_error">Něco se pokazilo. Zkuste to prosím znovu</string>
|
||||
<string name="module_installer_initial">Experimentální kernel modul může zlepšit výkon</string>
|
||||
<string name="module_installer_not_found">Pro toto zařízení nejsou dostupné žádné moduly</string>
|
||||
|
@ -142,10 +142,10 @@
|
||||
<string name="log_viewer_pref_title">Anwendungs-Protokoll anzeigen</string>
|
||||
<string name="log_viewer_title">Protokoll</string>
|
||||
<string name="logcat_error">Konnte logcat nicht ausführen: </string>
|
||||
<string name="module_disabler_disabled_summary">Das experimentelle Kernelmodul kann die Leistung verbessern</string>
|
||||
<string name="module_disabler_disabled_title">Kernelmodul-Backend aktivieren</string>
|
||||
<string name="module_disabler_enabled_summary">Das langsamere Userspace-Backend kann die Stabilität verbessern</string>
|
||||
<string name="module_disabler_enabled_title">Kernelmodul-Backend deaktivieren</string>
|
||||
<string name="module_enabler_disabled_summary">Das experimentelle Kernelmodul kann die Leistung verbessern</string>
|
||||
<string name="module_enabler_disabled_title">Kernelmodul-Backend aktivieren</string>
|
||||
<string name="module_enabler_enabled_summary">Das langsamere Userspace-Backend kann die Stabilität verbessern</string>
|
||||
<string name="module_enabler_enabled_title">Kernelmodul-Backend deaktivieren</string>
|
||||
<string name="module_installer_error">Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut</string>
|
||||
<string name="module_installer_initial">Das experimentelle Kernelmodul kann die Leistung verbessern</string>
|
||||
<string name="module_installer_not_found">Für Ihr Gerät sind keine Module verfügbar</string>
|
||||
|
@ -142,10 +142,10 @@
|
||||
<string name="log_viewer_pref_title">Ver registro de aplicación</string>
|
||||
<string name="log_viewer_title">Registro</string>
|
||||
<string name="logcat_error">No se puede ejecutar logcat: </string>
|
||||
<string name="module_disabler_disabled_summary">El módulo experimental del kernel puede mejorar el rendimiento</string>
|
||||
<string name="module_disabler_disabled_title">Habilitar backend del módulo del kernel</string>
|
||||
<string name="module_disabler_enabled_summary">El backend más lento del espacio de usuario puede mejorar la estabilidad</string>
|
||||
<string name="module_disabler_enabled_title">Desactivar backend del módulo del kernel</string>
|
||||
<string name="module_enabler_disabled_summary">El módulo experimental del kernel puede mejorar el rendimiento</string>
|
||||
<string name="module_enabler_disabled_title">Habilitar backend del módulo del kernel</string>
|
||||
<string name="module_enabler_enabled_summary">El backend más lento del espacio de usuario puede mejorar la estabilidad</string>
|
||||
<string name="module_enabler_enabled_title">Desactivar backend del módulo del kernel</string>
|
||||
<string name="module_installer_error">Ocurrió un error. Intente de nuevo</string>
|
||||
<string name="module_installer_initial">El módulo experimental del kernel puede mejorar el rendimiento</string>
|
||||
<string name="module_installer_not_found">No hay módulos disponibles para tu dispositivo</string>
|
||||
|
@ -142,10 +142,10 @@
|
||||
<string name="log_viewer_pref_title">نمایش گزارش رویداد برنامه</string>
|
||||
<string name="log_viewer_title">گزارش رویداد</string>
|
||||
<string name="logcat_error">نمیتوان logcat را اجرا کرد: </string>
|
||||
<string name="module_disabler_disabled_summary">ماژول آزمایشیِ کرنل می تواند کارایی را افزایش دهد</string>
|
||||
<string name="module_disabler_disabled_title">فعالسازی ماژول کرنل ِبک اند</string>
|
||||
<string name="module_disabler_enabled_summary">فضای کاربری کند ممکن است پایداری را بهبود ببخشد</string>
|
||||
<string name="module_disabler_enabled_title">غیرفعالسازی پسزمینه واحد هسته</string>
|
||||
<string name="module_enabler_disabled_summary">ماژول آزمایشیِ کرنل می تواند کارایی را افزایش دهد</string>
|
||||
<string name="module_enabler_disabled_title">فعالسازی ماژول کرنل ِبک اند</string>
|
||||
<string name="module_enabler_enabled_summary">فضای کاربری کند ممکن است پایداری را بهبود ببخشد</string>
|
||||
<string name="module_enabler_enabled_title">غیرفعالسازی پسزمینه واحد هسته</string>
|
||||
<string name="module_installer_error">مشکلی پیش آمد. لطفا دوباره تلاش کنید</string>
|
||||
<string name="module_installer_initial">ماژول آزمایشیِ کرنل می تواند کارایی را افزایش دهد</string>
|
||||
<string name="module_installer_not_found">هیچ واحدی برای دستگاه شما در دسترس نیست</string>
|
||||
|
@ -142,10 +142,10 @@
|
||||
<string name="log_viewer_pref_title">Afficher le journal de l\'application</string>
|
||||
<string name="log_viewer_title">Journal</string>
|
||||
<string name="logcat_error">Impossible d\'exécuter logcat : </string>
|
||||
<string name="module_disabler_disabled_summary">Le module expérimental du noyau peut améliorer les performances</string>
|
||||
<string name="module_disabler_disabled_title">Activer le backend du module du noyau</string>
|
||||
<string name="module_disabler_enabled_summary">Le backend plus lent de l\'espace utilisateur peut améliorer la stabilité</string>
|
||||
<string name="module_disabler_enabled_title">Désactiver le backend du module du noyau</string>
|
||||
<string name="module_enabler_disabled_summary">Le module expérimental du noyau peut améliorer les performances</string>
|
||||
<string name="module_enabler_disabled_title">Activer le backend du module du noyau</string>
|
||||
<string name="module_enabler_enabled_summary">Le backend plus lent de l\'espace utilisateur peut améliorer la stabilité</string>
|
||||
<string name="module_enabler_enabled_title">Désactiver le backend du module du noyau</string>
|
||||
<string name="module_installer_error">Une erreur est survenue. Veuillez réessayer</string>
|
||||
<string name="module_installer_initial">Le module expérimental du noyau peut améliorer les performances</string>
|
||||
<string name="module_installer_not_found">Aucun module n\'est disponible pour votre appareil</string>
|
||||
|
@ -132,10 +132,10 @@
|
||||
<string name="log_viewer_pref_title">एप्लिकेशन लॉग देखें</string>
|
||||
<string name="log_viewer_title">लॉग</string>
|
||||
<string name="logcat_error">लॉगकैट चलाने में असमर्थ: </string>
|
||||
<string name="module_disabler_disabled_summary">प्रयोगात्मक कर्नेल मॉड्यूल प्रदर्शन में सुधार कर सकता है</string>
|
||||
<string name="module_disabler_disabled_title">कर्नेल मॉड्यूल बैकएंड सक्षम करें</string>
|
||||
<string name="module_disabler_enabled_summary">धीमे यूजरस्पेस बैकएंड में स्थिरता में सुधार हो सकता है</string>
|
||||
<string name="module_disabler_enabled_title">कर्नेल मॉड्यूल बैकएंड को अक्षम करें</string>
|
||||
<string name="module_enabler_disabled_summary">प्रयोगात्मक कर्नेल मॉड्यूल प्रदर्शन में सुधार कर सकता है</string>
|
||||
<string name="module_enabler_disabled_title">कर्नेल मॉड्यूल बैकएंड सक्षम करें</string>
|
||||
<string name="module_enabler_enabled_summary">धीमे यूजरस्पेस बैकएंड में स्थिरता में सुधार हो सकता है</string>
|
||||
<string name="module_enabler_enabled_title">कर्नेल मॉड्यूल बैकएंड को अक्षम करें</string>
|
||||
<string name="module_installer_error">कुछ गलत हो गया। कृपया पुन: प्रयास करें</string>
|
||||
<string name="module_installer_initial">प्रयोगात्मक कर्नेल मॉड्यूल प्रदर्शन में सुधार कर सकता है</string>
|
||||
<string name="module_installer_not_found">आपके डिवाइस के लिए कोई मॉड्यूल उपलब्ध नहीं हैं</string>
|
||||
|
@ -96,10 +96,10 @@
|
||||
<string name="module_installer_title">कर्नेल मॉड्यूल डाउनलोड और इंस्टॉल करें</string>
|
||||
<string name="module_installer_working">डाउनलोड कर रहा है और स्थापित कर रहा है…</string>
|
||||
<string name="module_installer_error">कुछ गलत हो गया। कृपया पुन: प्रयास करें</string>
|
||||
<string name="module_disabler_disabled_title">कर्नेल मॉड्यूल बैकएंड सक्षम करें</string>
|
||||
<string name="module_disabler_disabled_summary">प्रयोगात्मक कर्नेल मॉड्यूल प्रदर्शन में सुधार कर सकता है</string>
|
||||
<string name="module_disabler_enabled_title">कर्नेल मॉड्यूल बैकएंड को अक्षम करें</string>
|
||||
<string name="module_disabler_enabled_summary">धीमे यूजरस्पेस बैकएंड में स्थिरता में सुधार हो सकता है</string>
|
||||
<string name="module_enabler_disabled_title">कर्नेल मॉड्यूल बैकएंड सक्षम करें</string>
|
||||
<string name="module_enabler_disabled_summary">प्रयोगात्मक कर्नेल मॉड्यूल प्रदर्शन में सुधार कर सकता है</string>
|
||||
<string name="module_enabler_enabled_title">कर्नेल मॉड्यूल बैकएंड को अक्षम करें</string>
|
||||
<string name="module_enabler_enabled_summary">धीमे यूजरस्पेस बैकएंड में स्थिरता में सुधार हो सकता है</string>
|
||||
<string name="mtu">MTU</string>
|
||||
<string name="multiple_tunnels_title">एक साथ कई टनलस को अनुमति दें</string>
|
||||
<string name="multiple_tunnels_summary_on">एक साथ कई टनलस को चालू किया जा सकता है</string>
|
||||
|
@ -129,10 +129,10 @@
|
||||
<string name="log_viewer_pref_title">Lihat log aplikasi</string>
|
||||
<string name="log_viewer_title">Log</string>
|
||||
<string name="logcat_error">Tidak bisa menjalankan logcat: </string>
|
||||
<string name="module_disabler_disabled_summary">Modul kernel eksperimental dapat meningkatkan kinerja</string>
|
||||
<string name="module_disabler_disabled_title">Aktifkan backend modul kernel</string>
|
||||
<string name="module_disabler_enabled_summary">Backend userspace yang lebih lambat dapat meningkatkan stabilitas</string>
|
||||
<string name="module_disabler_enabled_title">Nonaktifkan backend modul kernel</string>
|
||||
<string name="module_enabler_disabled_summary">Modul kernel eksperimental dapat meningkatkan kinerja</string>
|
||||
<string name="module_enabler_disabled_title">Aktifkan backend modul kernel</string>
|
||||
<string name="module_enabler_enabled_summary">Backend userspace yang lebih lambat dapat meningkatkan stabilitas</string>
|
||||
<string name="module_enabler_enabled_title">Nonaktifkan backend modul kernel</string>
|
||||
<string name="module_installer_error">Ada yang salah. Silakan coba lagi</string>
|
||||
<string name="module_installer_initial">Modul kernel eksperimental dapat meningkatkan kinerja</string>
|
||||
<string name="module_installer_not_found">Tidak tersedia modul untuk perangkat anda</string>
|
||||
|
@ -142,10 +142,10 @@
|
||||
<string name="log_viewer_pref_title">Visualizza log dell\'applicazione</string>
|
||||
<string name="log_viewer_title">Log</string>
|
||||
<string name="logcat_error">Impossibile eseguire logcat: </string>
|
||||
<string name="module_disabler_disabled_summary">Il modulo sperimentale del kernel può migliorare le prestazioni</string>
|
||||
<string name="module_disabler_disabled_title">Abilita il backend del modulo del kernel</string>
|
||||
<string name="module_disabler_enabled_summary">Il backend in userspace più lento potrebbe migliorare la stabilità</string>
|
||||
<string name="module_disabler_enabled_title">Disabilita il backend del modulo del kernel</string>
|
||||
<string name="module_enabler_disabled_summary">Il modulo sperimentale del kernel può migliorare le prestazioni</string>
|
||||
<string name="module_enabler_disabled_title">Abilita il backend del modulo del kernel</string>
|
||||
<string name="module_enabler_enabled_summary">Il backend in userspace più lento potrebbe migliorare la stabilità</string>
|
||||
<string name="module_enabler_enabled_title">Disabilita il backend del modulo del kernel</string>
|
||||
<string name="module_installer_error">Qualcosa non ha funzionato. Riprova</string>
|
||||
<string name="module_installer_initial">Il modulo sperimentale del kernel può migliorare le prestazioni</string>
|
||||
<string name="module_installer_not_found">Nessun modulo disponibile per il tuo dispositivo</string>
|
||||
|
@ -129,10 +129,10 @@
|
||||
<string name="log_viewer_pref_title">アプリケーションログを表示</string>
|
||||
<string name="log_viewer_title">ログ</string>
|
||||
<string name="logcat_error">logcat を実行できません: </string>
|
||||
<string name="module_disabler_disabled_summary">カーネルモジュールは実験的ですがパフォーマンスが向上する可能性があります。</string>
|
||||
<string name="module_disabler_disabled_title">カーネルモジュールバックエンドの有効化</string>
|
||||
<string name="module_disabler_enabled_summary">ユーザースペースバックエンドは低速ですが安定しています。</string>
|
||||
<string name="module_disabler_enabled_title">カーネルモジュールバックエンドの無効化</string>
|
||||
<string name="module_enabler_disabled_summary">カーネルモジュールは実験的ですがパフォーマンスが向上する可能性があります。</string>
|
||||
<string name="module_enabler_disabled_title">カーネルモジュールバックエンドの有効化</string>
|
||||
<string name="module_enabler_enabled_summary">ユーザースペースバックエンドは低速ですが安定しています。</string>
|
||||
<string name="module_enabler_enabled_title">カーネルモジュールバックエンドの無効化</string>
|
||||
<string name="module_installer_error">失敗しました. 再度実行してみてください</string>
|
||||
<string name="module_installer_initial">実験的カーネルモジュールはパフォーマンスが向上する場合があります</string>
|
||||
<string name="module_installer_not_found">このデバイス用のモジュールは利用できません</string>
|
||||
|
@ -129,10 +129,10 @@
|
||||
<string name="log_viewer_pref_title">앱 로그 보기</string>
|
||||
<string name="log_viewer_title">로그</string>
|
||||
<string name="logcat_error">logcat을 실행할 수 없음: </string>
|
||||
<string name="module_disabler_disabled_summary">아직 실험중이 커널 모듈을 사용하면 성능이 향상될 수 있음</string>
|
||||
<string name="module_disabler_disabled_title">커널 모듈 백엔드 활성화하기</string>
|
||||
<string name="module_disabler_enabled_summary">사용자공간 백엔드를 사용하면 느리지만 안정성이 좋아짐</string>
|
||||
<string name="module_disabler_enabled_title">커널 모듈 백엔드를 비활성화하기</string>
|
||||
<string name="module_enabler_disabled_summary">아직 실험중이 커널 모듈을 사용하면 성능이 향상될 수 있음</string>
|
||||
<string name="module_enabler_disabled_title">커널 모듈 백엔드 활성화하기</string>
|
||||
<string name="module_enabler_enabled_summary">사용자공간 백엔드를 사용하면 느리지만 안정성이 좋아짐</string>
|
||||
<string name="module_enabler_enabled_title">커널 모듈 백엔드를 비활성화하기</string>
|
||||
<string name="module_installer_error">문제가 발생했습니다. 다시 시도하십시오</string>
|
||||
<string name="module_installer_initial">아직 실험중이 커널 모듈을 사용하면 성능이 향상될 수 있음</string>
|
||||
<string name="module_installer_not_found">이 기기에서 사용가능한 모듈이 없음</string>
|
||||
|
@ -142,10 +142,10 @@
|
||||
<string name="log_viewer_pref_title">Vis programlogg</string>
|
||||
<string name="log_viewer_title">Logg</string>
|
||||
<string name="logcat_error">Kan ikke kjøre logcat: </string>
|
||||
<string name="module_disabler_disabled_summary">Den eksperimentelle kjernemodulen kan gi bedre ytelse</string>
|
||||
<string name="module_disabler_disabled_title">Aktiver backend for kjerne-modul</string>
|
||||
<string name="module_disabler_enabled_summary">Backend i userspace er litt tregere men kan gi bedre stabilitet</string>
|
||||
<string name="module_disabler_enabled_title">Deaktiver backend for kjerne-modul</string>
|
||||
<string name="module_enabler_disabled_summary">Den eksperimentelle kjernemodulen kan gi bedre ytelse</string>
|
||||
<string name="module_enabler_disabled_title">Aktiver backend for kjerne-modul</string>
|
||||
<string name="module_enabler_enabled_summary">Backend i userspace er litt tregere men kan gi bedre stabilitet</string>
|
||||
<string name="module_enabler_enabled_title">Deaktiver backend for kjerne-modul</string>
|
||||
<string name="module_installer_error">Noe gikk galt. Vennligst prøv igjen</string>
|
||||
<string name="module_installer_initial">Den eksperimentelle kjernemodulen kan gi bedre ytelse</string>
|
||||
<string name="module_installer_not_found">Ingen moduler er tilgjengelige for din enhet</string>
|
||||
|
@ -142,10 +142,10 @@
|
||||
<string name="log_viewer_pref_title">ਐਪਲੀਕੇਸ਼ਨ ਲਾਗ ਵੇਖੋ</string>
|
||||
<string name="log_viewer_title">ਲਾਗ</string>
|
||||
<string name="logcat_error">logcat ਚਲਾਉਣ ਲਈ ਅਸਮਰੱਥ: </string>
|
||||
<string name="module_disabler_disabled_summary">ਤਜਰਬੇ ਅਧੀਨ ਕਰਨਲ ਮੋਡੀਊਲ ਕਾਰਗੁਜ਼ਾਰੀ ਸੁਧਾਰ ਸਕਦਾ ਹੈ</string>
|
||||
<string name="module_disabler_disabled_title">ਕਰਨਲ ਮੋਡੀਊਲ ਬੈਕਐਂਡ ਸਮਰੱਥ ਕਰੋ</string>
|
||||
<string name="module_disabler_enabled_summary">ਹੌਲੀ ਵਰਤੋਂਕਾਰ-ਸਪੇਸ ਬੈਂਕਡ ਸਥਿਰਤਾ ਸੁਧਾਰ ਕਰ ਸਕਦਾ ਹੈ</string>
|
||||
<string name="module_disabler_enabled_title">ਕਰਨਲ ਮੋਡੀਊਲ ਬੈਕਐਂਡ ਅਸਮਰੱਥ ਕਰੋ</string>
|
||||
<string name="module_enabler_disabled_summary">ਤਜਰਬੇ ਅਧੀਨ ਕਰਨਲ ਮੋਡੀਊਲ ਕਾਰਗੁਜ਼ਾਰੀ ਸੁਧਾਰ ਸਕਦਾ ਹੈ</string>
|
||||
<string name="module_enabler_disabled_title">ਕਰਨਲ ਮੋਡੀਊਲ ਬੈਕਐਂਡ ਸਮਰੱਥ ਕਰੋ</string>
|
||||
<string name="module_enabler_enabled_summary">ਹੌਲੀ ਵਰਤੋਂਕਾਰ-ਸਪੇਸ ਬੈਂਕਡ ਸਥਿਰਤਾ ਸੁਧਾਰ ਕਰ ਸਕਦਾ ਹੈ</string>
|
||||
<string name="module_enabler_enabled_title">ਕਰਨਲ ਮੋਡੀਊਲ ਬੈਕਐਂਡ ਅਸਮਰੱਥ ਕਰੋ</string>
|
||||
<string name="module_installer_error">ਕੁਝ ਗਲਤ ਵਾਪਰ ਗਿਆ। ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ</string>
|
||||
<string name="module_installer_initial">ਤਜਰਬੇ ਅਧੀਨ ਕਰਨਲ ਮੋਡੀਊਲ ਕਾਰਗੁਜ਼ਾਰੀ ਸੁਧਾਰ ਸਕਦਾ ਹੈ</string>
|
||||
<string name="module_installer_not_found">ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਲਈ ਕੋਈ ਮੋਡੀਊਲ ਮੌਜੂਦ ਨਹੀਂ ਹਨ</string>
|
||||
|
@ -168,10 +168,10 @@
|
||||
<string name="log_viewer_pref_title">Wyświetl log aplikacji</string>
|
||||
<string name="log_viewer_title">Log</string>
|
||||
<string name="logcat_error">Nie można uruchomić narzędzia logcat: </string>
|
||||
<string name="module_disabler_disabled_summary">Eksperymentalny moduł jądra może poprawić wydajność</string>
|
||||
<string name="module_disabler_disabled_title">Włącz moduł jądra</string>
|
||||
<string name="module_disabler_enabled_summary">Wolniejsza implementacja w przestrzeni użytkownika może poprawić stabilność</string>
|
||||
<string name="module_disabler_enabled_title">Wyłącz moduł jądra</string>
|
||||
<string name="module_enabler_disabled_summary">Eksperymentalny moduł jądra może poprawić wydajność</string>
|
||||
<string name="module_enabler_disabled_title">Włącz moduł jądra</string>
|
||||
<string name="module_enabler_enabled_summary">Wolniejsza implementacja w przestrzeni użytkownika może poprawić stabilność</string>
|
||||
<string name="module_enabler_enabled_title">Wyłącz moduł jądra</string>
|
||||
<string name="module_installer_error">Coś poszło nie tak. Proszę spróbować ponownie</string>
|
||||
<string name="module_installer_initial">Eksperymentalny moduł jądra może poprawić wydajność</string>
|
||||
<string name="module_installer_not_found">Brak dostępnych modułów dla tego urządzenia</string>
|
||||
|
@ -142,10 +142,10 @@
|
||||
<string name="log_viewer_pref_title">Ver log da aplicação</string>
|
||||
<string name="log_viewer_title">Log</string>
|
||||
<string name="logcat_error">Não foi possível executar o logcat: </string>
|
||||
<string name="module_disabler_disabled_summary">O módulo experimental de kernel pode melhorar o desempenho</string>
|
||||
<string name="module_disabler_disabled_title">Habilitar módulo backend do kernel</string>
|
||||
<string name="module_disabler_enabled_summary">O backend do userspace mais lento pode aumentar a estabilidade</string>
|
||||
<string name="module_disabler_enabled_title">Desabilitar módulo backend do kernel</string>
|
||||
<string name="module_enabler_disabled_summary">O módulo experimental de kernel pode melhorar o desempenho</string>
|
||||
<string name="module_enabler_disabled_title">Habilitar módulo backend do kernel</string>
|
||||
<string name="module_enabler_enabled_summary">O backend do userspace mais lento pode aumentar a estabilidade</string>
|
||||
<string name="module_enabler_enabled_title">Desabilitar módulo backend do kernel</string>
|
||||
<string name="module_installer_error">Ocorreu um erro. Por favor, tente novamente</string>
|
||||
<string name="module_installer_initial">O módulo experimental do kernel pode melhorar o desempenho</string>
|
||||
<string name="module_installer_not_found">Não há módulos disponíveis para o seu dispositivo</string>
|
||||
|
@ -155,10 +155,10 @@
|
||||
<string name="log_viewer_pref_title">Vizualizare jurnal aplicație</string>
|
||||
<string name="log_viewer_title">Jurnal</string>
|
||||
<string name="logcat_error">Programul logcat nu poate fi executat: </string>
|
||||
<string name="module_disabler_disabled_summary">Modulul experimental de nucleu poate îmbunătăți performanța</string>
|
||||
<string name="module_disabler_disabled_title">Activează biblioteca modulului de nucleu</string>
|
||||
<string name="module_disabler_enabled_summary">Biblioteca mai lentă a spațiului utilizatorului poate îmbunătăți stabilitatea</string>
|
||||
<string name="module_disabler_enabled_title">Dezactivează biblioteca modulului de nucleu</string>
|
||||
<string name="module_enabler_disabled_summary">Modulul experimental de nucleu poate îmbunătăți performanța</string>
|
||||
<string name="module_enabler_disabled_title">Activează biblioteca modulului de nucleu</string>
|
||||
<string name="module_enabler_enabled_summary">Biblioteca mai lentă a spațiului utilizatorului poate îmbunătăți stabilitatea</string>
|
||||
<string name="module_enabler_enabled_title">Dezactivează biblioteca modulului de nucleu</string>
|
||||
<string name="module_installer_error">A apărut o eroare. Încearcă din nou</string>
|
||||
<string name="module_installer_initial">Modulul experimental de nucleu poate îmbunătăți performanța</string>
|
||||
<string name="module_installer_not_found">Nu sunt disponibile module pentru dispozitivul tău</string>
|
||||
|
@ -168,10 +168,10 @@
|
||||
<string name="log_viewer_pref_title">Просмотр журналов приложения</string>
|
||||
<string name="log_viewer_title">Журнал</string>
|
||||
<string name="logcat_error">Не удалось запустить logcat: </string>
|
||||
<string name="module_disabler_disabled_summary">Экспериментальный модуль ядра может улучшить производительность</string>
|
||||
<string name="module_disabler_disabled_title">Включить бэкэнд модуля ядра</string>
|
||||
<string name="module_disabler_enabled_summary">Пользовательское пространство немного медленнее и улучшает стабильность</string>
|
||||
<string name="module_disabler_enabled_title">Отключить бэкэнд модуля ядра</string>
|
||||
<string name="module_enabler_disabled_summary">Экспериментальный модуль ядра может улучшить производительность</string>
|
||||
<string name="module_enabler_disabled_title">Включить бэкэнд модуля ядра</string>
|
||||
<string name="module_enabler_enabled_summary">Пользовательское пространство немного медленнее и улучшает стабильность</string>
|
||||
<string name="module_enabler_enabled_title">Отключить бэкэнд модуля ядра</string>
|
||||
<string name="module_installer_error">Что-то пошло не так. Пожалуйста, попробуйте еще раз</string>
|
||||
<string name="module_installer_initial">Экспериментальный модуль ядра может улучшить производительность</string>
|
||||
<string name="module_installer_not_found">Для вашего устройства нет доступных модулей</string>
|
||||
|
@ -77,7 +77,7 @@
|
||||
<string name="log_saver_activity_label">Uložiť denník udalostí</string>
|
||||
<string name="log_viewer_pref_summary">Denník udalosti môžu byt nápomocné pri ladení aplikácie</string>
|
||||
<string name="log_viewer_pref_title">Zobraziť denník udalostí aplikácie</string>
|
||||
<string name="module_disabler_enabled_summary">Pomalšie užívatelské prostredie môže zlepšiť stabilitu</string>
|
||||
<string name="module_enabler_enabled_summary">Pomalšie užívatelské prostredie môže zlepšiť stabilitu</string>
|
||||
<string name="module_installer_error">Niečo sa pokazilo. Prosím, skúste znova</string>
|
||||
<string name="module_installer_not_found">Pre vaše zariadenie nie sú k dispozícii žiadne moduly</string>
|
||||
<string name="module_installer_title">Stiahni a nainštaluj kernel modul</string>
|
||||
|
@ -166,10 +166,10 @@
|
||||
<string name="log_viewer_pref_title">Prikaži dnevnik aplikacije</string>
|
||||
<string name="log_viewer_title">Dnevnik</string>
|
||||
<string name="logcat_error">Ukaza logcat ni bilo mogoče izvesti: </string>
|
||||
<string name="module_disabler_disabled_summary">Eksperimentalni modul jedra lahko izboljša zmogljivost</string>
|
||||
<string name="module_disabler_disabled_title">Omogoči zaledje za modul jedra</string>
|
||||
<string name="module_disabler_enabled_summary">Počasnejše uporabniško zaledje lahko izboljša stabilnost</string>
|
||||
<string name="module_disabler_enabled_title">Onemogoči zaledje za modul jedra</string>
|
||||
<string name="module_enabler_disabled_summary">Eksperimentalni modul jedra lahko izboljša zmogljivost</string>
|
||||
<string name="module_enabler_disabled_title">Omogoči zaledje za modul jedra</string>
|
||||
<string name="module_enabler_enabled_summary">Počasnejše uporabniško zaledje lahko izboljša stabilnost</string>
|
||||
<string name="module_enabler_enabled_title">Onemogoči zaledje za modul jedra</string>
|
||||
<string name="module_installer_error">Nekaj je šlo narobe, prosimo poskusite znova</string>
|
||||
<string name="module_installer_initial">Eksperimentalni modul jedra lahko izboljša zmogljivost</string>
|
||||
<string name="module_installer_not_found">Za vašo napravo ni razpoložljivih modulov</string>
|
||||
|
@ -114,10 +114,10 @@
|
||||
<string name="log_viewer_pref_title">Visa applikationslogg</string>
|
||||
<string name="log_viewer_title">Logg</string>
|
||||
<string name="logcat_error">Kunde inte köra logcat: </string>
|
||||
<string name="module_disabler_disabled_summary">Den experimentella kärnmodulen kan förbättra prestanda</string>
|
||||
<string name="module_disabler_disabled_title">Aktivera backend för kärnmodul</string>
|
||||
<string name="module_disabler_enabled_summary">Den långsammare backend för användarrymden kan förbättra stabiliteten</string>
|
||||
<string name="module_disabler_enabled_title">Inaktivera backend för kärnmodul</string>
|
||||
<string name="module_enabler_disabled_summary">Den experimentella kärnmodulen kan förbättra prestanda</string>
|
||||
<string name="module_enabler_disabled_title">Aktivera backend för kärnmodul</string>
|
||||
<string name="module_enabler_enabled_summary">Den långsammare backend för användarrymden kan förbättra stabiliteten</string>
|
||||
<string name="module_enabler_enabled_title">Inaktivera backend för kärnmodul</string>
|
||||
<string name="module_installer_error">Något gick fel. Vänligen försök igen</string>
|
||||
<string name="module_installer_initial">Den experimentella kärnmodulen kan förbättra prestanda</string>
|
||||
<string name="module_installer_not_found">Inga moduler finns tillgängliga för din enhet</string>
|
||||
|
@ -142,10 +142,10 @@
|
||||
<string name="log_viewer_pref_title">Uygulama günlüğünü görüntüle</string>
|
||||
<string name="log_viewer_title">Günlük</string>
|
||||
<string name="logcat_error">Logcat çalıştırılamıyor: </string>
|
||||
<string name="module_disabler_disabled_summary">Deneysel çekirdek modülü performansı artırabilir</string>
|
||||
<string name="module_disabler_disabled_title">Çekirdek modülü arka ucunu etkinleştir</string>
|
||||
<string name="module_disabler_enabled_summary">Daha yavaş kullanıcı alanı arka ucu kararlılığı artırabilir</string>
|
||||
<string name="module_disabler_enabled_title">Çekirdek modülü arka ucunu devre dışı bırak</string>
|
||||
<string name="module_enabler_disabled_summary">Deneysel çekirdek modülü performansı artırabilir</string>
|
||||
<string name="module_enabler_disabled_title">Çekirdek modülü arka ucunu etkinleştir</string>
|
||||
<string name="module_enabler_enabled_summary">Daha yavaş kullanıcı alanı arka ucu kararlılığı artırabilir</string>
|
||||
<string name="module_enabler_enabled_title">Çekirdek modülü arka ucunu devre dışı bırak</string>
|
||||
<string name="module_installer_error">Bir şeyler yanlış gitti. Lütfen tekrar deneyin</string>
|
||||
<string name="module_installer_initial">Deneysel çekirdek modülü performansı artırabilir</string>
|
||||
<string name="module_installer_not_found">Cihazınız için uygun modül yok</string>
|
||||
|
@ -168,10 +168,10 @@
|
||||
<string name="log_viewer_pref_title">Переглянути журнал програми</string>
|
||||
<string name="log_viewer_title">Журнал</string>
|
||||
<string name="logcat_error">Не вдалося запустити logcat: </string>
|
||||
<string name="module_disabler_disabled_summary">Експериментальний модуль ядра може підвищити продуктивність</string>
|
||||
<string name="module_disabler_disabled_title">Увімкнути модуль ядра</string>
|
||||
<string name="module_disabler_enabled_summary">Користувацький простір повільніший, проте може покращити стабільність</string>
|
||||
<string name="module_disabler_enabled_title">Вимкнути модуль ядра</string>
|
||||
<string name="module_enabler_disabled_summary">Експериментальний модуль ядра може підвищити продуктивність</string>
|
||||
<string name="module_enabler_disabled_title">Увімкнути модуль ядра</string>
|
||||
<string name="module_enabler_enabled_summary">Користувацький простір повільніший, проте може покращити стабільність</string>
|
||||
<string name="module_enabler_enabled_title">Вимкнути модуль ядра</string>
|
||||
<string name="module_installer_error">Щось пішло не так. Спробуйте ще раз</string>
|
||||
<string name="module_installer_initial">Експериментальний модуль ядра може підвищити продуктивність</string>
|
||||
<string name="module_installer_not_found">Немає доступних модулів для вашого пристрою</string>
|
||||
|
@ -129,10 +129,10 @@
|
||||
<string name="log_viewer_pref_title">查看应用日志</string>
|
||||
<string name="log_viewer_title">日志</string>
|
||||
<string name="logcat_error">无法运行 logcat: </string>
|
||||
<string name="module_disabler_disabled_summary">内核空间的模块性能较强,但可能不稳定</string>
|
||||
<string name="module_disabler_disabled_title">启用内核模块</string>
|
||||
<string name="module_disabler_enabled_summary">用户空间的模块性能较弱,但稳定性更好</string>
|
||||
<string name="module_disabler_enabled_title">停用内核模块</string>
|
||||
<string name="module_enabler_disabled_summary">内核空间的模块性能较强,但可能不稳定</string>
|
||||
<string name="module_enabler_disabled_title">启用内核模块</string>
|
||||
<string name="module_enabler_enabled_summary">用户空间的模块性能较弱,但稳定性更好</string>
|
||||
<string name="module_enabler_enabled_title">停用内核模块</string>
|
||||
<string name="module_installer_error">发生错误,请重试</string>
|
||||
<string name="module_installer_initial">使用内核模块可以提升性能(实验性)</string>
|
||||
<string name="module_installer_not_found">没有可用于此设备的模块</string>
|
||||
|
@ -129,8 +129,8 @@
|
||||
<string name="log_viewer_pref_title">檢視應用程式日誌</string>
|
||||
<string name="log_viewer_title">日誌</string>
|
||||
<string name="logcat_error">無法執行 logcat: </string>
|
||||
<string name="module_disabler_disabled_summary">使用還在實驗階段的 kernel module 以便改善效能</string>
|
||||
<string name="module_disabler_disabled_title">啟用 kernel module</string>
|
||||
<string name="module_enabler_disabled_summary">使用還在實驗階段的 kernel module 以便改善效能</string>
|
||||
<string name="module_enabler_disabled_title">啟用 kernel module</string>
|
||||
<string name="save">儲存</string>
|
||||
<string name="select_all">全選</string>
|
||||
<string name="toggle_all">切換全部</string>
|
||||
|
@ -144,10 +144,10 @@
|
||||
<string name="log_viewer_pref_title">View application log</string>
|
||||
<string name="log_viewer_title">Log</string>
|
||||
<string name="logcat_error">Unable to run logcat: </string>
|
||||
<string name="module_disabler_disabled_summary">The experimental kernel module can improve performance</string>
|
||||
<string name="module_disabler_disabled_title">Enable kernel module backend</string>
|
||||
<string name="module_disabler_enabled_summary">The slower userspace backend may improve stability</string>
|
||||
<string name="module_disabler_enabled_title">Disable kernel module backend</string>
|
||||
<string name="module_enabler_disabled_summary">The experimental kernel module can improve performance</string>
|
||||
<string name="module_enabler_disabled_title">Enable kernel module backend</string>
|
||||
<string name="module_enabler_enabled_summary">The slower userspace backend may improve stability</string>
|
||||
<string name="module_enabler_enabled_title">Disable kernel module backend</string>
|
||||
<string name="module_installer_error">Something went wrong. Please try again</string>
|
||||
<string name="module_installer_initial">The experimental kernel module can improve performance</string>
|
||||
<string name="module_installer_not_found">No modules are available for your device</string>
|
||||
|
@ -27,9 +27,8 @@
|
||||
android:summaryOff="@string/multiple_tunnels_summary_off"
|
||||
android:summaryOn="@string/multiple_tunnels_summary_on"
|
||||
android:title="@string/multiple_tunnels_title" />
|
||||
<com.wireguard.android.preference.ModuleDownloaderPreference android:key="module_downloader" />
|
||||
<com.wireguard.android.preference.ToolsInstallerPreference android:key="tools_installer" />
|
||||
<com.wireguard.android.preference.KernelModuleDisablerPreference android:key="kernel_module_disabler" />
|
||||
<com.wireguard.android.preference.KernelModuleEnablerPreference android:key="kernel_module_enabler" />
|
||||
<CheckBoxPreference
|
||||
android:defaultValue="false"
|
||||
android:key="allow_remote_control_intents"
|
||||
|
Loading…
Reference in New Issue
Block a user