mirror of
https://github.com/MGislv/NekoX.git
synced 2024-07-04 11:13:36 +00:00
parent
10e526ba25
commit
abba7ef236
|
@ -44,9 +44,9 @@ dependencies {
|
||||||
// TODO: fix problem with android L
|
// TODO: fix problem with android L
|
||||||
implementation 'com.google.zxing:core:3.4.0'
|
implementation 'com.google.zxing:core:3.4.0'
|
||||||
|
|
||||||
compileOnly 'org.checkerframework:checker-qual:2.5.2'
|
compileOnly 'org.checkerframework:checker-qual:3.4.1'
|
||||||
compileOnly 'org.checkerframework:checker-compat-qual:2.5.0'
|
compileOnly 'org.checkerframework:checker-compat-qual:2.5.5'
|
||||||
implementation 'com.googlecode.mp4parser:isoparser:1.0.6'
|
implementation 'com.googlecode.mp4parser:isoparser:1.1.22'
|
||||||
implementation 'com.stripe:stripe-android:2.0.2'
|
implementation 'com.stripe:stripe-android:2.0.2'
|
||||||
implementation 'com.google.code.gson:gson:2.8.6'
|
implementation 'com.google.code.gson:gson:2.8.6'
|
||||||
implementation 'org.osmdroid:osmdroid-android:6.1.6'
|
implementation 'org.osmdroid:osmdroid-android:6.1.6'
|
||||||
|
|
|
@ -42,6 +42,7 @@ import java.util.Set;
|
||||||
import tw.nekomimi.nekogram.ExternalGcm;
|
import tw.nekomimi.nekogram.ExternalGcm;
|
||||||
import tw.nekomimi.nekogram.NekoConfig;
|
import tw.nekomimi.nekogram.NekoConfig;
|
||||||
import tw.nekomimi.nekogram.database.WarppedPref;
|
import tw.nekomimi.nekogram.database.WarppedPref;
|
||||||
|
import tw.nekomimi.nekogram.parts.ProxySwitcher;
|
||||||
import tw.nekomimi.nekogram.utils.EnvUtil;
|
import tw.nekomimi.nekogram.utils.EnvUtil;
|
||||||
import tw.nekomimi.nekogram.utils.FileUtil;
|
import tw.nekomimi.nekogram.utils.FileUtil;
|
||||||
import tw.nekomimi.nekogram.utils.ProxyUtil;
|
import tw.nekomimi.nekogram.utils.ProxyUtil;
|
||||||
|
@ -306,7 +307,6 @@ public class ApplicationLoader extends Application {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ApplicationLoader app = (ApplicationLoader) ApplicationLoader.applicationContext;
|
|
||||||
ExternalGcm.initPlayServices();
|
ExternalGcm.initPlayServices();
|
||||||
if (BuildVars.LOGS_ENABLED) {
|
if (BuildVars.LOGS_ENABLED) {
|
||||||
FileLog.d("app initied");
|
FileLog.d("app initied");
|
||||||
|
@ -322,6 +322,7 @@ public class ApplicationLoader extends Application {
|
||||||
if (finalA == UserConfig.selectedAccount) initRunnable.run();
|
if (finalA == UserConfig.selectedAccount) initRunnable.run();
|
||||||
else UIUtil.runOnIoDispatcher(initRunnable);
|
else UIUtil.runOnIoDispatcher(initRunnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ApplicationLoader() {
|
public ApplicationLoader() {
|
||||||
|
|
|
@ -4699,7 +4699,7 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
} else if (response instanceof TLRPC.TL_help_promoData) {
|
} else if (response instanceof TLRPC.TL_help_promoData) {
|
||||||
final TLRPC.TL_help_promoData res = (TLRPC.TL_help_promoData) response;
|
final TLRPC.TL_help_promoData res = (TLRPC.TL_help_promoData) response;
|
||||||
|
|
||||||
if (res.proxy && NekoConfig.hideProxySponsorChannel) {
|
if (res.proxy && (NekoConfig.hideProxySponsorChannel || (SharedConfig.currentProxy != null || SharedConfig.currentProxy.subId == 1L))) {
|
||||||
nextPromoInfoCheckTime = getConnectionsManager().getCurrentTime() + 60 * 60;
|
nextPromoInfoCheckTime = getConnectionsManager().getCurrentTime() + 60 * 60;
|
||||||
noDialog = true;
|
noDialog = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -5353,7 +5353,7 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processLoadedMessages(TLRPC.messages_Messages messagesRes, long dialogId, long mergeDialogId, int count, int max_id, int offset_date, boolean isCache, int classGuid,
|
public void processLoadedMessages(TLRPC.messages_Messages messagesRes, long dialogId, long mergeDialogId, int count, int max_id, int offset_date, boolean isCache, int classGuid,
|
||||||
int first_unread, int last_message_id, int unread_count, int last_date, int load_type, boolean isChannel, boolean isEnd, boolean scheduled, int loadIndex, boolean queryFromServer, int mentionsCount) {
|
int first_unread, int last_message_id, int unread_count, int last_date, int load_type, boolean isChannel, boolean isEnd, boolean scheduled, int loadIndex, boolean queryFromServer, int mentionsCount) {
|
||||||
if (BuildVars.LOGS_ENABLED) {
|
if (BuildVars.LOGS_ENABLED) {
|
||||||
FileLog.d("processLoadedMessages size " + messagesRes.messages.size() + " in chat " + dialogId + " count " + count + " max_id " + max_id + " cache " + isCache + " guid " + classGuid + " load_type " + load_type + " last_message_id " + last_message_id + " isChannel " + isChannel + " index " + loadIndex + " firstUnread " + first_unread + " unread_count " + unread_count + " last_date " + last_date + " queryFromServer " + queryFromServer);
|
FileLog.d("processLoadedMessages size " + messagesRes.messages.size() + " in chat " + dialogId + " count " + count + " max_id " + max_id + " cache " + isCache + " guid " + classGuid + " load_type " + load_type + " last_message_id " + last_message_id + " isChannel " + isChannel + " index " + loadIndex + " firstUnread " + first_unread + " unread_count " + unread_count + " last_date " + last_date + " queryFromServer " + queryFromServer);
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,7 @@ import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
import tw.nekomimi.nekogram.NekoConfig;
|
import tw.nekomimi.nekogram.NekoConfig;
|
||||||
|
import tw.nekomimi.nekogram.parts.ProxySwitcher;
|
||||||
import tw.nekomimi.nekogram.utils.DnsFactory;
|
import tw.nekomimi.nekogram.utils.DnsFactory;
|
||||||
import tw.nekomimi.nekogram.utils.UIUtil;
|
import tw.nekomimi.nekogram.utils.UIUtil;
|
||||||
|
|
||||||
|
@ -489,6 +490,7 @@ public class ConnectionsManager extends BaseController {
|
||||||
getInstance(currentAccount).connectionState = state;
|
getInstance(currentAccount).connectionState = state;
|
||||||
AccountInstance.getInstance(currentAccount).getNotificationCenter().postNotificationName(NotificationCenter.didUpdateConnectionState);
|
AccountInstance.getInstance(currentAccount).getNotificationCenter().postNotificationName(NotificationCenter.didUpdateConnectionState);
|
||||||
});
|
});
|
||||||
|
ProxySwitcher.didReceivedNotification(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void onLogout(final int currentAccount) {
|
public static void onLogout(final int currentAccount) {
|
||||||
|
|
|
@ -819,8 +819,12 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
|
||||||
subInfo.lastFetch = System.currentTimeMillis();
|
subInfo.lastFetch = System.currentTimeMillis();
|
||||||
|
|
||||||
SubManager.getSubList().update(subInfo, true);
|
SubManager.getSubList().update(subInfo, true);
|
||||||
|
SharedConfig.reloadProxyList();
|
||||||
|
|
||||||
} catch (SubInfo.AllTriesFailed allTriesFailed) {
|
} catch (SubInfo.AllTriesFailed allTriesFailed) {
|
||||||
|
|
||||||
|
FileLog.e(allTriesFailed);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -824,7 +824,8 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("NewApi") private void addProxy() {
|
@SuppressLint("NewApi")
|
||||||
|
private void addProxy() {
|
||||||
|
|
||||||
BottomSheet.Builder builder = new BottomSheet.Builder(getParentActivity());
|
BottomSheet.Builder builder = new BottomSheet.Builder(getParentActivity());
|
||||||
|
|
||||||
|
@ -1033,10 +1034,6 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente
|
||||||
|
|
||||||
public void checkSingleProxy(SharedConfig.ProxyInfo proxyInfo, int repeat, Runnable callback) {
|
public void checkSingleProxy(SharedConfig.ProxyInfo proxyInfo, int repeat, Runnable callback) {
|
||||||
|
|
||||||
proxyInfo.checking = true;
|
|
||||||
|
|
||||||
UIUtil.runOnUIThread(() -> NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.proxyCheckDone, proxyInfo));
|
|
||||||
|
|
||||||
UIUtil.runOnIoDispatcher(() -> {
|
UIUtil.runOnIoDispatcher(() -> {
|
||||||
|
|
||||||
if (proxyInfo instanceof SharedConfig.ExternalSocks5Proxy && !((SharedConfig.ExternalSocks5Proxy) proxyInfo).isStarted()) {
|
if (proxyInfo instanceof SharedConfig.ExternalSocks5Proxy && !((SharedConfig.ExternalSocks5Proxy) proxyInfo).isStarted()) {
|
||||||
|
@ -1057,11 +1054,11 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente
|
||||||
}
|
}
|
||||||
|
|
||||||
proxyInfo.proxyCheckPingId = ConnectionsManager.getInstance(currentAccount).checkProxy(proxyInfo.address, proxyInfo.port, proxyInfo.username, proxyInfo.password, proxyInfo.secret, time -> AndroidUtilities.runOnUIThread(() -> {
|
proxyInfo.proxyCheckPingId = ConnectionsManager.getInstance(currentAccount).checkProxy(proxyInfo.address, proxyInfo.port, proxyInfo.username, proxyInfo.password, proxyInfo.secret, time -> AndroidUtilities.runOnUIThread(() -> {
|
||||||
proxyInfo.availableCheckTime = SystemClock.elapsedRealtime();
|
|
||||||
if (time == -1) {
|
if (time == -1) {
|
||||||
if (repeat > 0) {
|
if (repeat > 0) {
|
||||||
checkSingleProxy(proxyInfo, repeat - 1, callback);
|
checkSingleProxy(proxyInfo, repeat - 1, callback);
|
||||||
} else {
|
} else {
|
||||||
|
proxyInfo.availableCheckTime = SystemClock.elapsedRealtime();
|
||||||
proxyInfo.checking = false;
|
proxyInfo.checking = false;
|
||||||
proxyInfo.available = false;
|
proxyInfo.available = false;
|
||||||
proxyInfo.ping = 0;
|
proxyInfo.ping = 0;
|
||||||
|
@ -1073,6 +1070,7 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
proxyInfo.availableCheckTime = SystemClock.elapsedRealtime();
|
||||||
proxyInfo.checking = false;
|
proxyInfo.checking = false;
|
||||||
proxyInfo.ping = time;
|
proxyInfo.ping = time;
|
||||||
proxyInfo.available = true;
|
proxyInfo.available = true;
|
||||||
|
|
|
@ -900,14 +900,14 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter
|
||||||
questionRow = -1;
|
questionRow = -1;
|
||||||
faqRow = rowCount++;
|
faqRow = rowCount++;
|
||||||
policyRow = -1;
|
policyRow = -1;
|
||||||
if (BuildVars.DEBUG_VERSION) {
|
if (BuildVars.LOGS_ENABLED) {
|
||||||
helpSectionCell = rowCount++;
|
helpSectionCell = rowCount++;
|
||||||
debugHeaderRow = rowCount++;
|
debugHeaderRow = rowCount++;
|
||||||
} else {
|
} else {
|
||||||
helpSectionCell = -1;
|
helpSectionCell = -1;
|
||||||
debugHeaderRow = -1;
|
debugHeaderRow = -1;
|
||||||
}
|
}
|
||||||
if (BuildVars.DEBUG_VERSION) {
|
if (BuildVars.LOGS_ENABLED) {
|
||||||
sendLogsRow = rowCount++;
|
sendLogsRow = rowCount++;
|
||||||
clearLogsRow = rowCount++;
|
clearLogsRow = rowCount++;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -106,6 +106,8 @@ public class NekoConfig {
|
||||||
public static boolean disableAppBarShadow;
|
public static boolean disableAppBarShadow;
|
||||||
public static boolean mediaPreview;
|
public static boolean mediaPreview;
|
||||||
|
|
||||||
|
public static boolean proxyAutoSwitch;
|
||||||
|
|
||||||
public static String formatLang(String name) {
|
public static String formatLang(String name) {
|
||||||
|
|
||||||
if (name == null) {
|
if (name == null) {
|
||||||
|
@ -210,6 +212,8 @@ public class NekoConfig {
|
||||||
disableAppBarShadow = preferences.getBoolean("disableAppBarShadow", false);
|
disableAppBarShadow = preferences.getBoolean("disableAppBarShadow", false);
|
||||||
mediaPreview = preferences.getBoolean("mediaPreview", false);
|
mediaPreview = preferences.getBoolean("mediaPreview", false);
|
||||||
|
|
||||||
|
proxyAutoSwitch = preferences.getBoolean("proxy_auto_switch", false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void toggleShowAddToSavedMessages() {
|
public static void toggleShowAddToSavedMessages() {
|
||||||
|
@ -697,4 +701,11 @@ public class NekoConfig {
|
||||||
preferences.edit().putBoolean("mediaPreview",mediaPreview = !mediaPreview).apply();
|
preferences.edit().putBoolean("mediaPreview",mediaPreview = !mediaPreview).apply();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void toggleProxyAutoSwitch() {
|
||||||
|
|
||||||
|
preferences.edit().putBoolean("proxy_auto_switch",proxyAutoSwitch = !proxyAutoSwitch).apply();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,19 +1,117 @@
|
||||||
package tw.nekomimi.nekogram.parts
|
package tw.nekomimi.nekogram.parts
|
||||||
|
|
||||||
import android.os.SystemClock
|
import android.os.SystemClock
|
||||||
import cn.hutool.core.thread.ThreadUtil
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.GlobalScope
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.telegram.messenger.AndroidUtilities
|
import org.telegram.messenger.AndroidUtilities
|
||||||
import org.telegram.messenger.NotificationCenter
|
import org.telegram.messenger.NotificationCenter
|
||||||
import org.telegram.messenger.SharedConfig
|
import org.telegram.messenger.SharedConfig
|
||||||
import org.telegram.messenger.SharedConfig.ExternalSocks5Proxy
|
import org.telegram.messenger.SharedConfig.ExternalSocks5Proxy
|
||||||
|
import org.telegram.messenger.UserConfig
|
||||||
|
import org.telegram.tgnet.ConnectionsManager
|
||||||
import org.telegram.ui.ProxyListActivity
|
import org.telegram.ui.ProxyListActivity
|
||||||
|
import tw.nekomimi.nekogram.utils.UIUtil
|
||||||
import java.util.concurrent.ExecutorService
|
import java.util.concurrent.ExecutorService
|
||||||
import java.util.concurrent.atomic.AtomicBoolean
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
|
|
||||||
@JvmOverloads
|
private suspend fun postCheckSingleProxy(proxyInfo: SharedConfig.ProxyInfo, repeat: Int) {
|
||||||
|
|
||||||
|
val lock = AtomicBoolean()
|
||||||
|
|
||||||
|
if (proxyInfo is ExternalSocks5Proxy && !proxyInfo.isStarted) {
|
||||||
|
proxyInfo.start()
|
||||||
|
delay(233L)
|
||||||
|
}
|
||||||
|
|
||||||
|
var time = -1L
|
||||||
|
val startAt = SystemClock.elapsedRealtime()
|
||||||
|
|
||||||
|
proxyInfo.proxyCheckPingId = ConnectionsManager.getInstance(UserConfig.selectedAccount).checkProxy(proxyInfo.address, proxyInfo.port, proxyInfo.username, proxyInfo.password, proxyInfo.secret) {
|
||||||
|
time = it
|
||||||
|
lock.set(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!lock.get() && SystemClock.elapsedRealtime() - startAt < 4000L) delay(100L)
|
||||||
|
|
||||||
|
if (!lock.get()) {
|
||||||
|
|
||||||
|
proxyInfo.availableCheckTime = SystemClock.elapsedRealtime()
|
||||||
|
proxyInfo.checking = false
|
||||||
|
proxyInfo.available = false
|
||||||
|
proxyInfo.ping = 0
|
||||||
|
if (proxyInfo is ExternalSocks5Proxy && proxyInfo !== SharedConfig.currentProxy) {
|
||||||
|
proxyInfo.stop()
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time == -1L) {
|
||||||
|
if (repeat > 0) {
|
||||||
|
postCheckSingleProxy(proxyInfo, repeat - 1)
|
||||||
|
} else {
|
||||||
|
proxyInfo.availableCheckTime = SystemClock.elapsedRealtime()
|
||||||
|
proxyInfo.checking = false
|
||||||
|
proxyInfo.available = false
|
||||||
|
proxyInfo.ping = -1L
|
||||||
|
if (proxyInfo is ExternalSocks5Proxy && proxyInfo !== SharedConfig.currentProxy) {
|
||||||
|
proxyInfo.stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
proxyInfo.availableCheckTime = SystemClock.elapsedRealtime()
|
||||||
|
proxyInfo.checking = false
|
||||||
|
proxyInfo.ping = time
|
||||||
|
proxyInfo.available = true
|
||||||
|
if (proxyInfo is ExternalSocks5Proxy && proxyInfo !== SharedConfig.currentProxy) {
|
||||||
|
proxyInfo.stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun postCheckProxyList() = GlobalScope.launch(Dispatchers.IO) {
|
||||||
|
|
||||||
|
SharedConfig.getProxyList().forEach { proxyInfo ->
|
||||||
|
|
||||||
|
if (proxyInfo.checking || SystemClock.elapsedRealtime() - proxyInfo.availableCheckTime < 2 * 60 * 1000L) {
|
||||||
|
|
||||||
|
return@forEach
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
synchronized(proxyInfo) {
|
||||||
|
|
||||||
|
if (proxyInfo.checking || SystemClock.elapsedRealtime() - proxyInfo.availableCheckTime < 2 * 60 * 1000L) {
|
||||||
|
|
||||||
|
return@forEach
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
proxyInfo.checking = true
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
runCatching {
|
||||||
|
|
||||||
|
postCheckSingleProxy(proxyInfo, 1)
|
||||||
|
|
||||||
|
}.onFailure {
|
||||||
|
|
||||||
|
proxyInfo.availableCheckTime = SystemClock.elapsedRealtime()
|
||||||
|
proxyInfo.checking = false
|
||||||
|
proxyInfo.available = false
|
||||||
|
proxyInfo.ping = 0
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
fun ProxyListActivity.checkProxyList(force: Boolean, context: ExecutorService) {
|
fun ProxyListActivity.checkProxyList(force: Boolean, context: ExecutorService) {
|
||||||
|
|
||||||
GlobalScope.launch(Dispatchers.IO) {
|
GlobalScope.launch(Dispatchers.IO) {
|
||||||
|
@ -36,7 +134,11 @@ fun ProxyListActivity.checkProxyList(force: Boolean, context: ExecutorService) {
|
||||||
|
|
||||||
val lock = AtomicBoolean()
|
val lock = AtomicBoolean()
|
||||||
|
|
||||||
checkSingleProxy(it, if (it is ExternalSocks5Proxy) 3 else 0) {
|
val startAt = SystemClock.elapsedRealtime()
|
||||||
|
|
||||||
|
UIUtil.runOnUIThread { NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.proxyCheckDone, it) }
|
||||||
|
|
||||||
|
checkSingleProxy(it, if (it is ExternalSocks5Proxy) 3 else 1) {
|
||||||
|
|
||||||
AndroidUtilities.runOnUIThread {
|
AndroidUtilities.runOnUIThread {
|
||||||
|
|
||||||
|
@ -48,8 +150,26 @@ fun ProxyListActivity.checkProxyList(force: Boolean, context: ExecutorService) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!lock.get()) ThreadUtil.sleep(100L)
|
while (!lock.get() && SystemClock.elapsedRealtime() - startAt < 4000L) Thread.sleep(100L)
|
||||||
|
|
||||||
|
if (!lock.get()) {
|
||||||
|
|
||||||
|
it.availableCheckTime = SystemClock.elapsedRealtime()
|
||||||
|
it.checking = false
|
||||||
|
it.available = false
|
||||||
|
it.ping = 0
|
||||||
|
if (it is ExternalSocks5Proxy && it !== SharedConfig.currentProxy) {
|
||||||
|
it.stop()
|
||||||
|
}
|
||||||
|
|
||||||
|
AndroidUtilities.runOnUIThread {
|
||||||
|
|
||||||
|
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.proxyCheckDone, it)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,110 @@
|
||||||
|
package tw.nekomimi.nekogram.parts
|
||||||
|
|
||||||
|
import org.telegram.messenger.SharedConfig
|
||||||
|
import org.telegram.tgnet.ConnectionsManager
|
||||||
|
import tw.nekomimi.nekogram.NekoConfig
|
||||||
|
import tw.nekomimi.nekogram.utils.UIUtil
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
object ProxySwitcher {
|
||||||
|
|
||||||
|
var currentConnectionState = ConnectionsManager.ConnectionStateWaitingForNetwork
|
||||||
|
val switchTimer by lazy { Timer("Proxy Switch Timer") }
|
||||||
|
var currentTask: SwitchTask? = null
|
||||||
|
|
||||||
|
|
||||||
|
fun cancel() {
|
||||||
|
|
||||||
|
currentTask = null
|
||||||
|
switchTimer.purge()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun reschedule() {
|
||||||
|
|
||||||
|
cancel()
|
||||||
|
switchTimer.schedule(SwitchTask().also { currentTask = it }, 3000L)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun didReceivedNotification(connectionState: Int) = UIUtil.runOnIoDispatcher run@{
|
||||||
|
|
||||||
|
if (!NekoConfig.proxyAutoSwitch) return@run
|
||||||
|
|
||||||
|
currentConnectionState = connectionState
|
||||||
|
|
||||||
|
if (currentConnectionState == ConnectionsManager.ConnectionStateConnectingToProxy) {
|
||||||
|
|
||||||
|
reschedule()
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
cancel()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class SwitchTask : TimerTask() {
|
||||||
|
|
||||||
|
override fun run() {
|
||||||
|
|
||||||
|
if (this != currentTask) return
|
||||||
|
|
||||||
|
if (currentConnectionState != ConnectionsManager.ConnectionStateConnectingToProxy) return
|
||||||
|
|
||||||
|
var proxyList = SharedConfig.getProxyList().takeIf { it.size > 1 } ?: return
|
||||||
|
|
||||||
|
val current = SharedConfig.currentProxy ?: return
|
||||||
|
|
||||||
|
val currIndex = proxyList.indexOf(current)
|
||||||
|
|
||||||
|
if (currIndex > 0) {
|
||||||
|
|
||||||
|
val proxyListNew = LinkedList<SharedConfig.ProxyInfo>()
|
||||||
|
|
||||||
|
proxyListNew.addAll(proxyList.subList(currIndex, proxyList.size))
|
||||||
|
proxyListNew.addAll(proxyList.subList(0, currIndex + 1))
|
||||||
|
|
||||||
|
proxyList = proxyListNew
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (proxyList.all { it.availableCheckTime == 0L }) {
|
||||||
|
|
||||||
|
if (proxyList.all { !it.checking }) {
|
||||||
|
|
||||||
|
repeat(3) { postCheckProxyList() }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentConnectionState != ConnectionsManager.ConnectionStateConnectingToProxy) return
|
||||||
|
|
||||||
|
SharedConfig.setCurrentProxy(proxyList[0])
|
||||||
|
|
||||||
|
reschedule()
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
proxyList.forEach {
|
||||||
|
|
||||||
|
if (it.availableCheckTime != 0L && !it.available) return@forEach
|
||||||
|
|
||||||
|
if (currentConnectionState != ConnectionsManager.ConnectionStateConnectingToProxy) return
|
||||||
|
|
||||||
|
SharedConfig.setCurrentProxy(it)
|
||||||
|
|
||||||
|
reschedule()
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -60,14 +60,13 @@ public class NekoExperimentalSettingsActivity extends BaseFragment {
|
||||||
private int experimentRow;
|
private int experimentRow;
|
||||||
private int smoothKeyboardRow;
|
private int smoothKeyboardRow;
|
||||||
private int mediaPreviewRow;
|
private int mediaPreviewRow;
|
||||||
|
private int proxyAutoSwitchRow;
|
||||||
private int disableFilteringRow;
|
private int disableFilteringRow;
|
||||||
private int unlimitedFavedStickersRow;
|
private int unlimitedFavedStickersRow;
|
||||||
private int unlimitedPinnedDialogsRow;
|
private int unlimitedPinnedDialogsRow;
|
||||||
private int deleteAccountRow;
|
private int deleteAccountRow;
|
||||||
private int experiment2Row;
|
private int experiment2Row;
|
||||||
|
|
||||||
private int shouldNOTTrustMeRow;
|
|
||||||
|
|
||||||
private UndoView tooltip;
|
private UndoView tooltip;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -224,6 +223,11 @@ public class NekoExperimentalSettingsActivity extends BaseFragment {
|
||||||
tooltip.setInfoText(AndroidUtilities.replaceTags(LocaleController.formatString("BetaWarning", R.string.BetaWarning)));
|
tooltip.setInfoText(AndroidUtilities.replaceTags(LocaleController.formatString("BetaWarning", R.string.BetaWarning)));
|
||||||
tooltip.showWithAction(0, UndoView.ACTION_CACHE_WAS_CLEARED, null, null);
|
tooltip.showWithAction(0, UndoView.ACTION_CACHE_WAS_CLEARED, null, null);
|
||||||
}
|
}
|
||||||
|
} else if (position == proxyAutoSwitchRow) {
|
||||||
|
NekoConfig.toggleProxyAutoSwitch();
|
||||||
|
if (view instanceof TextCheckCell) {
|
||||||
|
((TextCheckCell) view).setChecked(NekoConfig.proxyAutoSwitch);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -248,6 +252,7 @@ public class NekoExperimentalSettingsActivity extends BaseFragment {
|
||||||
experimentRow = rowCount++;
|
experimentRow = rowCount++;
|
||||||
smoothKeyboardRow = !AndroidUtilities.isTablet() ? rowCount++ : -1;
|
smoothKeyboardRow = !AndroidUtilities.isTablet() ? rowCount++ : -1;
|
||||||
mediaPreviewRow = rowCount++;
|
mediaPreviewRow = rowCount++;
|
||||||
|
proxyAutoSwitchRow = rowCount++;
|
||||||
disableFilteringRow = rowCount++;
|
disableFilteringRow = rowCount++;
|
||||||
unlimitedFavedStickersRow = rowCount++;
|
unlimitedFavedStickersRow = rowCount++;
|
||||||
unlimitedPinnedDialogsRow = rowCount++;
|
unlimitedPinnedDialogsRow = rowCount++;
|
||||||
|
@ -389,8 +394,10 @@ public class NekoExperimentalSettingsActivity extends BaseFragment {
|
||||||
textCell.setTextAndCheck(LocaleController.getString("DebugMenuEnableSmoothKeyboard", R.string.DebugMenuEnableSmoothKeyboard), SharedConfig.smoothKeyboard, true);
|
textCell.setTextAndCheck(LocaleController.getString("DebugMenuEnableSmoothKeyboard", R.string.DebugMenuEnableSmoothKeyboard), SharedConfig.smoothKeyboard, true);
|
||||||
} else if (position == unlimitedPinnedDialogsRow) {
|
} else if (position == unlimitedPinnedDialogsRow) {
|
||||||
textCell.setTextAndValueAndCheck(LocaleController.getString("UnlimitedPinnedDialogs", R.string.UnlimitedPinnedDialogs), LocaleController.getString("UnlimitedPinnedDialogsAbout", R.string.UnlimitedPinnedDialogsAbout), NekoConfig.unlimitedPinnedDialogs, true, deleteAccountRow != -1);
|
textCell.setTextAndValueAndCheck(LocaleController.getString("UnlimitedPinnedDialogs", R.string.UnlimitedPinnedDialogs), LocaleController.getString("UnlimitedPinnedDialogsAbout", R.string.UnlimitedPinnedDialogsAbout), NekoConfig.unlimitedPinnedDialogs, true, deleteAccountRow != -1);
|
||||||
} else if (position == mediaPreviewRow) {
|
} else if (position == mediaPreviewRow) {
|
||||||
textCell.setTextAndCheck(LocaleController.getString("MediaPreview", R.string.MediaPreview), NekoConfig.mediaPreview, true);
|
textCell.setTextAndCheck(LocaleController.getString("MediaPreview", R.string.MediaPreview), NekoConfig.mediaPreview, true);
|
||||||
|
} else if (position == proxyAutoSwitchRow) {
|
||||||
|
textCell.setTextAndCheck(LocaleController.getString("ProxyAutoSwitch", R.string.ProxyAutoSwitch), NekoConfig.proxyAutoSwitch, true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -453,13 +460,10 @@ public class NekoExperimentalSettingsActivity extends BaseFragment {
|
||||||
return 1;
|
return 1;
|
||||||
} else if (position == deleteAccountRow) {
|
} else if (position == deleteAccountRow) {
|
||||||
return 2;
|
return 2;
|
||||||
} else if (position == unlimitedFavedStickersRow || position == disableFilteringRow ||
|
|
||||||
position == smoothKeyboardRow || position == unlimitedPinnedDialogsRow || position == mediaPreviewRow) {
|
|
||||||
return 3;
|
|
||||||
} else if (position == experimentRow) {
|
} else if (position == experimentRow) {
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
return 2;
|
return 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,14 +21,14 @@ object HttpUtil {
|
||||||
@JvmField
|
@JvmField
|
||||||
val okHttpClient = OkHttpClient().newBuilder()
|
val okHttpClient = OkHttpClient().newBuilder()
|
||||||
.dns(DnsFactory)
|
.dns(DnsFactory)
|
||||||
.connectTimeout(3, TimeUnit.SECONDS)
|
.connectTimeout(2, TimeUnit.SECONDS)
|
||||||
.readTimeout(3, TimeUnit.SECONDS)
|
.readTimeout(2, TimeUnit.SECONDS)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
val okHttpClientNoDoh = OkHttpClient()
|
val okHttpClientNoDoh = OkHttpClient()
|
||||||
.newBuilder()
|
.newBuilder()
|
||||||
.connectTimeout(3, TimeUnit.SECONDS)
|
.connectTimeout(2, TimeUnit.SECONDS)
|
||||||
.readTimeout(3, TimeUnit.SECONDS)
|
.readTimeout(2, TimeUnit.SECONDS)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
<string name="PrivacyNotice2fa">تم اكتشاف أنك لم تقم بإيقاف تشغيل إعدادات \"المكالمات من نظير لنظيرp2p\"، قد يتسبب في العثور على هويتك الحقيقية للقرصنة التي تسيطر عليها الحكومة، يرجى إيقافها!</string>
|
<string name="PrivacyNotice2fa">تم اكتشاف أنك لم تقم بإيقاف تشغيل إعدادات \"المكالمات من نظير لنظيرp2p\"، قد يتسبب في العثور على هويتك الحقيقية للقرصنة التي تسيطر عليها الحكومة، يرجى إيقافها!</string>
|
||||||
<string name="ApplySuggestion">حسنًا، قم بتطبيقه</string>
|
<string name="ApplySuggestion">حسنًا، قم بتطبيقه</string>
|
||||||
<string name="DoNotRemindAgain">لا تذكرني مرة أخرى</string>
|
<string name="DoNotRemindAgain">لا تذكرني مرة أخرى</string>
|
||||||
<string name="InstantViewTransWithWeb">لا يمكن ترجمة InstantView مع مترجم الويب</string>
|
|
||||||
<string name="RemoveTitleEmoji">إزالة الرموز التعبيرية من العناوين</string>
|
<string name="RemoveTitleEmoji">إزالة الرموز التعبيرية من العناوين</string>
|
||||||
<string name="NekoXProxy">خادم NekoX العام</string>
|
<string name="NekoXProxy">خادم NekoX العام</string>
|
||||||
<string name="PublicPrefix">عامة</string>
|
<string name="PublicPrefix">عامة</string>
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
<string name="PrivacyNotice2fa">Es wurde festgestellt, dass Du kein Passwort festgelegt hast, was dazu führen kann, dass staatlich kontrollierte Hacker Deine wahre Identität ermitteln können. Bitte setze eines!</string>
|
<string name="PrivacyNotice2fa">Es wurde festgestellt, dass Du kein Passwort festgelegt hast, was dazu führen kann, dass staatlich kontrollierte Hacker Deine wahre Identität ermitteln können. Bitte setze eines!</string>
|
||||||
<string name="ApplySuggestion">OK, anwenden</string>
|
<string name="ApplySuggestion">OK, anwenden</string>
|
||||||
<string name="DoNotRemindAgain">Nicht mehr erinnern</string>
|
<string name="DoNotRemindAgain">Nicht mehr erinnern</string>
|
||||||
<string name="InstantViewTransWithWeb">InstantView kann nicht mit dem Web-Übersetzer übersetzt werden</string>
|
|
||||||
<string name="RemoveTitleEmoji">Emoji im Titel entfernen</string>
|
<string name="RemoveTitleEmoji">Emoji im Titel entfernen</string>
|
||||||
<string name="NekoXProxy">Öffentlicher NekoX-Proxy</string>
|
<string name="NekoXProxy">Öffentlicher NekoX-Proxy</string>
|
||||||
<string name="PublicPrefix">Öffentlich</string>
|
<string name="PublicPrefix">Öffentlich</string>
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
<string name="PrivacyNotice2fa">Se detecta que no ha establecido una contraseña, lo que puede causar que los hackers controlados por el gobierno encuentren su verdadera identidad, ¡por favor configure una!</string>
|
<string name="PrivacyNotice2fa">Se detecta que no ha establecido una contraseña, lo que puede causar que los hackers controlados por el gobierno encuentren su verdadera identidad, ¡por favor configure una!</string>
|
||||||
<string name="ApplySuggestion">OK, aplícalo</string>
|
<string name="ApplySuggestion">OK, aplícalo</string>
|
||||||
<string name="DoNotRemindAgain">No volver a recordar</string>
|
<string name="DoNotRemindAgain">No volver a recordar</string>
|
||||||
<string name="InstantViewTransWithWeb">No se puede traducir InstantView con el traductor web</string>
|
|
||||||
<string name="RemoveTitleEmoji">Eliminar emoji en el título</string>
|
<string name="RemoveTitleEmoji">Eliminar emoji en el título</string>
|
||||||
<string name="NekoXProxy">Proxy público de NekoX</string>
|
<string name="NekoXProxy">Proxy público de NekoX</string>
|
||||||
<string name="PublicPrefix">Público</string>
|
<string name="PublicPrefix">Público</string>
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
<string name="PrivacyNotice2fa">تشخیص داده می شود که رمز عبوری تنظیم نکرده اید ، و این ممکن است باعث شود هکرهای تحت کنترل دولت هویت واقعی شما را پیدا کنند ، لطفاً آنرا تعیین کنید</string>
|
<string name="PrivacyNotice2fa">تشخیص داده می شود که رمز عبوری تنظیم نکرده اید ، و این ممکن است باعث شود هکرهای تحت کنترل دولت هویت واقعی شما را پیدا کنند ، لطفاً آنرا تعیین کنید</string>
|
||||||
<string name="ApplySuggestion">قبول،اعمال کن</string>
|
<string name="ApplySuggestion">قبول،اعمال کن</string>
|
||||||
<string name="DoNotRemindAgain">دیگر یادآوری نشود</string>
|
<string name="DoNotRemindAgain">دیگر یادآوری نشود</string>
|
||||||
<string name="InstantViewTransWithWeb">ترجمه InstantView با مترجم وب امکان پذیر نیست</string>
|
|
||||||
<string name="RemoveTitleEmoji">حذف ایموجی کنار اسم Nekogram x</string>
|
<string name="RemoveTitleEmoji">حذف ایموجی کنار اسم Nekogram x</string>
|
||||||
<string name="NekoXProxy">پروکسی عمومی NekoX</string>
|
<string name="NekoXProxy">پروکسی عمومی NekoX</string>
|
||||||
<string name="PublicPrefix">عمومی</string>
|
<string name="PublicPrefix">عمومی</string>
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
<string name="PrivacyNotice2fa">מתגלה שלא הגדרת סיסמה, מה שעלול לגרום להאקרים שבשליטת הממשלה למצוא את זהותך האמיתית, אנא הגדר סיסמה!</string>
|
<string name="PrivacyNotice2fa">מתגלה שלא הגדרת סיסמה, מה שעלול לגרום להאקרים שבשליטת הממשלה למצוא את זהותך האמיתית, אנא הגדר סיסמה!</string>
|
||||||
<string name="ApplySuggestion">אוקיי, החל אותו</string>
|
<string name="ApplySuggestion">אוקיי, החל אותו</string>
|
||||||
<string name="DoNotRemindAgain">אל תזכיר שוב</string>
|
<string name="DoNotRemindAgain">אל תזכיר שוב</string>
|
||||||
<string name="InstantViewTransWithWeb">לא ניתן לתרגם את InstantView באמצעות מתרגם לאינטרנט</string>
|
|
||||||
<string name="RemoveTitleEmoji">הסר אמוג\'י בכותרת</string>
|
<string name="RemoveTitleEmoji">הסר אמוג\'י בכותרת</string>
|
||||||
<string name="NekoXProxy">פרוקסי ציבור NekoX</string>
|
<string name="NekoXProxy">פרוקסי ציבור NekoX</string>
|
||||||
<string name="PublicPrefix">ציבורי</string>
|
<string name="PublicPrefix">ציבורי</string>
|
||||||
|
|
|
@ -1,170 +1,2 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources></resources>
|
||||||
<string name="CustomApi">Egyéni API</string>
|
|
||||||
<string name="UseCustomApiNotice">Jelentkezzen be az egyéni alkalmazás segítségével, ha nem tud regisztrálni vagy bejelentkezni, ez segíthet.\n\nMegjegyzés: Az fcm nem fog működni, ha a kiadási verziót használja.</string>
|
|
||||||
<string name="CustomApiNo">Ne használjon egyedi API-t</string>
|
|
||||||
<string name="CustomApiOfficial">Android távirat</string>
|
|
||||||
<string name="CustomApiTGX">Telegram Android X</string>
|
|
||||||
<string name="CustomApiInput">Kézi bevitel</string>
|
|
||||||
<string name="CheckUpdate">Frissítés ellenőrzése</string>
|
|
||||||
<string name="SwitchVersion">Váltás a verzióra</string>
|
|
||||||
<string name="NoUpdate">Nem található frissítés</string>
|
|
||||||
<string name="UpdateAvailable">Új frissítés elérhető</string>
|
|
||||||
<string name="UpdateUpdate">frissítés</string>
|
|
||||||
<string name="UpdateLater">Majd később</string>
|
|
||||||
<string name="DownloadFailed">Sikertelen letöltés</string>
|
|
||||||
<string name="Install">Telepítés</string>
|
|
||||||
<string name="Ignore">Figyelmen kívül hagyni</string>
|
|
||||||
<string name="UpdateDownloaded">Nemrég letöltött egy frissítést.</string>
|
|
||||||
<string name="LinkedGroupChat">Kapcsolt csoport</string>
|
|
||||||
<string name="LinkedChannelChat">Linked Channel</string>
|
|
||||||
<string name="DevModeTitle">** Távszámláját betilthatjuk **</string>
|
|
||||||
<string name="DevModeNotice">Nem vagyunk felelősek a fejlesztői szolgáltatások nem megfelelő használatáért.</string>
|
|
||||||
<string name="TapToDisable">Érintse meg a letiltáshoz. Nem kell ezekre.</string>
|
|
||||||
<string name="PlaceHolder">Helyőrző - kérjük, tiltsa le</string>
|
|
||||||
<string name="CustomBackend">Egyéni háttér</string>
|
|
||||||
<string name="CustomBackendNotice">Ezt a funkciót csak szakértő felhasználók számára biztosítják, ha nem tudják, hogy mit jelentenek a következő lehetőségek, akkor hagyja figyelmen kívül.</string>
|
|
||||||
<string name="CustomBackendProduction">Hivatalos Gyártási DataCenter</string>
|
|
||||||
<string name="CustomBackendTestDC">Hivatalos teszt-adatközpont</string>
|
|
||||||
<string name="CustomBackendIpv4">IPv4 cím</string>
|
|
||||||
<string name="CustomBackendIpv6">IPv6 cím</string>
|
|
||||||
<string name="CustomBackendLayer">Réteg</string>
|
|
||||||
<string name="CustomBackendPublicKey">Nyilvános kulcs</string>
|
|
||||||
<string name="CustomBackendFingerprint">Kulcs ujjlenyomata</string>
|
|
||||||
<string name="CachePath">Gyorsítótár könyvtár</string>
|
|
||||||
<string name="AllowFlashCall">Flash hívás engedélyezése</string>
|
|
||||||
<string name="ChangeTranslateProvider">Cserélje ki a szolgáltatót</string>
|
|
||||||
<string name="ProviderYandexTranslate">Yandex.Translate</string>
|
|
||||||
<string name="GoogleCloudTransKey">Google Cloud Translate kulcs</string>
|
|
||||||
<string name="GoogleCloudTransKeyNotice">Ha beállít egy Google Cloud Trans kulcsot, akkor a felhő fordítási API-t hívja meg, és nem fordít hamis űrlapot a webes verzióhoz, amikor fordítja (gyorsabb, stabil és forgalmat takarít meg).</string>
|
|
||||||
<string name="TransToLang">Fordítási célnyelv</string>
|
|
||||||
<string name="TransInputToLang">Fordítási beviteli célnyelv</string>
|
|
||||||
<string name="More">Több</string>
|
|
||||||
<string name="NekoXUpdatesChannel">A NekoX frissíti a csatornát</string>
|
|
||||||
<string name="ShowIdAndDc">ID / DC megjelenítése a profilban</string>
|
|
||||||
<string name="UseDefaultTheme">Alapértelmezett téma használata *</string>
|
|
||||||
<string name="NightMode">Éjszakai mód</string>
|
|
||||||
<string name="PrivacyNotice">Adatvédelmi figyelmeztetés</string>
|
|
||||||
<string name="PrivacyNoticePhoneVisible">Megállapítottuk, hogy mobiltelefonszámát bárki láthatja, ami miatt a kormány által ellenőrzött hackerek megtalálhatják az Ön igazi személyazonosságát, kérjük kapcsolja ki!</string>
|
|
||||||
<string name="PrivacyNoticeAddByPhone">Megállapítást nyert, hogy nem van kikapcsolva az \"Engedélyezzen, hogy telefonszámon keressek\" beállítást, amely miatt a kormány által ellenőrzött hackerek megtalálhatják az Ön igazi személyazonosságát, kérjük, kapcsolja ki!</string>
|
|
||||||
<string name="PrivacyNoticeP2p">Megállapította, hogy nem kapcsolta ki az \"Engedélyezi a P2p hívásokat\" beállítást, amely miatt a kormány által ellenőrzött hackerek megtalálhatják az Ön igazi személyazonosságát, kérjük kapcsolja ki!</string>
|
|
||||||
<string name="PrivacyNotice2fa">Megállapította, hogy még nem állított be jelszót, ami miatt a kormány által ellenőrzött hackerek megtalálhatják az Ön valódi személyazonosságát, kérjük, állítsa be!</string>
|
|
||||||
<string name="ApplySuggestion">OK, alkalmazza</string>
|
|
||||||
<string name="DoNotRemindAgain">Ne emlékeztesse újra</string>
|
|
||||||
<string name="InstantViewTransWithWeb">Az InstantView nem fordítható le webes fordítóval</string>
|
|
||||||
<string name="RemoveTitleEmoji">Távolítsa el a hangulatjeleket a címből</string>
|
|
||||||
<string name="NekoXProxy">NekoX nyilvános proxy</string>
|
|
||||||
<string name="PublicPrefix">Nyilvános</string>
|
|
||||||
<string name="DisableChatAction">Ne küldje el a bemeneti állapotomat</string>
|
|
||||||
<string name="FakeScreenshot">Képzeld el a képernyőképet</string>
|
|
||||||
<string name="Import">import</string>
|
|
||||||
<string name="FilterNameUsers">felhasználók</string>
|
|
||||||
<string name="FilterNameUsersDescription">Csak a privát csevegőktől származó üzenetek</string>
|
|
||||||
<string name="FilterNameContacts">Kapcsolatok</string>
|
|
||||||
<string name="FilterNameContactsDescription">Csak a mentett felhasználók üzenetei</string>
|
|
||||||
<string name="FilterNameGroups">csoportok</string>
|
|
||||||
<string name="FilterNameGroupsDescription">Csak a csoportbeszélgetések üzenetei</string>
|
|
||||||
<string name="FilterNameChannels">Csatornák</string>
|
|
||||||
<string name="FilterNameChannelsDescription">Csak a csatornáktól érkező üzenetek</string>
|
|
||||||
<string name="FilterNameBots">Botok</string>
|
|
||||||
<string name="FilterNameBotsDescription">Csak a robotok üzenetei</string>
|
|
||||||
<string name="FilterNameUnmuted">újra megszólal</string>
|
|
||||||
<string name="FilterNameUnmutedDescription">Csak a némítás nélküli beszélgetések üzenetei</string>
|
|
||||||
<string name="FilterNameUnread2">Nem olvasott</string>
|
|
||||||
<string name="FilterNameUnreadDescription">Csak olvasatlan üzenetek</string>
|
|
||||||
<string name="FilterNameUnmutedAndUnread">Némítva & Olvasatlan</string>
|
|
||||||
<string name="FilterNameUnmutedAndUnreadDescription">Csak olvasatlan üzenetek a némítás nélküli csevegésekből</string>
|
|
||||||
<string name="IgnoreMutedCount">Figyelmen kívül hagyja a néma olvasatlan számot a mappák lapon</string>
|
|
||||||
<string name="DialogsSettings">A párbeszédablakok beállításai</string>
|
|
||||||
<string name="SortMenu">Párbeszédrendezési beállítások</string>
|
|
||||||
<string name="SortByUnread">Rendezés olvasatlanul</string>
|
|
||||||
<string name="SortByUnmuted">Rendezés némítás nélkül</string>
|
|
||||||
<string name="SortByUser">Rendezés felhasználó szerint</string>
|
|
||||||
<string name="SortByContacts">Rendezés névjegyek szerint</string>
|
|
||||||
<string name="NekoXPushService">NekoX push szolgáltatás</string>
|
|
||||||
<string name="EnablePushAlert">Kérjük, engedélyezze a \"NekoX Push Service\" szolgáltatást</string>
|
|
||||||
<string name="DisablePushAlert">Kérjük, tiltsa le a \"NekoX Push Service\" szolgáltatást</string>
|
|
||||||
<string name="DisableUndo">Kapcsolja ki a Visszavonást</string>
|
|
||||||
<string name="DisableSystemAccount">A rendszerfiók letiltása</string>
|
|
||||||
<string name="FilterMenu">A párbeszédablakok szűrőmenüje</string>
|
|
||||||
<string name="DisableProxyWhenVpnEnabled">Proxy letiltása, ha a VPN engedélyezve van</string>
|
|
||||||
<string name="UseProxyItem">Használja az oldalsáv proxy elemét a gomb helyett</string>
|
|
||||||
<string name="HideProxyByDefault">Proxybeállítások elrejtése alapértelmezés szerint</string>
|
|
||||||
<string name="SkipOpenLinkConfirm">Ugrás a nyitott link megerősítéséhez</string>
|
|
||||||
<string name="DeleteAllInChat">Az összes törlése a csevegésben</string>
|
|
||||||
<string name="DeleteAllInChatAlert">Figyelem! Ez ** a chat összes üzenetét ** törli ** az összes ** résztvevő számára.</string>
|
|
||||||
<string name="UnblockAll">Összes feloldása</string>
|
|
||||||
<string name="UnblockAllWarn">Biztos benne, hogy feloldja ** az összes felhasználót és a robotot **?</string>
|
|
||||||
<string name="BlockedListEmpty">Nem blokkoltál senkit :)</string>
|
|
||||||
<string name="ProxyTypeVmess">Vmess Proxy</string>
|
|
||||||
<string name="AddProxySocks5">Adja hozzá a Socks5 Proxy alkalmazást</string>
|
|
||||||
<string name="AddProxyTelegram">Adja hozzá az MTProto Proxy alkalmazást</string>
|
|
||||||
<string name="AddProxyVmess">Adja hozzá a Vmess Proxy-t</string>
|
|
||||||
<string name="AddProxySS">Adjon hozzá Shadowsocks Proxy-t</string>
|
|
||||||
<string name="AddProxySSR">Adjon hozzá ShadowsocksR Proxy-t</string>
|
|
||||||
<string name="AddProxyRB">Adja hozzá a RelayBaton Proxy alkalmazást</string>
|
|
||||||
<string name="SSPluginConflictingName">Több bővítmény használja ezt az azonosítót: %s.</string>
|
|
||||||
<string name="EditProxy">Proxy szerkesztése</string>
|
|
||||||
<string name="ShareProxy">Proxy megosztása</string>
|
|
||||||
<string name="ProxyDelete">Proxy törlése</string>
|
|
||||||
<string name="ProxyInfoVmess">Vmess proxybeállítások</string>
|
|
||||||
<string name="VmessUserId">Felhasználói azonosító</string>
|
|
||||||
<string name="VmessAlterId">Alter Id</string>
|
|
||||||
<string name="VmessSecurity">Biztonság</string>
|
|
||||||
<string name="VmessNetwork">Hálózat</string>
|
|
||||||
<string name="VmessHeadType">Fej típusa</string>
|
|
||||||
<string name="VmessRequestHost">Host / QUIC biztonság kérése</string>
|
|
||||||
<string name="VmessPath">Útvonal / QUIC kulcs</string>
|
|
||||||
<string name="VmessTls">Használja a TLS-t</string>
|
|
||||||
<string name="ProxyInfoSS">Shadowsocks proxybeállítások</string>
|
|
||||||
<string name="SSPassword">Jelszó</string>
|
|
||||||
<string name="SSMethod">Titkosítási módszer</string>
|
|
||||||
<string name="SSPlugin">Csatlakoztat</string>
|
|
||||||
<string name="SSPluginOpts">Beépülő modul konfigurációja</string>
|
|
||||||
<string name="ProxyInfoSSR">ShadowsocksR proxybeállítások</string>
|
|
||||||
<string name="SSRProtocol">Jegyzőkönyv</string>
|
|
||||||
<string name="SSRProtocolParams">Protokollparaméterek</string>
|
|
||||||
<string name="SSRObfs">Obfs</string>
|
|
||||||
<string name="SSRObfsParam">Obfs Param</string>
|
|
||||||
<string name="ProxyInfoRB">RelayBaton proxybeállítások</string>
|
|
||||||
<string name="ESNI">Titkosított SNI</string>
|
|
||||||
<string name="ProxyRemarks">Megjegyzések</string>
|
|
||||||
<string name="RetestPing">Vizsgálja meg újra az összes kiszolgálót</string>
|
|
||||||
<string name="ReorderByPing">Szerverek átrendezése ping segítségével</string>
|
|
||||||
<string name="ExportProxies">Kiszolgálók exportálása fájlba</string>
|
|
||||||
<string name="ImportProxies">Kiszolgálók importálása a fájlból</string>
|
|
||||||
<string name="ImportProxyList">Proxykiszolgálók importálása</string>
|
|
||||||
<string name="ProxySubscription">Proxy előfizetés</string>
|
|
||||||
<string name="ProxySubDetails">Előfizetés részletei</string>
|
|
||||||
<string name="SubscriptionUrls">urls</string>
|
|
||||||
<string name="SubscriptionUpdating">Az előfizetés frissítése</string>
|
|
||||||
<string name="SubscriptionDelete">Az előfizetés törlése</string>
|
|
||||||
<string name="ExportStickers">Export matricák</string>
|
|
||||||
<string name="ImportStickers">Matricák importálása a fájlból</string>
|
|
||||||
<string name="ImportStickersList">Import matricák</string>
|
|
||||||
<string name="StickerSets">Matricakészletek</string>
|
|
||||||
<string name="InvalidStickersFile">Érvénytelen matricafájl: </string>
|
|
||||||
<string name="InvalidProxyFile">Érvénytelen proxy listafájl: </string>
|
|
||||||
<string name="ImportedProxies">Importált proxyszerverek: </string>
|
|
||||||
<string name="ErrorsInImport">Importálási hibák: </string>
|
|
||||||
<string name="NoProxy">Még nem adott meg proxykiszolgálót.</string>
|
|
||||||
<string name="DeleteAllServer">Törölje az összes kiszolgálót</string>
|
|
||||||
<string name="DeleteUnavailableServer">Törölje a nem elérhető kiszolgálókat</string>
|
|
||||||
<string name="DeleteAllServerConfirm">Biztosan törli ** az összes kiszolgálót **?</string>
|
|
||||||
<string name="DeleteUnavailableServerConfirm">Biztosan törli a nem elérhető kiszolgálókat **?</string>
|
|
||||||
<string name="MinApi21Required">Sajnálom, de legalább Android 5-re (API21) van szükséged.</string>
|
|
||||||
<string name="MiniVersionAlert">Sajnos a mini verzió nem támogatja az ilyen típusú proxyt, kérjük, váltson a verzióra a beállításokban.</string>
|
|
||||||
<string name="ImportProxyFromClipboard">Importálás a vágólapra</string>
|
|
||||||
<string name="BrokenLink">Ismeretlen / megszakadt link</string>
|
|
||||||
<string name="ShareQRCode">QR-kód</string>
|
|
||||||
<string name="ScanQRCode">QR kód beolvasása</string>
|
|
||||||
<string name="NoQrFound">Nem található QR-kód</string>
|
|
||||||
<string name="EnableDeveloperMode">Fejlesztői mód engedélyezése</string>
|
|
||||||
<string name="DisableDeveloperMode">A fejlesztői mód letiltása</string>
|
|
||||||
<string name="DeveloperSettings">Fejlesztői beállítások</string>
|
|
||||||
<string name="LoginSettings">Bejelentkezés beállítások</string>
|
|
||||||
<string name="NekoXFaq">NekoX GYIK</string>
|
|
||||||
<string name="TransSite">Fordítóplatform</string>
|
|
||||||
<string name="NekoTrans">Nekogram fordítása</string>
|
|
||||||
<string name="NekoXTrans">Fordítás NekoX</string>
|
|
||||||
</resources>
|
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
<string name="PrivacyNotice2fa">Terdeteksi bahwa anda belum menetapkan kata sandi, yang dapat menyebabkan peretas yang dimiliki pemerintah menemukan identitas anda yang sebenarnya, harap setel!</string>
|
<string name="PrivacyNotice2fa">Terdeteksi bahwa anda belum menetapkan kata sandi, yang dapat menyebabkan peretas yang dimiliki pemerintah menemukan identitas anda yang sebenarnya, harap setel!</string>
|
||||||
<string name="ApplySuggestion">Oke, Terapkan</string>
|
<string name="ApplySuggestion">Oke, Terapkan</string>
|
||||||
<string name="DoNotRemindAgain">Jangan Ingatkan lagi</string>
|
<string name="DoNotRemindAgain">Jangan Ingatkan lagi</string>
|
||||||
<string name="InstantViewTransWithWeb">Tidak dapat menerjemahkan InstantView menggunakan penerjemah web</string>
|
|
||||||
<string name="RemoveTitleEmoji">Hapus emoji dari judul Nekogram X</string>
|
<string name="RemoveTitleEmoji">Hapus emoji dari judul Nekogram X</string>
|
||||||
<string name="NekoXProxy">NekoX Publik Proxy</string>
|
<string name="NekoXProxy">NekoX Publik Proxy</string>
|
||||||
<string name="PublicPrefix">Publik</string>
|
<string name="PublicPrefix">Publik</string>
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
<string name="PrivacyNotice2fa">パスワードが設定されていないことが検出されました。これにより、政府の管理下にあるハッカーがあなたの本当の身元を見つける可能性があります。パスワードを設定してください。</string>
|
<string name="PrivacyNotice2fa">パスワードが設定されていないことが検出されました。これにより、政府の管理下にあるハッカーがあなたの本当の身元を見つける可能性があります。パスワードを設定してください。</string>
|
||||||
<string name="ApplySuggestion">わかりました。 適用します</string>
|
<string name="ApplySuggestion">わかりました。 適用します</string>
|
||||||
<string name="DoNotRemindAgain">今後表示しない</string>
|
<string name="DoNotRemindAgain">今後表示しない</string>
|
||||||
<string name="InstantViewTransWithWeb">ウェブ翻訳者でInstantViewを翻訳できません</string>
|
|
||||||
<string name="RemoveTitleEmoji">タイトルの絵文字を削除</string>
|
<string name="RemoveTitleEmoji">タイトルの絵文字を削除</string>
|
||||||
<string name="NekoXProxy">NekoXパブリックプロキシ</string>
|
<string name="NekoXProxy">NekoXパブリックプロキシ</string>
|
||||||
<string name="PublicPrefix">パブリック</string>
|
<string name="PublicPrefix">パブリック</string>
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
<string name="PrivacyNotice2fa">비밀번호 설정을 하지 않았습니다. 정부에서 관리하는 해커가 신원을 확인 할 수 있습니다. 비밀번호를 설정하십시오!</string>
|
<string name="PrivacyNotice2fa">비밀번호 설정을 하지 않았습니다. 정부에서 관리하는 해커가 신원을 확인 할 수 있습니다. 비밀번호를 설정하십시오!</string>
|
||||||
<string name="ApplySuggestion">예. 등록합니다.</string>
|
<string name="ApplySuggestion">예. 등록합니다.</string>
|
||||||
<string name="DoNotRemindAgain">다시 표시하지 않기</string>
|
<string name="DoNotRemindAgain">다시 표시하지 않기</string>
|
||||||
<string name="InstantViewTransWithWeb">웹 번역기로 InstantView를 번역 할 수 없습니다</string>
|
|
||||||
<string name="RemoveTitleEmoji">제목에서 이모티콘 제거</string>
|
<string name="RemoveTitleEmoji">제목에서 이모티콘 제거</string>
|
||||||
<string name="NekoXProxy">NekoX 공개 프록시</string>
|
<string name="NekoXProxy">NekoX 공개 프록시</string>
|
||||||
<string name="PublicPrefix">공개</string>
|
<string name="PublicPrefix">공개</string>
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
<string name="PrivacyNotice2fa">Foi detectado que você não definiu uma senha, o que pode fazer com que os hackers controlados pelo governo encontrem sua verdadeira identidade, por favor, defina uma!</string>
|
<string name="PrivacyNotice2fa">Foi detectado que você não definiu uma senha, o que pode fazer com que os hackers controlados pelo governo encontrem sua verdadeira identidade, por favor, defina uma!</string>
|
||||||
<string name="ApplySuggestion">OK, Aplicar</string>
|
<string name="ApplySuggestion">OK, Aplicar</string>
|
||||||
<string name="DoNotRemindAgain">Não lembre novamente</string>
|
<string name="DoNotRemindAgain">Não lembre novamente</string>
|
||||||
<string name="InstantViewTransWithWeb">Não é possível traduzir InstantView com o tradutor web</string>
|
|
||||||
<string name="RemoveTitleEmoji">Remover emoji no título</string>
|
<string name="RemoveTitleEmoji">Remover emoji no título</string>
|
||||||
<string name="NekoXProxy">Proxy Público do NekoX</string>
|
<string name="NekoXProxy">Proxy Público do NekoX</string>
|
||||||
<string name="PublicPrefix">Público</string>
|
<string name="PublicPrefix">Público</string>
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
<string name="PrivacyNotice2fa">Для повышения конфиденциальности рекомендуем включить двухфакторную аутентификацию.</string>
|
<string name="PrivacyNotice2fa">Для повышения конфиденциальности рекомендуем включить двухфакторную аутентификацию.</string>
|
||||||
<string name="ApplySuggestion">Ок, сделаем это!</string>
|
<string name="ApplySuggestion">Ок, сделаем это!</string>
|
||||||
<string name="DoNotRemindAgain">Больше не напоминать</string>
|
<string name="DoNotRemindAgain">Больше не напоминать</string>
|
||||||
<string name="InstantViewTransWithWeb">Невозможно перевести InstantView с веб-переводчиком</string>
|
|
||||||
<string name="RemoveTitleEmoji">Убрать эмодзи из шапки</string>
|
<string name="RemoveTitleEmoji">Убрать эмодзи из шапки</string>
|
||||||
<string name="NekoXProxy">Список прокси от NekoX</string>
|
<string name="NekoXProxy">Список прокси от NekoX</string>
|
||||||
<string name="PublicPrefix">Из списка</string>
|
<string name="PublicPrefix">Из списка</string>
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
<string name="PrivacyNotice2fa">Devlet kontrolündeki bilgisayar korsanlarının gerçek kimliğinizi bulmasına neden olabilecek bir şifre ayarlamadığınız tespit edildi, lütfen bir tane belirleyin!</string>
|
<string name="PrivacyNotice2fa">Devlet kontrolündeki bilgisayar korsanlarının gerçek kimliğinizi bulmasına neden olabilecek bir şifre ayarlamadığınız tespit edildi, lütfen bir tane belirleyin!</string>
|
||||||
<string name="ApplySuggestion">Tamam, uygula</string>
|
<string name="ApplySuggestion">Tamam, uygula</string>
|
||||||
<string name="DoNotRemindAgain">Bir daha hatırlatma</string>
|
<string name="DoNotRemindAgain">Bir daha hatırlatma</string>
|
||||||
<string name="InstantViewTransWithWeb">InstantView web çevirmeni ile çevrilemiyor</string>
|
|
||||||
<string name="RemoveTitleEmoji">Başlıktaki emojiyi (😶) kaldırın</string>
|
<string name="RemoveTitleEmoji">Başlıktaki emojiyi (😶) kaldırın</string>
|
||||||
<string name="NekoXProxy">NekoX Genel Proxy</string>
|
<string name="NekoXProxy">NekoX Genel Proxy</string>
|
||||||
<string name="PublicPrefix">Genel</string>
|
<string name="PublicPrefix">Genel</string>
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
<string name="PrivacyNotice2fa">Виявлено, що ви не встановили пароль, через що хакери під контролем уряду можуть знайти справжню особу, будь ласка, встановіть його!</string>
|
<string name="PrivacyNotice2fa">Виявлено, що ви не встановили пароль, через що хакери під контролем уряду можуть знайти справжню особу, будь ласка, встановіть його!</string>
|
||||||
<string name="ApplySuggestion">Добре, застосувати</string>
|
<string name="ApplySuggestion">Добре, застосувати</string>
|
||||||
<string name="DoNotRemindAgain">Не нагадувати більше</string>
|
<string name="DoNotRemindAgain">Не нагадувати більше</string>
|
||||||
<string name="InstantViewTransWithWeb">Неможливо перекласти InstantView з web translator</string>
|
|
||||||
<string name="RemoveTitleEmoji">Видаляти смайли в назві</string>
|
<string name="RemoveTitleEmoji">Видаляти смайли в назві</string>
|
||||||
<string name="NekoXProxy">Публічний проксі NekoX</string>
|
<string name="NekoXProxy">Публічний проксі NekoX</string>
|
||||||
<string name="PublicPrefix">Загальнодоступна</string>
|
<string name="PublicPrefix">Загальнодоступна</string>
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
<string name="Install">安装</string>
|
<string name="Install">安装</string>
|
||||||
<string name="Ignore">忽略</string>
|
<string name="Ignore">忽略</string>
|
||||||
<string name="UpdateDownloaded">一个更新刚刚下载完成.</string>
|
<string name="UpdateDownloaded">一个更新刚刚下载完成.</string>
|
||||||
|
<string name="ProxyAutoSwitch">代理自动切换</string>
|
||||||
<string name="LinkedGroupChat">链接的群组</string>
|
<string name="LinkedGroupChat">链接的群组</string>
|
||||||
<string name="LinkedChannelChat">链接的频道</string>
|
<string name="LinkedChannelChat">链接的频道</string>
|
||||||
<string name="DevModeTitle">**您的电报账号可能被封禁**</string>
|
<string name="DevModeTitle">**您的电报账号可能被封禁**</string>
|
||||||
|
@ -51,7 +52,6 @@
|
||||||
<string name="PrivacyNotice2fa">检测到您没有设置密码,这可能会导致政府控制的黑客找到您的真实身份,请设置一个!</string>
|
<string name="PrivacyNotice2fa">检测到您没有设置密码,这可能会导致政府控制的黑客找到您的真实身份,请设置一个!</string>
|
||||||
<string name="ApplySuggestion">应用</string>
|
<string name="ApplySuggestion">应用</string>
|
||||||
<string name="DoNotRemindAgain">不再提醒</string>
|
<string name="DoNotRemindAgain">不再提醒</string>
|
||||||
<string name="InstantViewTransWithWeb">无法使用网页翻译器翻译 InstantView</string>
|
|
||||||
<string name="RemoveTitleEmoji">移除标题中的表情</string>
|
<string name="RemoveTitleEmoji">移除标题中的表情</string>
|
||||||
<string name="NekoXProxy">NekoX 公共代理</string>
|
<string name="NekoXProxy">NekoX 公共代理</string>
|
||||||
<string name="PublicPrefix">公共</string>
|
<string name="PublicPrefix">公共</string>
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
<string name="PrivacyNotice2fa">檢測到您尚未設置密碼,這可能導致政府控制的黑客找到您的真實身份,請設置一個!</string>
|
<string name="PrivacyNotice2fa">檢測到您尚未設置密碼,這可能導致政府控制的黑客找到您的真實身份,請設置一個!</string>
|
||||||
<string name="ApplySuggestion">應用</string>
|
<string name="ApplySuggestion">應用</string>
|
||||||
<string name="DoNotRemindAgain">不再提醒</string>
|
<string name="DoNotRemindAgain">不再提醒</string>
|
||||||
<string name="InstantViewTransWithWeb">無法使用網絡翻譯器翻譯InstantView</string>
|
|
||||||
<string name="RemoveTitleEmoji">移除標題中的表情</string>
|
<string name="RemoveTitleEmoji">移除標題中的表情</string>
|
||||||
<string name="NekoXProxy">NekoX 公共代理</string>
|
<string name="NekoXProxy">NekoX 公共代理</string>
|
||||||
<string name="PublicPrefix">公共</string>
|
<string name="PublicPrefix">公共</string>
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
<string name="PrivacyNotice2fa">檢測到您尚未設置密碼,這可能導致政府控制的黑客找到您的真實身份,請設置一個!</string>
|
<string name="PrivacyNotice2fa">檢測到您尚未設置密碼,這可能導致政府控制的黑客找到您的真實身份,請設置一個!</string>
|
||||||
<string name="ApplySuggestion">套用</string>
|
<string name="ApplySuggestion">套用</string>
|
||||||
<string name="DoNotRemindAgain">不再提醒</string>
|
<string name="DoNotRemindAgain">不再提醒</string>
|
||||||
<string name="InstantViewTransWithWeb">無法使用網絡翻譯器翻譯InstantView</string>
|
|
||||||
<string name="RemoveTitleEmoji">移除標題中的表情</string>
|
<string name="RemoveTitleEmoji">移除標題中的表情</string>
|
||||||
<string name="NekoXProxy">NekoX 公共代理</string>
|
<string name="NekoXProxy">NekoX 公共代理</string>
|
||||||
<string name="PublicPrefix">公共</string>
|
<string name="PublicPrefix">公共</string>
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
<string name="Install">Install</string>
|
<string name="Install">Install</string>
|
||||||
<string name="Ignore">Ignore</string>
|
<string name="Ignore">Ignore</string>
|
||||||
<string name="UpdateDownloaded">An update has just been downloaded.</string>
|
<string name="UpdateDownloaded">An update has just been downloaded.</string>
|
||||||
|
<string name="ProxyAutoSwitch">Proxy Auto Switch</string>
|
||||||
|
|
||||||
<string name="LinkedGroupChat">Linked Group</string>
|
<string name="LinkedGroupChat">Linked Group</string>
|
||||||
<string name="LinkedChannelChat">Linked Channel</string>
|
<string name="LinkedChannelChat">Linked Channel</string>
|
||||||
|
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,5 +1,5 @@
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|
Loading…
Reference in New Issue
Block a user