Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c7b242789d | ||
|
|
1c53181c9c | ||
|
|
bcbd860457 | ||
|
|
33d8139f57 | ||
|
|
5a8493e0b1 | ||
|
|
3c3e531718 | ||
|
|
1f6d6bbd14 | ||
|
|
c25433e2da | ||
|
|
0b68faf672 | ||
|
|
7978bcedbf | ||
|
|
eb3b01053e | ||
|
|
17bedaffcd | ||
|
|
49fbfcc2ac | ||
|
|
c2930bfe04 | ||
|
|
e7cc5ad0ba | ||
|
|
f81b16ead6 | ||
|
|
162fcb47bc | ||
|
|
67fab0392f | ||
|
|
bf89e202d1 | ||
|
|
050cc7a018 | ||
|
|
7e92e1ac0d | ||
|
|
1758f360c0 | ||
|
|
e32ac67794 | ||
|
|
5434193903 | ||
|
|
2efb6fb4c6 | ||
|
|
5d744066ac | ||
|
|
b897e4d044 | ||
|
|
5206b4c1f1 | ||
|
|
694be8abbe | ||
|
|
0a2d374de2 | ||
|
|
9dec28a022 | ||
|
|
5a6e45a2a7 | ||
|
|
6d536a901b | ||
|
|
57be4055d3 | ||
|
|
2d9102719e | ||
|
|
5e9f78d31a |
@@ -25,6 +25,7 @@ _Put an `x` inside the [ ] that applies._
|
||||
* [ ] Bypass LAN & China
|
||||
* [ ] GFW List
|
||||
* [ ] China List
|
||||
* [ ] Custom rules
|
||||
* [ ] IPv6 route
|
||||
* [ ] Per-App Proxy
|
||||
* [ ] Bypass mode
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
Copyright (C) 2016 by Max Lv <max.c.lv@gmail.com>
|
||||
Copyright (C) 2016 by Mygod Studio <contact-shadowsocks-android@mygod.be>
|
||||
Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com>
|
||||
Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -34,6 +34,14 @@ A [shadowsocks](http://shadowsocks.org) client for Android, written in Scala.
|
||||
sbt native-build clean android:package-release
|
||||
```
|
||||
|
||||
### TRANSLATE
|
||||
|
||||
Translators can go to [POEditor](https://poeditor.com/join/project/u5VHO9vhSf) to help translate shadowsocks-android. Guidelines:
|
||||
|
||||
* It's okay to leave some strings untranslated if you think it should use the same string as English (US).
|
||||
* `faq_url` should not be changed. If you'd like to translate FAQ, submit a pull request with the translated [`faq.md`](https://github.com/shadowsocks/shadowsocks-android/blob/master/.github/faq.md) (it should be named properly, e.g. `.github/faq.zh-CN.md`). Administrators will take care of the rest.
|
||||
* Do not add/edit/remove comments.
|
||||
|
||||
## OPEN SOURCE LICENSES
|
||||
|
||||
<ul>
|
||||
@@ -52,8 +60,8 @@ A [shadowsocks](http://shadowsocks.org) client for Android, written in Scala.
|
||||
|
||||
### LICENSE
|
||||
|
||||
Copyright (C) 2016 by Max Lv <<max.c.lv@gmail.com>>
|
||||
Copyright (C) 2016 by Mygod Studio <<contact-shadowsocks-android@mygod.be>>
|
||||
Copyright (C) 2017 by Max Lv <<max.c.lv@gmail.com>>
|
||||
Copyright (C) 2017 by Mygod Studio <<contact-shadowsocks-android@mygod.be>>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -5,16 +5,14 @@ enablePlugins(AndroidApp)
|
||||
android.useSupportVectors
|
||||
|
||||
name := "shadowsocks"
|
||||
version := "3.4.1"
|
||||
versionCode := Some(173)
|
||||
version := "3.4.2"
|
||||
versionCode := Some(174)
|
||||
|
||||
platformTarget := "android-25"
|
||||
|
||||
compileOrder := CompileOrder.JavaThenScala
|
||||
javacOptions ++= "-source" :: "1.7" :: "-target" :: "1.7" :: Nil
|
||||
scalacOptions ++= "-target:jvm-1.7" :: "-Xexperimental" :: Nil
|
||||
ndkJavah := Seq()
|
||||
ndkBuild := Seq()
|
||||
|
||||
proguardVersion := "5.3.2"
|
||||
proguardCache := Seq()
|
||||
@@ -30,19 +28,21 @@ shrinkResources := true
|
||||
typedResources := false
|
||||
resConfigs := Seq("ja", "ru", "zh-rCN", "zh-rTW")
|
||||
|
||||
val supportLibsVersion = "25.1.0"
|
||||
val playServicesVersion = "10.0.1"
|
||||
resolvers += Resolver.jcenterRepo
|
||||
libraryDependencies ++=
|
||||
"com.android.support" % "cardview-v7" % "25.1.0" ::
|
||||
"com.android.support" % "customtabs" % "25.1.0" ::
|
||||
"com.android.support" % "design" % "25.1.0" ::
|
||||
"com.android.support" % "gridlayout-v7" % "25.1.0" ::
|
||||
"com.android.support" % "preference-v14" % "25.1.0" ::
|
||||
"com.android.support" % "cardview-v7" % supportLibsVersion ::
|
||||
"com.android.support" % "customtabs" % supportLibsVersion ::
|
||||
"com.android.support" % "design" % supportLibsVersion ::
|
||||
"com.android.support" % "gridlayout-v7" % supportLibsVersion ::
|
||||
"com.android.support" % "preference-v14" % supportLibsVersion ::
|
||||
"com.futuremind.recyclerfastscroll" % "fastscroll" % "0.2.5" ::
|
||||
"com.evernote" % "android-job" % "1.1.4" ::
|
||||
"com.github.jorgecastilloprz" % "fabprogresscircle" % "1.01" ::
|
||||
"com.google.android.gms" % "play-services-ads" % "10.0.1" ::
|
||||
"com.google.android.gms" % "play-services-analytics" % "10.0.1" ::
|
||||
"com.google.android.gms" % "play-services-gcm" % "10.0.1" ::
|
||||
"com.google.android.gms" % "play-services-ads" % playServicesVersion ::
|
||||
"com.google.android.gms" % "play-services-analytics" % playServicesVersion ::
|
||||
"com.google.android.gms" % "play-services-gcm" % playServicesVersion ::
|
||||
"com.j256.ormlite" % "ormlite-android" % "5.0" ::
|
||||
"com.mikepenz" % "crossfader" % "1.5.0" ::
|
||||
"com.mikepenz" % "fastadapter" % "2.1.5" ::
|
||||
|
||||
@@ -4,22 +4,10 @@ function try () {
|
||||
"$@" || exit -1
|
||||
}
|
||||
|
||||
# Build native binaries
|
||||
pushd src/main
|
||||
try $ANDROID_NDK_HOME/ndk-build -j8
|
||||
|
||||
rm -rf assets/armeabi-v7a
|
||||
rm -rf assets/x86
|
||||
mkdir -p assets/armeabi-v7a
|
||||
mkdir -p assets/x86
|
||||
|
||||
#copy executables
|
||||
for app in pdnsd redsocks ss-local ss-tunnel tun2socks
|
||||
do
|
||||
echo $app
|
||||
try mv libs/armeabi-v7a/$app assets/armeabi-v7a/
|
||||
try mv libs/x86/$app assets/x86/
|
||||
done
|
||||
# Clean up old binaries (no longer used)
|
||||
rm -rf assets/armeabi-v7a assets/x86 libs/armeabi-v7a libs/x86
|
||||
mkdir -p libs/armeabi-v7a libs/x86
|
||||
popd
|
||||
|
||||
# Build kcptun
|
||||
|
||||
+2
-2
@@ -58,12 +58,12 @@ go get
|
||||
echo "Cross compile kcptun for arm"
|
||||
try env CGO_ENABLED=1 CC=$ANDROID_ARM_CC GOOS=android GOARCH=arm GOARM=7 go build -ldflags="-s -w"
|
||||
try $ANDROID_ARM_STRIP client
|
||||
try mv client $DIR/../src/main/assets/armeabi-v7a/kcptun
|
||||
try mv client $DIR/../src/main/libs/armeabi-v7a/libkcptun.so
|
||||
|
||||
echo "Cross compile kcptun for x86"
|
||||
try env CGO_ENABLED=1 CC=$ANDROID_X86_CC GOOS=android GOARCH=386 go build -ldflags="-s -w"
|
||||
try $ANDROID_X86_STRIP client
|
||||
try mv client $DIR/../src/main/assets/x86/kcptun
|
||||
try mv client $DIR/../src/main/libs/x86/libkcptun.so
|
||||
popd
|
||||
|
||||
echo "Successfully build kcptun"
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:extractNativeLibs="false"
|
||||
android:name=".ShadowsocksApplication"
|
||||
android:hardwareAccelerated="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
|
||||
@@ -44,7 +44,6 @@ public class System {
|
||||
}
|
||||
|
||||
public static native int exec(String cmd);
|
||||
public static native String getABI();
|
||||
public static native int sendfd(int fd, String path);
|
||||
public static native void jniclose(int fd);
|
||||
}
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
ROOT_PATH := $(LOCAL_PATH)
|
||||
|
||||
BUILD_SHARED_EXECUTABLE := $(LOCAL_PATH)/build-shared-executable.mk
|
||||
|
||||
########################################################
|
||||
## libsodium
|
||||
########################################################
|
||||
@@ -358,7 +360,7 @@ LOCAL_CFLAGS := -O2 -std=gnu99 -DUSE_IPTABLES \
|
||||
-I$(LOCAL_PATH)/libevent/include \
|
||||
-I$(LOCAL_PATH)/libevent
|
||||
|
||||
include $(BUILD_EXECUTABLE)
|
||||
include $(BUILD_SHARED_EXECUTABLE)
|
||||
|
||||
########################################################
|
||||
## pdnsd
|
||||
@@ -375,7 +377,7 @@ LOCAL_CFLAGS := -DANDROID -Wall -O2 -I$(LOCAL_PATH)/pdnsd \
|
||||
LOCAL_STATIC_LIBRARIES := libancillary
|
||||
LOCAL_LDLIBS := -llog
|
||||
|
||||
include $(BUILD_EXECUTABLE)
|
||||
include $(BUILD_SHARED_EXECUTABLE)
|
||||
|
||||
########################################################
|
||||
## shadowsocks-libev local
|
||||
@@ -410,7 +412,7 @@ LOCAL_STATIC_LIBRARIES := libev libmbedtls libipset libcork libudns \
|
||||
|
||||
LOCAL_LDLIBS := -llog
|
||||
|
||||
include $(BUILD_EXECUTABLE)
|
||||
include $(BUILD_SHARED_EXECUTABLE)
|
||||
|
||||
########################################################
|
||||
## shadowsocks-libev tunnel
|
||||
@@ -439,7 +441,7 @@ LOCAL_STATIC_LIBRARIES := libev libmbedtls libsodium libcork libudns libancillar
|
||||
|
||||
LOCAL_LDLIBS := -llog
|
||||
|
||||
include $(BUILD_EXECUTABLE)
|
||||
include $(BUILD_SHARED_EXECUTABLE)
|
||||
|
||||
########################################################
|
||||
## system
|
||||
@@ -550,7 +552,7 @@ LOCAL_LDLIBS := -ldl -llog
|
||||
|
||||
LOCAL_SRC_FILES := $(addprefix badvpn/, $(TUN2SOCKS_SOURCES))
|
||||
|
||||
include $(BUILD_EXECUTABLE)
|
||||
include $(BUILD_SHARED_EXECUTABLE)
|
||||
|
||||
########################################################
|
||||
## mbed TLS
|
||||
@@ -574,7 +576,7 @@ include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE := pcre
|
||||
LOCAL_MODULE := pcre
|
||||
|
||||
LOCAL_CFLAGS += -DHAVE_CONFIG_H
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
# Copyright (C) 2009 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# this file is included from Android.mk files to build a target-specific
|
||||
# executable program
|
||||
#
|
||||
# Modified by @Mygod, based on:
|
||||
# https://android.googlesource.com/platform/ndk/+/f2e98f8c066aed59caf61163d4b87c2b858f9814/build/core/build-shared-library.mk
|
||||
# https://android.googlesource.com/platform/ndk/+/f2e98f8c066aed59caf61163d4b87c2b858f9814/build/core/build-executable.mk
|
||||
LOCAL_BUILD_SCRIPT := BUILD_EXECUTABLE
|
||||
LOCAL_MAKEFILE := $(local-makefile)
|
||||
$(call check-defined-LOCAL_MODULE,$(LOCAL_BUILD_SCRIPT))
|
||||
$(call check-LOCAL_MODULE,$(LOCAL_MAKEFILE))
|
||||
$(call check-LOCAL_MODULE_FILENAME)
|
||||
# we are building target objects
|
||||
my := TARGET_
|
||||
$(call handle-module-filename,lib,$(TARGET_SONAME_EXTENSION))
|
||||
$(call handle-module-built)
|
||||
LOCAL_MODULE_CLASS := EXECUTABLE
|
||||
include $(BUILD_SYSTEM)/build-module.mk
|
||||
+1
-23
@@ -6,7 +6,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <cpu-features.h>
|
||||
|
||||
#include <sys/un.h>
|
||||
#include <sys/stat.h>
|
||||
@@ -18,25 +17,6 @@
|
||||
#define LOGW(...) do { __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__); } while(0)
|
||||
#define LOGE(...) do { __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__); } while(0)
|
||||
|
||||
jstring Java_com_github_shadowsocks_system_getabi(JNIEnv *env, jobject thiz) {
|
||||
AndroidCpuFamily family = android_getCpuFamily();
|
||||
uint64_t features = android_getCpuFeatures();
|
||||
const char *abi;
|
||||
|
||||
if (family == ANDROID_CPU_FAMILY_X86) {
|
||||
abi = "x86";
|
||||
} else if (family == ANDROID_CPU_FAMILY_MIPS) {
|
||||
abi = "mips";
|
||||
} else if (family == ANDROID_CPU_FAMILY_ARM) {
|
||||
// if (features & ANDROID_CPU_ARM_FEATURE_ARMv7) {
|
||||
abi = "armeabi-v7a";
|
||||
// } else {
|
||||
// abi = "armeabi";
|
||||
// }
|
||||
}
|
||||
return env->NewStringUTF(abi);
|
||||
}
|
||||
|
||||
jint Java_com_github_shadowsocks_system_exec(JNIEnv *env, jobject thiz, jstring cmd) {
|
||||
const char *cmd_str = env->GetStringUTFChars(cmd, 0);
|
||||
|
||||
@@ -103,9 +83,7 @@ static JNINativeMethod method_table[] = {
|
||||
{ "sendfd", "(ILjava/lang/String;)I",
|
||||
(void*) Java_com_github_shadowsocks_system_sendfd },
|
||||
{ "exec", "(Ljava/lang/String;)I",
|
||||
(void*) Java_com_github_shadowsocks_system_exec },
|
||||
{ "getABI", "()Ljava/lang/String;",
|
||||
(void*) Java_com_github_shadowsocks_system_getabi }
|
||||
(void*) Java_com_github_shadowsocks_system_exec }
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="48"
|
||||
android:viewportHeight="48">
|
||||
|
||||
<path
|
||||
android:fillColor="#f5f5f5"
|
||||
android:pathData="M24,24m-22,0a22,22 0,1 1,44 0a22,22 0,1 1,-44 0Z" />
|
||||
<path
|
||||
android:fillColor="#546e7a"
|
||||
android:pathData="M24,21.8 C25.7673,21.8,27.2,23.2327,27.2,25 C27.2,26.7673,25.7673,28.2,24,28.2
|
||||
C22.2327,28.2,20.8,26.7673,20.8,25 C20.8,23.2327,22.2327,21.8,24,21.8 Z" />
|
||||
<path
|
||||
android:fillColor="#546e7a"
|
||||
android:pathData="M21,15 L19.17,17 L16,17 A2,2,0,0,0,14,19 L14,31 A2,2,0,0,0,16,33 L32,33
|
||||
A2,2,0,0,0,34,31 L34,19 A2,2,0,0,0,32,17 L28.83,17 L27,15 Z M24,30
|
||||
A5,5,0,1,1,29,25 A5,5,0,0,1,24,30 Z" />
|
||||
</vector>
|
||||
@@ -10,5 +10,6 @@
|
||||
<EditText android:id="@+id/content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textNoSuggestions"
|
||||
android:lines="1"/>
|
||||
</LinearLayout>
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="proxied_apps_summary">選択したアプリにプロキシを設定する</string>
|
||||
</resources>
|
||||
+116
-120
@@ -1,130 +1,126 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">シャドーソックス</string>
|
||||
<string name="quick_toggle">スイッチ</string>
|
||||
<string name="app_name">"シャドーソックス"</string>
|
||||
<string name="quick_toggle">"スイッチ"</string>
|
||||
|
||||
<string name="misc_cat">その他</string>
|
||||
<string name="proxy_cat">サーバー設定</string>
|
||||
<string name="profile_name">サーバー名</string>
|
||||
<string name="profile">プロファイル</string>
|
||||
<string name="profile_summary">新規作成または既存ファイルを開く</string>
|
||||
<string name="proxy">サーバーアドレス</string>
|
||||
<string name="remote_port">リモートポート</string>
|
||||
<string name="port">ローカルポート</string>
|
||||
<string name="sitekey">パスワード</string>
|
||||
<string name="enc_method">暗号化方式</string>
|
||||
<string name="feature_cat">ファンクション設定</string>
|
||||
<string name="http_proxy">HTTP プロキシサーバー</string>
|
||||
<string name="http_proxy_summary">ローカル HTTP プロキシ</string>
|
||||
<string name="dns_proxy">DNS プロキシ</string>
|
||||
<string name="dns_proxy_summary">DNS解析をリモートサーバーにリダイレクト</string>
|
||||
<string name="auto_set_gfwlist">CHN Route</string>
|
||||
<string name="auto_set_gfwlist_summary">中国本土のサイトをすべて迂回する</string>
|
||||
<string name="route_list">プロキシ方式</string>
|
||||
<string name="proxied_apps">アプリ別のプロキシを使用</string>
|
||||
<string name="proxied_apps_summary">アプリ別でプロキシを指定、Android 4.x では必ずNATモードを使用して下さい</string>
|
||||
<string name="on">ON</string>
|
||||
<string name="bypass_apps">バイパスモード(迂回モード)</string>
|
||||
<string name="bypass_apps_summary">このモードを選択した場合、指定したアプリのパケットはプロキシを経由しない</string>
|
||||
<string name="auto_connect">自動接続</string>
|
||||
<string name="auto_connect_summary">システム起動時にバックグラウンドで本サービスを開始</string>
|
||||
<string name="tcp_fastopen_summary">使用するにはROOT権限が必要</string>
|
||||
<string name="tcp_fastopen_summary_unsupported">ご利用のカーネルバージョンはサポートしておりません:%s < 3.7.1</string>
|
||||
<string name="forward_success">バックグラウンドでサービスを開始しました</string>
|
||||
<string name="service_failed">リモートサーバーに接続できません</string>
|
||||
<string name="invalid_server">サーバーが無効です</string>
|
||||
<string name="method_unsafe">注意:現在の暗号化方式は安全ではありません</string>
|
||||
<string name="nat_deprecated">注意:Android 5.0及びそれ以降のバージョンではNATモードの使用はお勧めしません</string>
|
||||
<string name="nat_no_root">NATモードはROOT権限が必要です</string>
|
||||
<string name="switch_to_vpn">VPNモードに切り替える</string>
|
||||
<string name="stop">中止</string>
|
||||
<string name="stopping">停止中……</string>
|
||||
<string name="vpn_error">バックグランドサービスの起動に失敗しました:%s</string>
|
||||
<string name="reboot_required">VPNサービスの起動に失敗しました、デバイスの再起動を試みて下さい</string>
|
||||
<string name="close">閉じる</string>
|
||||
<string name="proxy_empty">サーバアドレスやパスワードの入力が必要です</string>
|
||||
<string name="connect">接続</string>
|
||||
<string name="initializing">初期化中……</string>
|
||||
<string name="recovering">リセット中……</string>
|
||||
<string name="loading">読み込み中……</string>
|
||||
<string name="profiles">プロファイル</string>
|
||||
<string name="settings">オプション設定</string>
|
||||
<string name="remove_profile">このプロファイルを削除「%s」?</string>
|
||||
<string name="recovery">リセット</string>
|
||||
<string name="about">本アプリについて</string>
|
||||
<string name="about_title">シャドーソックス(shadowsocks)%s</string>
|
||||
<string name="flush_dnscache">DNS キャッシュをリフレッシュ</string>
|
||||
<string name="flush_dnscache_summary">NATモードの場合のみ使用、ROOT権限が必要です</string>
|
||||
<string name="flush_dnscache_no_root">ROOT権限がない場合はDNSキャッシュをリフレッシュできません</string>
|
||||
<string name="flushing">リフレッシュ中……</string>
|
||||
<string name="share">共有</string>
|
||||
<string name="add_profile">プロファイルを追加</string>
|
||||
<!-- global/misc category -->
|
||||
<string name="misc_cat">"その他"</string>
|
||||
<string name="profile">"プロファイル"</string>
|
||||
<string name="profile_summary">"新規作成または既存ファイルを開く"</string>
|
||||
<string name="nat">"NAT モード (デバックのみ)"</string>
|
||||
<string name="nat_summary">"VPNモードからNATモードに切り替えるにはROOT権限が必要です"</string>
|
||||
<string name="remote_dns">"リモートDNS"</string>
|
||||
<string name="stat_summary">"送信済み: \t%3$s\t↑\t%1$s/s
|
||||
受信済み: \t%4$s\t↓\t%2$s/s"</string>
|
||||
<string name="connection_test_pending">"接続状況確認"</string>
|
||||
<string name="connection_test_testing">"テスト中…"</string>
|
||||
<string name="connection_test_available">"成功: %dmsの遅延"</string>
|
||||
<string name="connection_test_error">"失敗しました:%s"</string>
|
||||
<string name="connection_test_fail">"インターネット利用不可"</string>
|
||||
<string name="connection_test_error_status_code">"ステータスコード無効(#%d)"</string>
|
||||
|
||||
<string name="nat">NAT モード (デバックのみ)</string>
|
||||
<string name="nat_summary">VPNモードからNATモードに切り替えるにはROOT権限が必要です</string>
|
||||
<string name="remote_dns">リモートDNS</string>
|
||||
<!-- proxy category -->
|
||||
<string name="proxy_cat">"サーバー設定"</string>
|
||||
<string name="profile_name">"サーバー名"</string>
|
||||
<string name="proxy">"サーバーアドレス"</string>
|
||||
<string name="remote_port">"リモートポート"</string>
|
||||
<string name="port">"ローカルポート"</string>
|
||||
<string name="sitekey">"パスワード"</string>
|
||||
<string name="enc_method">"暗号化方式"</string>
|
||||
|
||||
<string name="udp_dns">UDP転送</string>
|
||||
<string name="udp_dns_summary">UDPプロトコルでリモードサーバーにパケットを転送</string>
|
||||
<!-- feature category -->
|
||||
<string name="feature_cat">"ファンクション設定"</string>
|
||||
<string name="ipv6">"IPv6プロキシ"</string>
|
||||
<string name="ipv6_summary">"リモートサーバーにIPv6パケットを転送"</string>
|
||||
<string name="onetime_auth">"ワンタイム認証"</string>
|
||||
<string name="onetime_auth_summary">"ワンタイム認証を使用する"</string>
|
||||
<string name="http_proxy">"HTTP プロキシサーバー"</string>
|
||||
<string name="http_proxy_summary">"ローカル HTTP プロキシ"</string>
|
||||
<string name="dns_proxy">"DNS プロキシ"</string>
|
||||
<string name="dns_proxy_summary">"DNS解析をリモートサーバーにリダイレクト"</string>
|
||||
<string name="auto_set_gfwlist">"CHN Route"</string>
|
||||
<string name="auto_set_gfwlist_summary">"中国本土のサイトをすべて迂回する"</string>
|
||||
<string name="route_list">"プロキシ方式"</string>
|
||||
<string name="route_entry_gfwlist">"中国本土からアクセス不可なアドレス以外を迂回する"</string>
|
||||
<string name="proxied_apps">"アプリ別のプロキシを使用"</string>
|
||||
<string name="proxied_apps_summary">"アプリ別でプロキシを指定、Android 4.x では必ずNATモードを使用して下さい"</string>
|
||||
<string name="on">"ON"</string>
|
||||
<string name="bypass_apps">"バイパスモード(迂回モード)"</string>
|
||||
<string name="bypass_apps_summary">"このモードを選択した場合、指定したアプリのパケットはプロキシを経由しない"</string>
|
||||
<string name="auto_connect">"自動接続"</string>
|
||||
<string name="auto_connect_summary">"システム起動時にバックグラウンドで本サービスを開始"</string>
|
||||
<string name="tcp_fastopen_summary">"使用するにはROOT権限が必要"</string>
|
||||
<string name="tcp_fastopen_summary_unsupported">"ご利用のカーネルバージョンはサポートしておりません:%s < 3.7.1"</string>
|
||||
<string name="udp_dns">"UDP転送"</string>
|
||||
<string name="udp_dns_summary">"UDPプロトコルでリモードサーバーにパケットを転送"</string>
|
||||
|
||||
<string name="onetime_auth">ワンタイム認証</string>
|
||||
<string name="onetime_auth_summary">ワンタイム認証を使用する</string>
|
||||
<!-- notification category -->
|
||||
<string name="forward_success">"バックグラウンドでサービスを開始しました"</string>
|
||||
<string name="invalid_server">"サーバーが無効です"</string>
|
||||
<string name="service_failed">"リモートサーバーに接続できません"</string>
|
||||
<string name="method_unsafe">"注意:現在の暗号化方式は安全ではありません"</string>
|
||||
<string name="nat_deprecated">"注意:Android 5.0及びそれ以降のバージョンではNATモードの使用はお勧めしません"</string>
|
||||
<string name="nat_no_root">"NATモードはROOT権限が必要です"</string>
|
||||
<string name="switch_to_vpn">"VPNモードに切り替える"</string>
|
||||
<string name="stop">"中止"</string>
|
||||
<string name="stopping">"停止中……"</string>
|
||||
<string name="vpn_error">"バックグランドサービスの起動に失敗しました:%s"</string>
|
||||
<string name="reboot_required">"VPNサービスの起動に失敗しました、デバイスの再起動を試みて下さい"</string>
|
||||
<string name="close">"閉じる"</string>
|
||||
<string name="proxy_empty">"サーバアドレスやパスワードの入力が必要です"</string>
|
||||
<string name="connect">"接続"</string>
|
||||
<string name="initializing">"初期化中……"</string>
|
||||
<string name="recovering">"リセット中……"</string>
|
||||
<string name="loading">"読み込み中……"</string>
|
||||
<string name="remove_profile">"このプロファイルを削除「%s」?"</string>
|
||||
|
||||
<string name="ipv6">IPv6プロキシ</string>
|
||||
<string name="ipv6_summary">リモートサーバーにIPv6パケットを転送</string>
|
||||
<!-- menu category -->
|
||||
<string name="profiles">"プロファイル"</string>
|
||||
<string name="settings">"オプション設定"</string>
|
||||
<string name="recovery">"リセット"</string>
|
||||
<string name="about">"本アプリについて"</string>
|
||||
<string name="about_title">"シャドーソックス(shadowsocks)%s"</string>
|
||||
<string name="share">"共有"</string>
|
||||
<string name="flush_dnscache">"DNS キャッシュをリフレッシュ"</string>
|
||||
<string name="flush_dnscache_summary">"NATモードの場合のみ使用、ROOT権限が必要です"</string>
|
||||
<string name="flush_dnscache_no_root">"ROOT権限がない場合はDNSキャッシュをリフレッシュできません"</string>
|
||||
<string name="flushing">"リフレッシュ中……"</string>
|
||||
<string name="add_profile">"プロファイルを追加"</string>
|
||||
<string name="action_apply_all">"設定をすべてのプロファイルに適応する"</string>
|
||||
<string name="action_export">"クリップボードに出力"</string>
|
||||
<string name="action_import">"クリップボードからインポート"</string>
|
||||
<string name="action_export_msg">"クリップボードの出力に成功しました"</string>
|
||||
<string name="action_export_err">"クリップボードの出力に失敗しました"</string>
|
||||
<string name="action_import_msg">"インポートは成功しました"</string>
|
||||
<string name="action_import_err">"インポートは失敗しました"</string>
|
||||
<string name="add_profile_dialog">"シャドーソックスにプロファイルを追加しますか"</string>
|
||||
<string name="add_profile_methods_scan_qr_code">"QRコードを読み取る"</string>
|
||||
<string name="add_profile_methods_manual_settings">"手動でセットアップ"</string>
|
||||
<plurals name="removed">
|
||||
<item quantity="other">"削除済み"</item>
|
||||
</plurals>
|
||||
<string name="undo">"戻る"</string>
|
||||
|
||||
<string name="stat_summary">送信済み: \t%3$s\t↑\t%1$s/s\n受信済み: \t%4$s\t↓\t%2$s/s</string>
|
||||
<!-- tasker -->
|
||||
<string name="toggle_service_state">"サービスを開始"</string>
|
||||
<string name="start_service_default">"現在のサーバーに接続する"</string>
|
||||
<string name="start_service">"%s に接続"</string>
|
||||
<string name="stop_service">"%s に切り替え"</string>
|
||||
<string name="profile_default">"現在のプロファイルを使用する"</string>
|
||||
|
||||
<string name="connection_test_pending">接続状況確認</string>
|
||||
<string name="connection_test_testing">テスト中...</string>
|
||||
<string name="connection_test_available">成功: %dmsの遅延</string>
|
||||
<string name="connection_test_fail">インターネット利用不可</string>
|
||||
<string name="connection_test_error">失敗しました:%s</string>
|
||||
<string name="connection_test_error_status_code">ステータスコード無効(#%d)</string>
|
||||
<!-- status -->
|
||||
<string name="sent">"送信済み:"</string>
|
||||
<string name="received">"受信済み:"</string>
|
||||
|
||||
<!-- profile -->
|
||||
<string name="add_profile_dialog">シャドーソックスにプロファイルを追加しますか</string>
|
||||
<string name="add_profile_methods_scan_qr_code">QRコードを読み取る</string>
|
||||
<string name="add_profile_methods_manual_settings">手動でセットアップ</string>
|
||||
|
||||
<string name="route_entry_gfwlist">中国本土からアクセス不可なアドレス以外を迂回する</string>
|
||||
<string-array name="route_entry">
|
||||
<item>すべて</item>
|
||||
<item>LANアドレスを迂回する</item>
|
||||
<item>中国本土のアドレスを迂回する</item>
|
||||
<item>LAN及び中国本土のアドレスを迂回する</item>
|
||||
<item>@string/route_entry_gfwlist</item>
|
||||
<item>中国本土のアドレス以外を迂回する</item>
|
||||
<item>@string/custom_rules</item>
|
||||
</string-array>
|
||||
|
||||
<string name="action_apply_all">設定をすべてのプロファイルに適応する</string>
|
||||
<string name="action_export">クリップボードに出力</string>
|
||||
<string name="action_import">クリップボードからインポート</string>
|
||||
<string name="action_export_msg">クリップボードの出力に成功しました</string>
|
||||
<string name="action_export_err">クリップボードの出力に失敗しました</string>
|
||||
<string name="action_import_msg">インポートは成功しました</string>
|
||||
<string name="action_import_err">インポートは失敗しました</string>
|
||||
|
||||
<plurals name="removed">
|
||||
<item quantity="one">削除済み</item>
|
||||
<item quantity="other">%d を削除しました</item>
|
||||
</plurals>
|
||||
<string name="undo">戻る</string>
|
||||
<string name="toggle_service_state">サービスを開始</string>
|
||||
<string name="start_service_default">現在のサーバーに接続する</string>
|
||||
<string name="start_service">%s に接続</string>
|
||||
<string name="stop_service">%s に切り替え</string>
|
||||
<string name="profile_default">現在のプロファイルを使用する</string>
|
||||
|
||||
<!-- status -->
|
||||
<string name="sent">送信済み:</string>
|
||||
<string name="received">受信済み:</string>
|
||||
|
||||
<!-- kcp -->
|
||||
<string name="kcp_summary">KCP プロトコル を有効にする</string>
|
||||
<string name="kcp_port">KCP ポート</string>
|
||||
<string name="kcp_port_summary">%d(リモート KCPTUN サーバーのポート番号)</string>
|
||||
<string name="kcpcli">KCP パラメータ</string>
|
||||
|
||||
</resources>
|
||||
<!-- kcp -->
|
||||
<string name="kcp_summary">"KCP プロトコル を有効にする"</string>
|
||||
<string name="kcp_port">"KCP ポート"</string>
|
||||
<string name="kcp_port_summary">"%d(リモート KCPTUN サーバーのポート番号)"</string>
|
||||
<string name="kcpcli">"KCP パラメータ"</string>
|
||||
<string name="route_entry_all">"すべて"</string>
|
||||
<string name="route_entry_bypass_lan">"LANアドレスを迂回する"</string>
|
||||
<string name="route_entry_bypass_chn">"中国本土のアドレスを迂回する"</string>
|
||||
<string name="route_entry_bypass_lan_chn">"LAN及び中国本土のアドレスを迂回する"</string>
|
||||
<string name="route_entry_chinalist">"中国本土のアドレス以外を迂回する"</string>
|
||||
<string name="proxied_apps_summary_v21">"選択したアプリにプロキシを設定する"</string>
|
||||
</resources>
|
||||
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="proxied_apps_summary">Установить прокси для выбранных приложений</string>
|
||||
</resources>
|
||||
+114
-125
@@ -1,135 +1,124 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="quick_toggle">"Подключение"</string>
|
||||
|
||||
<string name="quick_toggle">Подключение</string>
|
||||
<!-- global/misc category -->
|
||||
<string name="misc_cat">"Разное"</string>
|
||||
<string name="profile">"Профиль"</string>
|
||||
<string name="profile_summary">"Переключить на другой профиль или добавить новые"</string>
|
||||
<string name="nat">"Режим NAT (не рекомендуется)"</string>
|
||||
<string name="nat_summary">"Использовать режим NAT вместо VPN. Требует ROOT прав."</string>
|
||||
<string name="stat_summary">"Отправлено: \t\t\t\t\t%3$s\t↑\t%1$s/s
|
||||
Получено: \t%4$s\t↓\t%2$s/s"</string>
|
||||
<string name="stat_profiles">"
|
||||
%1$s↑\t%2$s↓"</string>
|
||||
<string name="traffic_summary">"%1$s/s↑\t%2$s/s↓"</string>
|
||||
<string name="connection_test_pending">"Проверить подключение"</string>
|
||||
<string name="connection_test_testing">"Проверка…"</string>
|
||||
<string name="connection_test_available">"Успешно: %dms задержка"</string>
|
||||
<string name="connection_test_error">"Сбой проверки интернет подключения: %s"</string>
|
||||
<string name="connection_test_fail">"Интернет Недоступен"</string>
|
||||
<string name="connection_test_error_status_code">"Код ошибки: #%d"</string>
|
||||
|
||||
<!-- global/misc category -->
|
||||
<string name="misc_cat">Разное</string>
|
||||
<string name="profile">Профиль</string>
|
||||
<string name="profile_summary">Переключить на другой профиль или добавить новые</string>
|
||||
<string name="nat">Режим NAT (не рекомендуется)</string>
|
||||
<string name="nat_summary">Использовать режим NAT вместо VPN. Требует ROOT прав.</string>
|
||||
<string name="stat_summary">Отправлено: \t\t\t\t\t%3$s\t↑\t%1$s/s\nПолучено: \t%4$s\t↓\t%2$s/s</string>
|
||||
<string name="stat_profiles">\n%1$s↑\t%2$s↓</string>
|
||||
<string name="traffic_summary">%1$s/s↑\t%2$s/s↓</string>
|
||||
<string name="connection_test_pending">Проверить подключение</string>
|
||||
<string name="connection_test_testing">Проверка…</string>
|
||||
<string name="connection_test_available">Успешно: %dms задержка</string>
|
||||
<string name="connection_test_error">Сбой проверки интернет подключения: %s</string>
|
||||
<string name="connection_test_fail">Интернет Недоступен</string>
|
||||
<string name="connection_test_error_status_code">Код ошибки: #%d</string>
|
||||
<!-- proxy category -->
|
||||
<string name="proxy_cat">"Настройки Сервера"</string>
|
||||
<string name="profile_name">"Имя Профиля"</string>
|
||||
<string name="proxy">"Сервер"</string>
|
||||
<string name="remote_port">"Удалённый порт"</string>
|
||||
<string name="port">"Локальный порт"</string>
|
||||
<string name="sitekey">"Пароль"</string>
|
||||
<string name="enc_method">"Метод Шифрования"</string>
|
||||
|
||||
<!-- proxy category -->
|
||||
<string name="proxy_cat">Настройки Сервера</string>
|
||||
<string name="profile_name">Имя Профиля</string>
|
||||
<string name="proxy">Сервер</string>
|
||||
<string name="remote_port">Удалённый порт</string>
|
||||
<string name="port">Локальный порт</string>
|
||||
<string name="sitekey">Пароль</string>
|
||||
<string name="enc_method">Метод Шифрования</string>
|
||||
<!-- feature category -->
|
||||
<string name="feature_cat">"Дополнительные Настройки"</string>
|
||||
<string name="ipv6">"IPv6 Маршрут"</string>
|
||||
<string name="ipv6_summary">"Перенаправлять IPv6 траффик на удалённый сервер"</string>
|
||||
<string name="onetime_auth">"Единоразовая Аутентификация"</string>
|
||||
<string name="onetime_auth_summary">"Включить единоразовую аутентификацию"</string>
|
||||
<string name="http_proxy">"HTTP Прокси"</string>
|
||||
<string name="http_proxy_summary">"Локальный HTTP прокси"</string>
|
||||
<string name="dns_proxy">"DNS Прокси"</string>
|
||||
<string name="dns_proxy_summary">"Перенаправлять DNS запросы на удалённый сервер"</string>
|
||||
<string name="auto_set_gfwlist">"CHN Маршрут"</string>
|
||||
<string name="auto_set_gfwlist_summary">"Игнорировать все сайты находящиеся в Китае"</string>
|
||||
<string name="route_list">"Маршрут"</string>
|
||||
<string name="route_entry_gfwlist">"Список GFW"</string>
|
||||
<string name="proxied_apps">"Прокси для выбранных приложений"</string>
|
||||
<string name="proxied_apps_summary">"Установить прокси для выбранных приложений, требует режим NAT под Android 4.x"</string>
|
||||
<string name="on">"Вкл"</string>
|
||||
<string name="bypass_apps">"В обход прокси"</string>
|
||||
<string name="bypass_apps_summary">"Включите эту опцию для работы выбранных приложений в обход прокси"</string>
|
||||
<string name="auto_connect">"Авто Подключение"</string>
|
||||
<string name="auto_connect_summary">"Запускать Shadowsocks при включении"</string>
|
||||
<string name="tcp_fastopen_summary">"Переключение требует наличия ROOT прав"</string>
|
||||
<string name="tcp_fastopen_summary_unsupported">"Неподдерживаемая версия ядра: %s < 3.7.1"</string>
|
||||
<string name="udp_dns">"Проброс UDP"</string>
|
||||
<string name="udp_dns_summary">"Пробрасывать UDP пакеты на удалённый сервер"</string>
|
||||
|
||||
<!-- feature category -->
|
||||
<string name="feature_cat">Дополнительные Настройки</string>
|
||||
<string name="ipv6">IPv6 Маршрут</string>
|
||||
<string name="ipv6_summary">Перенаправлять IPv6 траффик на удалённый сервер</string>
|
||||
<string name="onetime_auth">Единоразовая Аутентификация</string>
|
||||
<string name="onetime_auth_summary">Включить единоразовую аутентификацию</string>
|
||||
<string name="http_proxy">HTTP Прокси</string>
|
||||
<string name="http_proxy_summary">Локальный HTTP прокси</string>
|
||||
<string name="dns_proxy">DNS Прокси</string>
|
||||
<string name="dns_proxy_summary">Перенаправлять DNS запросы на удалённый сервер</string>
|
||||
<string name="auto_set_gfwlist">CHN Маршрут</string>
|
||||
<string name="auto_set_gfwlist_summary">Игнорировать все сайты находящиеся в Китае</string>
|
||||
<string name="route_list">Маршрут</string>
|
||||
<string name="route_entry_gfwlist">Список GFW</string>
|
||||
<string-array name="route_entry">
|
||||
<item>Все</item>
|
||||
<item>Обход LAN</item>
|
||||
<item>Обходной Китай</item>
|
||||
<item>Обход LAN и Китай</item>
|
||||
<item>@string/route_entry_gfwlist</item>
|
||||
<item>Список Китай</item>
|
||||
<item>@string/custom_rules</item>
|
||||
</string-array>
|
||||
<string name="proxied_apps">Прокси для выбранных приложений</string>
|
||||
<string name="proxied_apps_summary">Установить прокси для выбранных приложений, требует режим NAT под Android 4.x</string>
|
||||
<string name="on">Вкл</string>
|
||||
<string name="bypass_apps">В обход прокси</string>
|
||||
<string name="bypass_apps_summary">Включите эту опцию для работы выбранных приложений в обход прокси</string>
|
||||
<string name="auto_connect">Авто Подключение</string>
|
||||
<string name="auto_connect_summary">Запускать Shadowsocks при включении</string>
|
||||
<string name="tcp_fastopen_summary">Переключение требует наличия ROOT прав</string>
|
||||
<string name="tcp_fastopen_summary_unsupported">Неподдерживаемая версия ядра: %s < 3.7.1</string>
|
||||
<string name="udp_dns">Проброс UDP</string>
|
||||
<string name="udp_dns_summary">Пробрасывать UDP пакеты на удалённый сервер</string>
|
||||
<!-- notification category -->
|
||||
<string name="forward_success">"Shadowsocks запущен."</string>
|
||||
<string name="invalid_server">"Неправильное имя сервера"</string>
|
||||
<string name="service_failed">"Ошибка при подключении к удалённому серверу"</string>
|
||||
<string name="method_unsafe">"ВНИМАНИЕ:В настоящее время метод шифрования является небезопасным"</string>
|
||||
<string name="nat_deprecated">"ВНИМАНИЕ:режим NAT не работает в Android 5.0"</string>
|
||||
<string name="nat_no_root">"Режим NAT требует наличия ROOT прав"</string>
|
||||
<string name="switch_to_vpn">"Переключить на режим VPN"</string>
|
||||
<string name="stop">"Остановить"</string>
|
||||
<string name="stopping">"Останавливается…"</string>
|
||||
<string name="vpn_error">"%s"</string>
|
||||
<string name="reboot_required">"Сбой запуска VPN сервиса. Требуется перезагрузка Вашего устройства."</string>
|
||||
<string name="close">"Закрыть"</string>
|
||||
<string name="proxy_empty">"Прокси/Пароль не должны быть пустыми"</string>
|
||||
<string name="connect">"Подключить"</string>
|
||||
<string name="initializing">"Инициализация…"</string>
|
||||
<string name="recovering">"Сброс…"</string>
|
||||
<string name="loading">"Загрузка…"</string>
|
||||
<string name="remove_profile">"Удалить этот профиль %s?"</string>
|
||||
|
||||
<!-- notification category -->
|
||||
<string name="forward_success">Shadowsocks запущен.</string>
|
||||
<string name="invalid_server">Неправильное имя сервера</string>
|
||||
<string name="service_failed">Ошибка при подключении к удалённому серверу</string>
|
||||
<string name="method_unsafe">ВНИМАНИЕ:В настоящее время метод шифрования является небезопасным</string>
|
||||
<string name="nat_deprecated">ВНИМАНИЕ:режим NAT не работает в Android 5.0</string>
|
||||
<string name="nat_no_root">Режим NAT требует наличия ROOT прав</string>
|
||||
<string name="switch_to_vpn">Переключить на режим VPN</string>
|
||||
<string name="stop">Остановить</string>
|
||||
<string name="stopping">Останавливается…</string>
|
||||
<string name="vpn_error">%s</string>
|
||||
<string name="reboot_required">Сбой запуска VPN сервиса. Требуется перезагрузка Вашего устройства.</string>
|
||||
<!-- menu category -->
|
||||
<string name="profiles">"Профили"</string>
|
||||
<string name="settings">"Настройки"</string>
|
||||
<string name="recovery">"Сброс"</string>
|
||||
<string name="about">"О приложении"</string>
|
||||
<string name="about_title">"Shadowsocks %s"</string>
|
||||
<string name="share">"Поделиться"</string>
|
||||
<string name="flush_dnscache">"Очистить кэш DNS"</string>
|
||||
<string name="flush_dnscache_summary">"Работает только в режиме NAT. Требует наличия ROOT прав."</string>
|
||||
<string name="flush_dnscache_no_root">"Очистка кэша DNS не работает без налиичя ROOT прав"</string>
|
||||
<string name="flushing">"Очистка"</string>
|
||||
<string name="add_profile">"Добавить Профиль"</string>
|
||||
<string name="action_apply_all">"Применить настройки для всех профилей"</string>
|
||||
<string name="action_export">"Экспортировать в буфер обмена"</string>
|
||||
<string name="action_import">"Импортировать из буфера обмена"</string>
|
||||
<string name="action_export_msg">"Успешный экспорт!"</string>
|
||||
<string name="action_export_err">"Сбой экспорта."</string>
|
||||
<string name="action_import_msg">"Успешный импорт!"</string>
|
||||
<string name="action_import_err">"Сбой импорта."</string>
|
||||
<string name="add_profile_dialog">"Добавить этот Профиль Shadowsocks?"</string>
|
||||
<string name="add_profile_methods_scan_qr_code">"Сканировать QR код"</string>
|
||||
<string name="add_profile_methods_manual_settings">"Настройка вручную"</string>
|
||||
<string name="undo">"Вернуть"</string>
|
||||
|
||||
<!-- alert category -->
|
||||
<string name="close">Закрыть</string>
|
||||
<string name="proxy_empty">Прокси/Пароль не должны быть пустыми</string>
|
||||
<string name="connect">Подключить</string>
|
||||
<string name="initializing">Инициализация…</string>
|
||||
<string name="recovering">Сброс…</string>
|
||||
<string name="loading">Загрузка…</string>
|
||||
<string name="remove_profile">Удалить этот профиль "%s"?</string>
|
||||
<!-- tasker -->
|
||||
<string name="toggle_service_state">"Запустить сервисStart the service"</string>
|
||||
<string name="start_service_default">"Подключиться к текущему серверу"</string>
|
||||
<string name="start_service">"Подключиться к %s"</string>
|
||||
<string name="stop_service">"Переключить на %s"</string>
|
||||
<string name="profile_default">"Использовать текущий профиль"</string>
|
||||
|
||||
<!-- menu category -->
|
||||
<string name="profiles">Профили</string>
|
||||
<string name="settings">Настройки</string>
|
||||
<string name="recovery">Сброс</string>
|
||||
<string name="about">О приложении</string>
|
||||
<string name="about_title">Shadowsocks %s</string>
|
||||
<string name="share">Поделиться</string>
|
||||
<string name="flush_dnscache">Очистить кэш DNS</string>
|
||||
<string name="flush_dnscache_summary">Работает только в режиме NAT. Требует наличия ROOT прав.</string>
|
||||
<string name="flush_dnscache_no_root">Очистка кэша DNS не работает без налиичя ROOT прав</string>
|
||||
<string name="flushing">Очистка</string>
|
||||
<string name="add_profile">Добавить Профиль</string>
|
||||
<!-- status -->
|
||||
<string name="sent">"Отправлено:"</string>
|
||||
<string name="received">"Получено:"</string>
|
||||
|
||||
<string name="action_apply_all">Применить настройки для всех профилей</string>
|
||||
<string name="action_export">Экспортировать в буфер обмена</string>
|
||||
<string name="action_import">Импортировать из буфера обмена</string>
|
||||
<string name="action_export_msg">Успешный экспорт!</string>
|
||||
<string name="action_export_err">Сбой экспорта.</string>
|
||||
<string name="action_import_msg">Успешный импорт!</string>
|
||||
<string name="action_import_err">Сбой импорта.</string>
|
||||
|
||||
<!-- profile -->
|
||||
<string name="add_profile_dialog">Добавить этот Профиль Shadowsocks?</string>
|
||||
<string name="add_profile_methods_scan_qr_code">Сканировать QR код</string>
|
||||
<string name="add_profile_methods_manual_settings">Настройка вручную</string>
|
||||
<plurals name="removed">
|
||||
<item quantity="one">Удалён</item>
|
||||
<item quantity="other">%d элементы удалены</item>
|
||||
</plurals>
|
||||
<string name="undo">Вернуть</string>
|
||||
|
||||
<!-- tasker -->
|
||||
<string name="toggle_service_state">Запустить сервисStart the service</string>
|
||||
<string name="start_service_default">Подключиться к текущему серверу</string>
|
||||
<string name="start_service">Подключиться к %s</string>
|
||||
<string name="stop_service">Переключить на %s</string>
|
||||
<string name="profile_default">Использовать текущий профиль</string>
|
||||
|
||||
<!-- status -->
|
||||
<string name="sent">Отправлено:</string>
|
||||
<string name="received">Получено:</string>
|
||||
|
||||
<!-- kcp -->
|
||||
<string name="kcp_summary">Включить Shadowsocks над KCPTUN</string>
|
||||
<string name="kcp_port">KCP порт</string>
|
||||
<string name="kcp_port_summary">%d (KCPTUN омер порта удалённого сервера)</string>
|
||||
<string name="kcpcli">KCP параметры</string>
|
||||
</resources>
|
||||
<!-- kcp -->
|
||||
<string name="kcp_summary">"Включить Shadowsocks над KCPTUN"</string>
|
||||
<string name="kcp_port">"KCP порт"</string>
|
||||
<string name="kcp_port_summary">"%d (KCPTUN омер порта удалённого сервера)"</string>
|
||||
<string name="kcpcli">"KCP параметры"</string>
|
||||
<string name="route_entry_all">"Все"</string>
|
||||
<string name="route_entry_bypass_lan">"Обход LAN"</string>
|
||||
<string name="route_entry_bypass_chn">"Обходной Китай"</string>
|
||||
<string name="route_entry_bypass_lan_chn">"Обход LAN и Китай"</string>
|
||||
<string name="route_entry_chinalist">"Список Китай"</string>
|
||||
<string name="proxied_apps_summary_v21">"Установить прокси для выбранных приложений"</string>
|
||||
</resources>
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="proxied_apps_summary">Set proxy for selected apps</string>
|
||||
<string name="proxied_apps_summary">@string/proxied_apps_summary_v21</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="proxied_apps_summary">为应用程序分别设置代理</string>
|
||||
</resources>
|
||||
@@ -1,156 +1,155 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">影梭</string>
|
||||
<string name="quick_toggle">开关</string>
|
||||
<string name="app_name">"影梭"</string>
|
||||
<string name="quick_toggle">"开关"</string>
|
||||
|
||||
<string name="misc_cat">其他</string>
|
||||
<string name="proxy_cat">服务器设置</string>
|
||||
<string name="profile_name">配置名称</string>
|
||||
<string name="profile">配置文件</string>
|
||||
<string name="profile_summary">新建或切换到其他配置文件</string>
|
||||
<string name="proxy">服务器</string>
|
||||
<string name="remote_port">远程端口</string>
|
||||
<string name="port">本地端口</string>
|
||||
<string name="sitekey">密码</string>
|
||||
<string name="enc_method">加密方法</string>
|
||||
<string name="feature_cat">功能设置</string>
|
||||
<string name="http_proxy">HTTP 代理服务器</string>
|
||||
<string name="http_proxy_summary">本地 HTTP 代理</string>
|
||||
<string name="dns_proxy">DNS 代理</string>
|
||||
<string name="dns_proxy_summary">重定向 DNS 查询到远程服务器</string>
|
||||
<string name="auto_set_gfwlist">国内路由</string>
|
||||
<string name="auto_set_gfwlist_summary">绕过所有位于中国的网站</string>
|
||||
<string name="route_list">路由</string>
|
||||
<string name="proxied_apps">分应用代理</string>
|
||||
<string name="proxied_apps_summary">为应用程序分别设置代理,在 4.x 下需要启用 NAT 模式</string>
|
||||
<string name="on">开</string>
|
||||
<string name="bypass_apps">绕行模式</string>
|
||||
<string name="bypass_apps_summary">启用该选项,以使所选应用程序的流量不经过代理</string>
|
||||
<string name="auto_connect">自动连接</string>
|
||||
<string name="auto_connect_summary">随系统启动后台服务</string>
|
||||
<string name="tcp_fastopen_summary">切换需要 ROOT 权限</string>
|
||||
<string name="tcp_fastopen_summary_unsupported">不支持的内核版本:%s < 3.7.1</string>
|
||||
<string name="forward_success">后台服务已开始运行。</string>
|
||||
<string name="service_failed">无法连接远程服务器</string>
|
||||
<string name="invalid_server">服务器名无效</string>
|
||||
<string name="method_unsafe">警告:当前使用的加密算法不安全</string>
|
||||
<string name="nat_deprecated">警告:在 Android 5.0 及更高版本中不建议使用 NAT 模式</string>
|
||||
<string name="nat_no_root">NAT 模式需要 ROOT 权限</string>
|
||||
<string name="switch_to_vpn">切换到 VPN 模式</string>
|
||||
<string name="stop">停止</string>
|
||||
<string name="stopping">正在关闭……</string>
|
||||
<string name="vpn_error">后台服务启动失败:%s</string>
|
||||
<string name="reboot_required">VPN 服务启动失败。你可能需要重启设备。</string>
|
||||
<string name="yes">是</string>
|
||||
<string name="no">否</string>
|
||||
<string name="close">关闭</string>
|
||||
<string name="profile_empty">请选择配置文件</string>
|
||||
<string name="proxy_empty">代理服务器地址及密码不能为空</string>
|
||||
<string name="connect">连接</string>
|
||||
<string name="initializing">正在初始化……</string>
|
||||
<string name="recovering">重置中……</string>
|
||||
<string name="loading">正在加载……</string>
|
||||
<string name="profiles">配置文件</string>
|
||||
<string name="settings">设置选项</string>
|
||||
<string name="remove_profile">删除此配置文件「%s」?</string>
|
||||
<string name="faq">常见问题</string>
|
||||
<string name="recovery">重置</string>
|
||||
<string name="about">关于</string>
|
||||
<string name="about_title">影梭(shadowsocks)%s</string>
|
||||
<string name="flush_dnscache">刷新 DNS 缓存</string>
|
||||
<string name="flush_dnscache_summary">只需在 NAT 模式下使用,需要 ROOT 权限</string>
|
||||
<string name="flush_dnscache_no_root">在没有 ROOT 权限的情况下无法刷新 DNS 缓存</string>
|
||||
<string name="flushing">刷新中……</string>
|
||||
<string name="edit">编辑</string>
|
||||
<string name="share">分享</string>
|
||||
<string name="add_profile">添加配置文件</string>
|
||||
<!-- global/misc category -->
|
||||
<string name="misc_cat">"其他"</string>
|
||||
<string name="profile">"配置文件"</string>
|
||||
<string name="profile_summary">"新建或切换到其他配置文件"</string>
|
||||
<string name="nat">"NAT 模式 (仅限调试)"</string>
|
||||
<string name="nat_summary">"从 VPN 模式切换为 NAT 模式,需要 ROOT 权限"</string>
|
||||
<string name="remote_dns">"远程 DNS"</string>
|
||||
<string name="stat_summary">"发送: \t%3$s\t↑\t%1$s/s
|
||||
接收: \t%4$s\t↓\t%2$s/s"</string>
|
||||
<string name="connection_test_pending">"检查网络连接"</string>
|
||||
<string name="connection_test_testing">"测试中……"</string>
|
||||
<string name="connection_test_available">"连接有效: 延时 %d 毫秒"</string>
|
||||
<string name="connection_test_error">"失败:%s"</string>
|
||||
<string name="connection_test_fail">"无互联网连接"</string>
|
||||
<string name="connection_test_error_status_code">"状态码无效(#%d)"</string>
|
||||
|
||||
<string name="nat">NAT 模式 (仅限调试)</string>
|
||||
<string name="nat_summary">从 VPN 模式切换为 NAT 模式,需要 ROOT 权限</string>
|
||||
<string name="remote_dns">远程 DNS</string>
|
||||
<!-- proxy category -->
|
||||
<string name="proxy_cat">"服务器设置"</string>
|
||||
<string name="profile_name">"配置名称"</string>
|
||||
<string name="proxy">"服务器"</string>
|
||||
<string name="remote_port">"远程端口"</string>
|
||||
<string name="port">"本地端口"</string>
|
||||
<string name="sitekey">"密码"</string>
|
||||
<string name="enc_method">"加密方法"</string>
|
||||
|
||||
<string name="udp_dns">UDP 转发</string>
|
||||
<string name="udp_dns_summary">由远程服务器转发 UDP 协议的数据包</string>
|
||||
<!-- feature category -->
|
||||
<string name="feature_cat">"功能设置"</string>
|
||||
<string name="ipv6">"IPv6 路由"</string>
|
||||
<string name="ipv6_summary">"向远程服务器转发 IPv6 流量"</string>
|
||||
<string name="onetime_auth">"一次性认证"</string>
|
||||
<string name="onetime_auth_summary">"启用一次性认证"</string>
|
||||
<string name="http_proxy">"HTTP 代理服务器"</string>
|
||||
<string name="http_proxy_summary">"本地 HTTP 代理"</string>
|
||||
<string name="dns_proxy">"DNS 代理"</string>
|
||||
<string name="dns_proxy_summary">"重定向 DNS 查询到远程服务器"</string>
|
||||
<string name="auto_set_gfwlist">"国内路由"</string>
|
||||
<string name="auto_set_gfwlist_summary">"绕过所有位于中国的网站"</string>
|
||||
<string name="route_list">"路由"</string>
|
||||
<string name="route_entry_gfwlist">"仅代理中国大陆无法访问的地址"</string>
|
||||
<string name="proxied_apps">"分应用代理"</string>
|
||||
<string name="proxied_apps_summary">"为应用程序分别设置代理,在 4.x 下需要启用 NAT 模式"</string>
|
||||
<string name="on">"开"</string>
|
||||
<string name="bypass_apps">"绕行模式"</string>
|
||||
<string name="bypass_apps_summary">"启用该选项,以使所选应用程序的流量不经过代理"</string>
|
||||
<string name="auto_connect">"自动连接"</string>
|
||||
<string name="auto_connect_summary">"随系统启动后台服务"</string>
|
||||
<string name="tcp_fastopen_summary">"切换需要 ROOT 权限"</string>
|
||||
<string name="tcp_fastopen_summary_unsupported">"不支持的内核版本:%s < 3.7.1"</string>
|
||||
<string name="udp_dns">"UDP 转发"</string>
|
||||
<string name="udp_dns_summary">"由远程服务器转发 UDP 协议的数据包"</string>
|
||||
|
||||
<string name="onetime_auth">一次性认证</string>
|
||||
<string name="onetime_auth_summary">启用一次性认证</string>
|
||||
<!-- notification category -->
|
||||
<string name="forward_success">"后台服务已开始运行。"</string>
|
||||
<string name="invalid_server">"服务器名无效"</string>
|
||||
<string name="service_failed">"无法连接远程服务器"</string>
|
||||
<string name="method_unsafe">"警告:当前使用的加密算法不安全"</string>
|
||||
<string name="nat_deprecated">"警告:在 Android 5.0 及更高版本中不建议使用 NAT 模式"</string>
|
||||
<string name="nat_no_root">"NAT 模式需要 ROOT 权限"</string>
|
||||
<string name="switch_to_vpn">"切换到 VPN 模式"</string>
|
||||
<string name="stop">"停止"</string>
|
||||
<string name="stopping">"正在关闭……"</string>
|
||||
<string name="vpn_error">"后台服务启动失败:%s"</string>
|
||||
<string name="reboot_required">"VPN 服务启动失败。你可能需要重启设备。"</string>
|
||||
<string name="profile_invalid_input">"未找到有效配置文件。"</string>
|
||||
|
||||
<string name="ipv6">IPv6 路由</string>
|
||||
<string name="ipv6_summary">向远程服务器转发 IPv6 流量</string>
|
||||
<!-- alert category -->
|
||||
<string name="yes">"是"</string>
|
||||
<string name="no">"否"</string>
|
||||
<string name="close">"关闭"</string>
|
||||
<string name="profile_empty">"请选择配置文件"</string>
|
||||
<string name="proxy_empty">"代理服务器地址及密码不能为空"</string>
|
||||
<string name="connect">"连接"</string>
|
||||
<string name="initializing">"正在初始化……"</string>
|
||||
<string name="recovering">"重置中……"</string>
|
||||
<string name="loading">"正在加载……"</string>
|
||||
<string name="remove_profile">"删除此配置文件「%s」?"</string>
|
||||
|
||||
<string name="stat_summary">发送: \t%3$s\t↑\t%1$s/s\n接收: \t%4$s\t↓\t%2$s/s</string>
|
||||
<!-- menu category -->
|
||||
<string name="profiles">"配置文件"</string>
|
||||
<string name="settings">"设置选项"</string>
|
||||
<string name="faq">"常见问题"</string>
|
||||
<string name="recovery">"重置"</string>
|
||||
<string name="about">"关于"</string>
|
||||
<string name="about_title">"影梭(shadowsocks)%s"</string>
|
||||
<string name="edit">"编辑"</string>
|
||||
<string name="share">"分享"</string>
|
||||
<string name="flush_dnscache">"刷新 DNS 缓存"</string>
|
||||
<string name="flush_dnscache_summary">"只需在 NAT 模式下使用,需要 ROOT 权限"</string>
|
||||
<string name="flush_dnscache_no_root">"在没有 ROOT 权限的情况下无法刷新 DNS 缓存"</string>
|
||||
<string name="flushing">"刷新中……"</string>
|
||||
<string name="add_profile">"添加配置文件"</string>
|
||||
<string name="action_apply_all">"应用设置到所有配置文件"</string>
|
||||
<string name="action_export">"导出至剪贴板"</string>
|
||||
<string name="action_import">"从剪贴板导入"</string>
|
||||
<string name="action_export_msg">"导出至剪贴板成功"</string>
|
||||
<string name="action_export_err">"导出至剪贴板失败"</string>
|
||||
<string name="action_import_msg">"导入成功"</string>
|
||||
<string name="action_import_err">"导入失败"</string>
|
||||
|
||||
<string name="connection_test_pending">检查网络连接</string>
|
||||
<string name="connection_test_testing">测试中……</string>
|
||||
<string name="connection_test_available">连接有效: 延时 %d 毫秒</string>
|
||||
<string name="connection_test_fail">无互联网连接</string>
|
||||
<string name="connection_test_error">失败:%s</string>
|
||||
<string name="connection_test_error_status_code">状态码无效(#%d)</string>
|
||||
<!-- profile -->
|
||||
<string name="profile_config">"配置文件设置"</string>
|
||||
<string name="unsaved_changes_prompt">"保存修改吗?"</string>
|
||||
<string name="apply">"应用"</string>
|
||||
<string name="delete">"删除"</string>
|
||||
<string name="delete_confirm_prompt">"你是否确定要删除这个配置文件?"</string>
|
||||
<string name="share_qr_nfc">"二维码 / NFC"</string>
|
||||
<string name="add_profile_dialog">"为影梭添加此配置文件?"</string>
|
||||
<string name="add_profile_methods_scan_qr_code">"扫描二维码"</string>
|
||||
<string name="add_profile_methods_manual_settings">"手动设置"</string>
|
||||
<string name="add_profile_scanner_not_installed">"请安装任意兼容 ZXing 的二维码扫描应用。"</string>
|
||||
<plurals name="removed">
|
||||
<item quantity="other">"已删除"</item>
|
||||
</plurals>
|
||||
<string name="undo">"撤销"</string>
|
||||
|
||||
<!-- profile -->
|
||||
<string name="profile_config">配置文件设置</string>
|
||||
<string name="unsaved_changes_prompt">保存修改吗?</string>
|
||||
<string name="apply">应用</string>
|
||||
<string name="delete">删除</string>
|
||||
<string name="delete_confirm_prompt">你是否确定要删除这个配置文件?</string>
|
||||
<string name="share_qr_nfc">二维码 / NFC</string>
|
||||
<string name="add_profile_dialog">为影梭添加此配置文件?</string>
|
||||
<string name="add_profile_methods_scan_qr_code">扫描二维码</string>
|
||||
<string name="add_profile_methods_manual_settings">手动设置</string>
|
||||
<string name="add_profile_scanner_not_installed">请安装任意兼容 ZXing 的二维码扫描应用。</string>
|
||||
<!-- tasker -->
|
||||
<string name="toggle_service_state">"启动服务"</string>
|
||||
<string name="start_service_default">"连接到当前服务器"</string>
|
||||
<string name="start_service">"连接到 %s"</string>
|
||||
<string name="stop_service">"切换到 %s"</string>
|
||||
<string name="profile_default">"使用当前配置"</string>
|
||||
|
||||
<string name="route_entry_gfwlist">仅代理中国大陆无法访问的地址</string>
|
||||
<string-array name="route_entry">
|
||||
<item>全局</item>
|
||||
<item>绕过局域网地址</item>
|
||||
<item>绕过中国大陆地址</item>
|
||||
<item>绕过局域网及中国大陆地址</item>
|
||||
<item>@string/route_entry_gfwlist</item>
|
||||
<item>仅代理中国大陆地址</item>
|
||||
<item>@string/custom_rules</item>
|
||||
</string-array>
|
||||
<!-- status -->
|
||||
<string name="sent">"发送:"</string>
|
||||
<string name="received">"接收:"</string>
|
||||
<string name="connecting">"连接中…"</string>
|
||||
<string name="vpn_connected">"已连接, 轻触以检查连接状态"</string>
|
||||
<string name="nat_connected">"已连接"</string>
|
||||
<string name="not_connected">"未连接"</string>
|
||||
|
||||
<string name="action_apply_all">应用设置到所有配置文件</string>
|
||||
<string name="action_export">导出至剪贴板</string>
|
||||
<string name="action_import">从剪贴板导入</string>
|
||||
<string name="action_export_msg">导出至剪贴板成功</string>
|
||||
<string name="action_export_err">导出至剪贴板失败</string>
|
||||
<string name="action_import_msg">导入成功</string>
|
||||
<string name="action_import_err">导入失败</string>
|
||||
<!-- kcp -->
|
||||
<string name="kcp_summary">"启用 KCP 协议"</string>
|
||||
<string name="kcp_port">"KCP 端口"</string>
|
||||
<string name="kcp_port_summary">"%d(远端 KCPTUN 服务器的端口号)"</string>
|
||||
<string name="kcpcli">"KCP 参数"</string>
|
||||
|
||||
<plurals name="removed">
|
||||
<item quantity="one">已删除</item>
|
||||
<item quantity="other">已删除 %d 项</item>
|
||||
</plurals>
|
||||
<string name="undo">撤销</string>
|
||||
<string name="toggle_service_state">启动服务</string>
|
||||
<string name="start_service_default">连接到当前服务器</string>
|
||||
<string name="start_service">连接到 %s</string>
|
||||
<string name="stop_service">切换到 %s</string>
|
||||
<string name="profile_default">使用当前配置</string>
|
||||
|
||||
<!-- status -->
|
||||
<string name="sent">发送:</string>
|
||||
<string name="received">接收:</string>
|
||||
<string name="connecting">连接中…</string>
|
||||
<string name="vpn_connected">已连接, 轻触以检查连接状态</string>
|
||||
<string name="nat_connected">已连接</string>
|
||||
<string name="not_connected">未连接</string>
|
||||
|
||||
<!-- kcp -->
|
||||
<string name="kcp_summary">启用 KCP 协议</string>
|
||||
<string name="kcp_port">KCP 端口</string>
|
||||
<string name="kcp_port_summary">%d(远端 KCPTUN 服务器的端口号)</string>
|
||||
<string name="kcpcli">KCP 参数</string>
|
||||
|
||||
<!-- acl -->
|
||||
<string name="custom_rules">自定义规则</string>
|
||||
<string name="action_selection">选择…</string>
|
||||
<string name="action_add_rule">添加规则…</string>
|
||||
<string-array name="acl_rule_templates">
|
||||
<item>子网/域名 PCRE 正则表达式</item>
|
||||
<item>域名及其子域名</item>
|
||||
</string-array>
|
||||
<string name="edit_rule">编辑规则</string>
|
||||
|
||||
</resources>
|
||||
<!-- acl -->
|
||||
<string name="custom_rules">"自定义规则"</string>
|
||||
<string name="action_selection">"选择…"</string>
|
||||
<string name="action_add_rule">"添加规则…"</string>
|
||||
<string name="edit_rule">"编辑规则"</string>
|
||||
<string name="route_entry_all">"全局"</string>
|
||||
<string name="route_entry_bypass_lan">"绕过局域网地址"</string>
|
||||
<string name="route_entry_bypass_chn">"绕过中国大陆地址"</string>
|
||||
<string name="route_entry_bypass_lan_chn">"绕过局域网及中国大陆地址"</string>
|
||||
<string name="route_entry_chinalist">"仅代理中国大陆地址"</string>
|
||||
<string name="proxied_apps_summary_v21">"为应用程序分别设置代理"</string>
|
||||
<string name="acl_rule_templates_generic">"子网/域名 PCRE 正则表达式"</string>
|
||||
<string name="acl_rule_templates_domain">"域名及其子域名"</string>
|
||||
</resources>
|
||||
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="proxied_apps_summary">為已選擇的應用程式設定 Proxy</string>
|
||||
</resources>
|
||||
@@ -1,157 +1,154 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">"Shadowsocks"</string>
|
||||
<string name="quick_toggle">"切換"</string>
|
||||
|
||||
<string name="app_name">Shadowsocks</string>
|
||||
<string name="quick_toggle">開關</string>
|
||||
<!-- global/misc category -->
|
||||
<string name="misc_cat">"其他"</string>
|
||||
<string name="profile">"設定檔"</string>
|
||||
<string name="profile_summary">"切換至其他設定檔或新增新設定檔"</string>
|
||||
<string name="nat">"NAT 模式 (已過時)"</string>
|
||||
<string name="nat_summary">"使用 NAT 模式代替 VPN 模式,需要 ROOT 權限"</string>
|
||||
<string name="remote_dns">"遠程 DNS"</string>
|
||||
<string name="stat_summary">"傳送: \t%3$s\t↑\t%1$s/s
|
||||
接收: \t%4$s\t↓\t%2$s/s"</string>
|
||||
<string name="connection_test_pending">"檢查連線能力"</string>
|
||||
<string name="connection_test_testing">"測試中……"</string>
|
||||
<string name="connection_test_available">"成功: %d 毫秒延遲"</string>
|
||||
<string name="connection_test_error">"偵測出網際網路連線失敗: %s"</string>
|
||||
<string name="connection_test_fail">"無法使用網際網路"</string>
|
||||
<string name="connection_test_error_status_code">"錯誤碼: #%d"</string>
|
||||
|
||||
<string name="misc_cat">其他</string>
|
||||
<string name="proxy_cat">伺服器設定</string>
|
||||
<string name="profile_name">設定檔名稱</string>
|
||||
<string name="profile">設定檔</string>
|
||||
<string name="profile_summary">切換至其他設定檔或新增新設定檔</string>
|
||||
<string name="proxy">伺服器</string>
|
||||
<string name="remote_port">遠端連接埠</string>
|
||||
<string name="port">連接埠號碼</string>
|
||||
<string name="sitekey">密碼</string>
|
||||
<string name="enc_method">加密方法</string>
|
||||
<string name="feature_cat">功能設定</string>
|
||||
<string name="http_proxy">HTTP Proxy</string>
|
||||
<string name="http_proxy_summary">本機 HTTP Proxy</string>
|
||||
<string name="dns_proxy">DNS Proxy</string>
|
||||
<string name="dns_proxy_summary">重新導向 DNS 查詢至遠端</string>
|
||||
<string name="auto_set_gfwlist">中國大陸路由</string>
|
||||
<string name="auto_set_gfwlist_summary">略過一切中國大陸的網站</string>
|
||||
<string name="route_list">路由</string>
|
||||
<string name="proxied_apps">個別應用程式的 Proxy</string>
|
||||
<string name="proxied_apps_summary">為已選擇的應用程式設定 Proxy,在 Android 4.X 以下需要開啟 NAT 模式</string>
|
||||
<string name="on">開</string>
|
||||
<string name="bypass_apps">略過模式</string>
|
||||
<string name="bypass_apps_summary">啟用此選項,會略過已選擇的應用程式</string>
|
||||
<string name="auto_connect">自動連線</string>
|
||||
<string name="auto_connect_summary">在裝置啟動時啟用 Shadowsocks</string>
|
||||
<string name="tcp_fastopen_summary">切換需要 ROOT 權限</string>
|
||||
<string name="tcp_fastopen_summary_unsupported">不支持的內核版本:%s < 3.7.1</string>
|
||||
<string name="forward_success">Shadowsocks 已啟動。</string>
|
||||
<string name="service_failed">連線至遠端伺服器失敗</string>
|
||||
<string name="invalid_server">伺服器名稱無效</string>
|
||||
<string name="method_unsafe">警告:當前使用的加密算法不安全</string>
|
||||
<string name="nat_deprecated">警告:自 Android 5.0 開始, NAT 模式已過時</string>
|
||||
<string name="nat_no_root">NAT 模式需要 ROOT 權限</string>
|
||||
<string name="switch_to_vpn">切換至 VPN 模式</string>
|
||||
<string name="stop">停止</string>
|
||||
<string name="stopping">關閉中……</string>
|
||||
<string name="vpn_error">%s</string>
|
||||
<string name="reboot_required">VPN 服務啟動失敗。您或許需要重新啟動您的裝置。</string>
|
||||
<string name="yes">是</string>
|
||||
<string name="no">否</string>
|
||||
<string name="close">關閉</string>
|
||||
<string name="profile_empty">請選擇設定檔</string>
|
||||
<string name="proxy_empty">Proxy 或密碼不可以空白</string>
|
||||
<string name="connect">連線</string>
|
||||
<string name="initializing">起始中……</string>
|
||||
<string name="recovering">重設中……</string>
|
||||
<string name="loading">載入中……</string>
|
||||
<string name="profiles">設定檔</string>
|
||||
<string name="settings">設定</string>
|
||||
<string name="remove_profile">移除此設定檔 "%s"?</string>
|
||||
<string name="faq">常問問題</string>
|
||||
<string name="recovery">重設</string>
|
||||
<string name="about">關於</string>
|
||||
<string name="about_title">Shadowsocks %s</string>
|
||||
<string name="flush_dnscache">清除 DNS 快取</string>
|
||||
<string name="flush_dnscache_summary">僅在 NAT 模式可用,需要 ROOT 權限</string>
|
||||
<string name="flush_dnscache_no_root">在無 ROOT 權限時清除 DNS 快取無法進行</string>
|
||||
<string name="flushing">清除中……</string>
|
||||
<string name="edit">編輯</string>
|
||||
<string name="share">分享</string>
|
||||
<string name="add_profile">新增設定檔</string>
|
||||
<!-- proxy category -->
|
||||
<string name="proxy_cat">"伺服器設定"</string>
|
||||
<string name="profile_name">"設定檔名稱"</string>
|
||||
<string name="proxy">"伺服器"</string>
|
||||
<string name="remote_port">"遠端連接埠"</string>
|
||||
<string name="port">"連接埠號碼"</string>
|
||||
<string name="sitekey">"密碼"</string>
|
||||
<string name="enc_method">"加密方法"</string>
|
||||
|
||||
<string name="nat">NAT 模式 (已過時)</string>
|
||||
<string name="nat_summary">使用 NAT 模式代替 VPN 模式,需要 ROOT 權限</string>
|
||||
<string name="remote_dns">遠程 DNS</string>
|
||||
<!-- feature category -->
|
||||
<string name="feature_cat">"功能設定"</string>
|
||||
<string name="ipv6">"IPv6 路由"</string>
|
||||
<string name="ipv6_summary">"向遠端重新導向 IPv6 流量"</string>
|
||||
<string name="onetime_auth">"單次驗證"</string>
|
||||
<string name="onetime_auth_summary">"啟用單次驗證"</string>
|
||||
<string name="http_proxy">"HTTP Proxy"</string>
|
||||
<string name="http_proxy_summary">"本機 HTTP Proxy"</string>
|
||||
<string name="dns_proxy">"DNS Proxy"</string>
|
||||
<string name="dns_proxy_summary">"重新導向 DNS 查詢至遠端"</string>
|
||||
<string name="auto_set_gfwlist">"中國大陸路由"</string>
|
||||
<string name="auto_set_gfwlist_summary">"略過一切中國大陸的網站"</string>
|
||||
<string name="route_list">"路由"</string>
|
||||
<string name="route_entry_gfwlist">"GFW List"</string>
|
||||
<string name="proxied_apps">"個別應用程式的 Proxy"</string>
|
||||
<string name="proxied_apps_summary">"為已選擇的應用程式設定 Proxy,在 Android 4.X 以下需要開啟 NAT 模式"</string>
|
||||
<string name="on">"開"</string>
|
||||
<string name="bypass_apps">"略過模式"</string>
|
||||
<string name="bypass_apps_summary">"啟用此選項,會略過已選擇的應用程式"</string>
|
||||
<string name="auto_connect">"自動連線"</string>
|
||||
<string name="auto_connect_summary">"在裝置啟動時啟用 Shadowsocks"</string>
|
||||
<string name="tcp_fastopen_summary">"切換需要 ROOT 權限"</string>
|
||||
<string name="tcp_fastopen_summary_unsupported">"不支援的核心版本:%s < 3.7.1"</string>
|
||||
<string name="udp_dns">"UDP 轉送"</string>
|
||||
<string name="udp_dns_summary">"向遠端轉送 UDP 封包"</string>
|
||||
|
||||
<string name="udp_dns">UDP 轉送</string>
|
||||
<string name="udp_dns_summary">向遠端轉送 UDP 封包</string>
|
||||
<!-- notification category -->
|
||||
<string name="forward_success">"Shadowsocks 已啟動。"</string>
|
||||
<string name="invalid_server">"伺服器名稱無效"</string>
|
||||
<string name="service_failed">"連線至遠端伺服器失敗"</string>
|
||||
<string name="method_unsafe">"警告:目前使用的加密演算法不安全"</string>
|
||||
<string name="nat_deprecated">"警告:自 Android 5.0 開始, NAT 模式已過時"</string>
|
||||
<string name="nat_no_root">"NAT 模式需要 ROOT 權限"</string>
|
||||
<string name="switch_to_vpn">"切換至 VPN 模式"</string>
|
||||
<string name="stop">"停止"</string>
|
||||
<string name="stopping">"關閉中……"</string>
|
||||
<string name="vpn_error">"%s"</string>
|
||||
<string name="reboot_required">"VPN 服務啟動失敗。您或許需要重新啟動您的裝置。"</string>
|
||||
|
||||
<string name="onetime_auth">單次驗證</string>
|
||||
<string name="onetime_auth_summary">啟用單次驗證</string>
|
||||
<!-- alert category -->
|
||||
<string name="yes">"是"</string>
|
||||
<string name="no">"否"</string>
|
||||
<string name="close">"關閉"</string>
|
||||
<string name="profile_empty">"請選擇設定檔"</string>
|
||||
<string name="proxy_empty">"Proxy 或密碼不可以空白"</string>
|
||||
<string name="connect">"連線"</string>
|
||||
<string name="initializing">"初始中……"</string>
|
||||
<string name="recovering">"重設中……"</string>
|
||||
<string name="loading">"載入中……"</string>
|
||||
<string name="remove_profile">"移除此設定檔 %s?"</string>
|
||||
|
||||
<string name="ipv6">IPv6 路由</string>
|
||||
<string name="ipv6_summary">向遠端重新導向 IPv6 流量</string>
|
||||
<!-- menu category -->
|
||||
<string name="profiles">"設定檔"</string>
|
||||
<string name="settings">"設定"</string>
|
||||
<string name="faq">"常見問題"</string>
|
||||
<string name="recovery">"重設"</string>
|
||||
<string name="about">"關於"</string>
|
||||
<string name="about_title">"Shadowsocks %s"</string>
|
||||
<string name="edit">"編輯"</string>
|
||||
<string name="share">"分享"</string>
|
||||
<string name="flush_dnscache">"清除 DNS 快取"</string>
|
||||
<string name="flush_dnscache_summary">"僅在 NAT 模式可用,需要 ROOT 權限"</string>
|
||||
<string name="flush_dnscache_no_root">"在無 ROOT 權限時清除 DNS 快取無法進行"</string>
|
||||
<string name="flushing">"清除中……"</string>
|
||||
<string name="add_profile">"新增設定檔"</string>
|
||||
<string name="action_apply_all">"套用設定至所有設定檔"</string>
|
||||
<string name="action_export">"匯出至剪貼簿"</string>
|
||||
<string name="action_import">"從剪貼簿匯入"</string>
|
||||
<string name="action_export_msg">"匯出至剪貼簿成功"</string>
|
||||
<string name="action_export_err">"匯出至剪貼簿失敗"</string>
|
||||
<string name="action_import_msg">"匯入成功"</string>
|
||||
<string name="action_import_err">"匯入失敗"</string>
|
||||
|
||||
<string name="stat_summary">傳送: \t%3$s\t↑\t%1$s/s\n接收: \t%4$s\t↓\t%2$s/s</string>
|
||||
<!-- profile -->
|
||||
<string name="profile_config">"設定檔設定"</string>
|
||||
<string name="unsaved_changes_prompt">"要儲存變更嗎?"</string>
|
||||
<string name="apply">"套用"</string>
|
||||
<string name="delete">"刪除"</string>
|
||||
<string name="delete_confirm_prompt">"您確定要移除這個設定檔嗎?"</string>
|
||||
<string name="share_qr_nfc">"QR 碼 / NFC"</string>
|
||||
<string name="add_profile_dialog">"為 Shadowsocks 新增此設定檔?"</string>
|
||||
<string name="add_profile_methods_scan_qr_code">"掃描 QR 碼"</string>
|
||||
<string name="add_profile_methods_manual_settings">"手動設定"</string>
|
||||
<string name="add_profile_scanner_not_installed">"請安裝任何相容 ZXing 的 QR 碼掃描應用程式。"</string>
|
||||
<plurals name="removed">
|
||||
<item quantity="other">"已移除"</item>
|
||||
</plurals>
|
||||
<string name="undo">"復原"</string>
|
||||
|
||||
<string name="connection_test_pending">檢查連線能力</string>
|
||||
<string name="connection_test_testing">測試中……</string>
|
||||
<string name="connection_test_available">成功: %d 毫秒延遲</string>
|
||||
<string name="connection_test_fail">無法使用網際網路</string>
|
||||
<string name="connection_test_error">偵測出網際網路連線失敗: %s</string>
|
||||
<string name="connection_test_error_status_code">錯誤碼: #%d</string>
|
||||
<!-- tasker -->
|
||||
<string name="toggle_service_state">"啟動服務"</string>
|
||||
<string name="start_service_default">"連線至目前的伺服器"</string>
|
||||
<string name="start_service">"連線至 %s"</string>
|
||||
<string name="stop_service">"切換至 %s"</string>
|
||||
<string name="profile_default">"使用目前的設定檔"</string>
|
||||
|
||||
<!-- profile -->
|
||||
<string name="profile_config">設定檔配置</string>
|
||||
<string name="unsaved_changes_prompt">要保存更改嗎?</string>
|
||||
<string name="apply">應用</string>
|
||||
<string name="delete">刪除</string>
|
||||
<string name="delete_confirm_prompt">您確定要移除這個設定檔嗎?</string>
|
||||
<string name="share_qr_nfc">QR 碼 / NFC</string>
|
||||
<string name="add_profile_dialog">為 Shadowsocks 新增此設定檔?</string>
|
||||
<string name="add_profile_methods_scan_qr_code">掃描 QR 碼</string>
|
||||
<string name="add_profile_methods_manual_settings">手動設定</string>
|
||||
<string name="add_profile_scanner_not_installed">請安裝任何兼容 ZXing 的 QR 碼掃描應用程式。</string>
|
||||
<!-- status -->
|
||||
<string name="sent">"傳送:"</string>
|
||||
<string name="received">"接收:"</string>
|
||||
<string name="connecting">"連線中…"</string>
|
||||
<string name="vpn_connected">"已連線,輕觸以檢查連線能力"</string>
|
||||
<string name="nat_connected">"已連線"</string>
|
||||
<string name="not_connected">"未連線"</string>
|
||||
|
||||
<string name="route_entry_gfwlist">GFW List</string>
|
||||
<string-array name="route_entry">
|
||||
<item>全域</item>
|
||||
<item>略過區域網路位址</item>
|
||||
<item>略過中國大陸位址</item>
|
||||
<item>略過區域網路及中國大陸位址</item>
|
||||
<item>@string/route_entry_gfwlist</item>
|
||||
<item>僅代理大陸位址</item>
|
||||
<item>@string/custom_rules</item>
|
||||
</string-array>
|
||||
<!-- kcp -->
|
||||
<string name="kcp_summary">"啟用 KCP 協定"</string>
|
||||
<string name="kcp_port">"KCP 連接埠"</string>
|
||||
<string name="kcp_port_summary">"%d(遠端 KCPTUN 伺服器的連接埠號碼)"</string>
|
||||
<string name="kcpcli">"KCP 參數 (CLI)"</string>
|
||||
|
||||
<string name="action_apply_all">應用設置到所有配置文件</string>
|
||||
<string name="action_export">匯出至剪貼簿</string>
|
||||
<string name="action_import">從剪貼簿匯入</string>
|
||||
<string name="action_export_msg">匯出至剪貼簿成功</string>
|
||||
<string name="action_export_err">匯出至剪貼簿失敗</string>
|
||||
<string name="action_import_msg">匯入成功</string>
|
||||
<string name="action_import_err">匯入失敗</string>
|
||||
|
||||
<plurals name="removed">
|
||||
<item quantity="one">已移除</item>
|
||||
<item quantity="other">已移除 %d 項</item>
|
||||
</plurals>
|
||||
<string name="undo">復原</string>
|
||||
<string name="toggle_service_state">啟動服務</string>
|
||||
<string name="start_service_default">連線至目前的伺服器</string>
|
||||
<string name="start_service">連線至 %s</string>
|
||||
<string name="stop_service">切換至 %s</string>
|
||||
<string name="profile_default">使用目前的設定檔</string>
|
||||
|
||||
<!-- status -->
|
||||
<string name="sent">傳送:</string>
|
||||
<string name="received">接收:</string>
|
||||
<string name="connecting">連線中…</string>
|
||||
<string name="vpn_connected">已連線, 輕觸以檢查連線能力</string>
|
||||
<string name="nat_connected">已連線</string>
|
||||
<string name="not_connected">未連線</string>
|
||||
|
||||
<!-- kcp -->
|
||||
<string name="kcp_summary">啟用 KCP 協定</string>
|
||||
<string name="kcp_port">KCP 連接埠</string>
|
||||
<string name="kcp_port_summary">%d(遠端 KCPTUN 伺服器的連接埠號碼)</string>
|
||||
<string name="kcpcli">KCP 參數</string>
|
||||
|
||||
<!-- acl -->
|
||||
<string name="custom_rules">自定義規則</string>
|
||||
<string name="action_selection">選擇…</string>
|
||||
<string name="action_add_rule">添加規則…</string>
|
||||
<string-array name="acl_rule_templates">
|
||||
<item>子網/主機名 PCRE 正則表達式</item>
|
||||
<item>域名及其所有子域名</item>
|
||||
</string-array>
|
||||
<string name="edit_rule">編輯規則</string>
|
||||
|
||||
</resources>
|
||||
<!-- acl -->
|
||||
<string name="custom_rules">"自訂規則"</string>
|
||||
<string name="action_selection">"選擇…"</string>
|
||||
<string name="action_add_rule">"新增規則…"</string>
|
||||
<string name="edit_rule">"編輯規則"</string>
|
||||
<string name="route_entry_all">"全部"</string>
|
||||
<string name="route_entry_bypass_lan">"略過區域網路"</string>
|
||||
<string name="route_entry_bypass_chn">"略過中國大陸"</string>
|
||||
<string name="route_entry_bypass_lan_chn">"略過區域網路及中國大陸"</string>
|
||||
<string name="route_entry_chinalist">"China List"</string>
|
||||
<string name="proxied_apps_summary_v21">"為已選擇的應用程式設定 Proxy"</string>
|
||||
<string name="acl_rule_templates_generic">"子網路/主機名稱 PCRE 模式"</string>
|
||||
<string name="acl_rule_templates_domain">"網域及其所有子網域"</string>
|
||||
</resources>
|
||||
@@ -38,6 +38,15 @@
|
||||
<item>chacha20-ietf</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="route_entry">
|
||||
<item>@string/route_entry_all</item>
|
||||
<item>@string/route_entry_bypass_lan</item>
|
||||
<item>@string/route_entry_bypass_chn</item>
|
||||
<item>@string/route_entry_bypass_lan_chn</item>
|
||||
<item>@string/route_entry_gfwlist</item>
|
||||
<item>@string/route_entry_chinalist</item>
|
||||
<item>@string/custom_rules</item>
|
||||
</string-array>
|
||||
<string-array name="route_value">
|
||||
<item>all</item>
|
||||
<item>bypass-lan</item>
|
||||
@@ -205,4 +214,9 @@
|
||||
<item>204.0.0.0/6</item>
|
||||
<item>208.0.0.0/4</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="acl_rule_templates">
|
||||
<item>@string/acl_rule_templates_generic</item>
|
||||
<item>@string/acl_rule_templates_domain</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<string name="stat_summary">Sent: \t\t\t\t\t%3$s\t↑\t%1$s/s\nReceived: \t%4$s\t↓\t%2$s/s</string>
|
||||
<string name="stat_profiles">%1$s↑\t%2$s↓</string>
|
||||
<string name="traffic_summary">%1$s/s↑\t%2$s/s↓</string>
|
||||
<plurals name="bytes" translatable="false">
|
||||
<plurals name="bytes">
|
||||
<item quantity="one">Byte</item>
|
||||
<item quantity="other">Bytes</item>
|
||||
</plurals>
|
||||
@@ -40,26 +40,16 @@
|
||||
<string name="ipv6_summary">Redirect IPv6 traffic to remote</string>
|
||||
<string name="onetime_auth">One-time Authentication</string>
|
||||
<string name="onetime_auth_summary">Enable one-time authentication</string>
|
||||
<string name="http_proxy">HTTP Proxy</string>
|
||||
<string name="http_proxy_summary">Local HTTP Proxy</string>
|
||||
<string name="dns_proxy">DNS Proxy</string>
|
||||
<string name="dns_proxy_summary">Redirect DNS queries to remote</string>
|
||||
<string name="auto_set_gfwlist">CHN Route</string>
|
||||
<string name="auto_set_gfwlist_summary">Bypass all sites located in China
|
||||
</string>
|
||||
<string name="route_list">Route</string>
|
||||
<string name="route_entry_all">All</string>
|
||||
<string name="route_entry_bypass_lan">Bypass LAN</string>
|
||||
<string name="route_entry_bypass_chn">Bypass mainland China</string>
|
||||
<string name="route_entry_bypass_lan_chn">Bypass LAN & mainland China</string>
|
||||
<string name="route_entry_gfwlist">GFW List</string>
|
||||
<string-array name="route_entry">
|
||||
<item>All</item>
|
||||
<item>Bypass LAN</item>
|
||||
<item>Bypass China</item>
|
||||
<item>Bypass LAN & China</item>
|
||||
<item>@string/route_entry_gfwlist</item>
|
||||
<item>China List</item>
|
||||
<item>@string/custom_rules</item>
|
||||
</string-array>
|
||||
<string name="route_entry_chinalist">China List</string>
|
||||
<string name="proxied_apps">Per-App Proxy</string>
|
||||
<string name="proxied_apps_summary">Set proxy for selected apps, requires NAT mode under Android 4.x</string>
|
||||
<string name="proxied_apps_summary_v21">Set proxy for selected apps</string>
|
||||
<string name="on">On</string>
|
||||
<string name="bypass_apps">Bypass Mode</string>
|
||||
<string name="bypass_apps_summary">Enable this option to bypass selected apps</string>
|
||||
@@ -91,9 +81,7 @@
|
||||
<string name="profile_empty">Please select a profile</string>
|
||||
<string name="proxy_empty">Proxy/Password should not be empty</string>
|
||||
<string name="connect">Connect</string>
|
||||
<string name="initializing">Initializing…</string>
|
||||
<string name="recovering">Resetting…</string>
|
||||
<string name="loading">Loading…</string>
|
||||
<string name="remove_profile">Remove this profile "%s"?</string>
|
||||
|
||||
<!-- menu category -->
|
||||
@@ -106,10 +94,6 @@
|
||||
<string name="about_title">Shadowsocks %s</string>
|
||||
<string name="edit">Edit</string>
|
||||
<string name="share">Share</string>
|
||||
<string name="flush_dnscache">Flush DNS cache</string>
|
||||
<string name="flush_dnscache_summary">Only useful in NAT mode. Requires ROOT permission.</string>
|
||||
<string name="flush_dnscache_no_root">Flush DNS cache cannot proceed without ROOT permission</string>
|
||||
<string name="flushing">Flushing</string>
|
||||
<string name="add_profile">Add Profile</string>
|
||||
<string name="action_apply_all">Apply Settings to All Profiles</string>
|
||||
<string name="action_export">Export to Clipboard</string>
|
||||
@@ -152,7 +136,6 @@
|
||||
<string name="not_connected">Not connected</string>
|
||||
|
||||
<!-- kcp -->
|
||||
<string name="kcp" translatable="false">KCP</string>
|
||||
<string name="kcp_summary">Enable Shadowsocks over KCP</string>
|
||||
<string name="kcp_port">KCP Port</string>
|
||||
<string name="kcp_port_summary">%d (port number of the remote KCPTUN server)</string>
|
||||
@@ -162,9 +145,7 @@
|
||||
<string name="custom_rules">Custom rules</string>
|
||||
<string name="action_selection">Selection…</string>
|
||||
<string name="action_add_rule">Add rule(s)…</string>
|
||||
<string-array name="acl_rule_templates">
|
||||
<item>Subnet/Hostname PCRE pattern</item>
|
||||
<item>Domain name and all its subdomain names</item>
|
||||
</string-array>
|
||||
<string name="acl_rule_templates_generic">Subnet/Hostname PCRE pattern</string>
|
||||
<string name="acl_rule_templates_domain">Domain name and all its subdomain names</string>
|
||||
<string name="edit_rule">Edit rule</string>
|
||||
</resources>
|
||||
|
||||
@@ -72,12 +72,12 @@
|
||||
</be.mygod.preference.PreferenceCategory>
|
||||
|
||||
<be.mygod.preference.PreferenceCategory
|
||||
android:title="@string/kcp">
|
||||
android:title="KCP">
|
||||
|
||||
<SwitchPreference
|
||||
android:key="kcp"
|
||||
android:summary="@string/kcp_summary"
|
||||
android:title="@string/kcp"/>
|
||||
android:title="KCP"/>
|
||||
|
||||
<be.mygod.preference.NumberPickerPreference
|
||||
app:min="1"
|
||||
|
||||
@@ -8,12 +8,4 @@
|
||||
android:targetPackage="com.github.shadowsocks"
|
||||
android:targetClass="com.github.shadowsocks.QuickToggleShortcut" />
|
||||
</shortcut>
|
||||
<shortcut android:shortcutId="scan"
|
||||
android:icon="@drawable/ic_qu_camera_launcher"
|
||||
android:shortcutShortLabel="@string/add_profile_methods_scan_qr_code"
|
||||
android:shortcutLongLabel="@string/add_profile_methods_scan_qr_code">
|
||||
<intent android:action="android.intent.action.MAIN"
|
||||
android:targetPackage="com.github.shadowsocks"
|
||||
android:targetClass="com.github.shadowsocks.ScannerActivity" />
|
||||
</shortcut>
|
||||
</shortcuts>
|
||||
|
||||
@@ -75,7 +75,7 @@ trait BaseService extends Service {
|
||||
|
||||
if (isConnected && profile.kcp && kcptunProcess != null) {
|
||||
restartHanlder.removeCallbacks(null)
|
||||
restartHanlder.postDelayed(() => kcptunProcess.restart(), 2000)
|
||||
restartHanlder.postDelayed(() => if (kcptunProcess != null) kcptunProcess.restart(), 2000)
|
||||
}
|
||||
}
|
||||
var networkReceiverRegistered: Boolean = _
|
||||
|
||||
@@ -377,6 +377,7 @@ class MainActivity extends Activity with ServiceBoundContext with Drawer.OnDrawe
|
||||
override def handleMessage(msg: Message): Unit = if (dialog.isShowing && !isDestroyed) dialog.dismiss()
|
||||
}
|
||||
Utils.ThrowableFuture {
|
||||
app.crashRecovery()
|
||||
app.copyAssets()
|
||||
handler.sendEmptyMessage(0)
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ import android.app.Activity
|
||||
import android.content._
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.support.design.widget.Snackbar
|
||||
import android.support.v7.widget.RecyclerView.ViewHolder
|
||||
import android.support.v7.widget._
|
||||
import android.support.v7.widget.helper.ItemTouchHelper
|
||||
@@ -112,7 +113,7 @@ final class ProfilesFragment extends ToolbarFragment with Toolbar.OnMenuItemClic
|
||||
}
|
||||
title.setText(item.getName)
|
||||
address.setText(if (item.nameIsEmpty) "" else item.formattedAddress)
|
||||
traffic.setText(getString(R.string.stat_profiles,
|
||||
traffic.setText(if (tx <= 0 && rx <= 0) null else getString(R.string.stat_profiles,
|
||||
TrafficMonitor.formatTraffic(tx), TrafficMonitor.formatTraffic(rx)))
|
||||
|
||||
if (item.id == app.profileId) {
|
||||
@@ -348,15 +349,17 @@ final class ProfilesFragment extends ToolbarFragment with Toolbar.OnMenuItemClic
|
||||
}
|
||||
true
|
||||
case R.id.action_import =>
|
||||
if (clipboard.hasPrimaryClip) {
|
||||
try {
|
||||
val profiles = Parser.findAll(clipboard.getPrimaryClip.getItemAt(0).getText)
|
||||
if (profiles.nonEmpty) {
|
||||
profiles.foreach(app.profileManager.createProfile)
|
||||
Toast.makeText(getActivity, R.string.action_import_msg, Toast.LENGTH_SHORT).show()
|
||||
return true
|
||||
}
|
||||
} catch {
|
||||
case _: Exception =>
|
||||
}
|
||||
Toast.makeText(getActivity, R.string.action_import_err, Toast.LENGTH_SHORT).show()
|
||||
Snackbar.make(getActivity.findViewById(R.id.snackbar), R.string.action_import_err, Snackbar.LENGTH_LONG).show()
|
||||
true
|
||||
case R.id.action_manual_settings =>
|
||||
startConfig(app.profileManager.createProfile().id)
|
||||
|
||||
@@ -50,8 +50,6 @@ object ShadowsocksApplication {
|
||||
var app: ShadowsocksApplication = _
|
||||
|
||||
private final val TAG = "ShadowsocksApplication"
|
||||
private val EXECUTABLES = Array(Executable.PDNSD, Executable.REDSOCKS, Executable.SS_TUNNEL, Executable.SS_LOCAL,
|
||||
Executable.TUN2SOCKS, Executable.KCPTUN)
|
||||
|
||||
// The ones in Locale doesn't have script included
|
||||
private final lazy val SIMPLIFIED_CHINESE =
|
||||
@@ -180,25 +178,11 @@ class ShadowsocksApplication extends Application {
|
||||
if (holder != null) holder.refresh()
|
||||
}
|
||||
|
||||
private def copyAssets(path: String) {
|
||||
val assetManager = getAssets
|
||||
var files: Array[String] = null
|
||||
try files = assetManager.list(path) catch {
|
||||
case e: IOException =>
|
||||
Log.e(TAG, e.getMessage)
|
||||
app.track(e)
|
||||
}
|
||||
if (files != null) for (file <- files)
|
||||
autoClose(assetManager.open(if (path.nonEmpty) path + '/' + file else file))(in =>
|
||||
autoClose(new FileOutputStream(getApplicationInfo.dataDir + '/' + file))(out =>
|
||||
IOUtils.copy(in, out)))
|
||||
}
|
||||
|
||||
def crashRecovery() {
|
||||
val cmd = new ArrayBuffer[String]()
|
||||
|
||||
for (task <- Array("ss-local", "ss-tunnel", "pdnsd", "redsocks", "tun2socks", "kcptun")) {
|
||||
cmd.append("killall %s".formatLocal(Locale.ENGLISH, task))
|
||||
for (task <- Executable.EXECUTABLES) {
|
||||
cmd.append("killall lib%s.so".formatLocal(Locale.ENGLISH, task))
|
||||
cmd.append("rm -f %1$s/%2$s-nat.conf %1$s/%2$s-vpn.conf"
|
||||
.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir, task))
|
||||
}
|
||||
@@ -212,10 +196,16 @@ class ShadowsocksApplication extends Application {
|
||||
}
|
||||
|
||||
def copyAssets() {
|
||||
crashRecovery() // ensure executables are killed before writing to them
|
||||
copyAssets(System.getABI)
|
||||
copyAssets("acl")
|
||||
Shell.SH.run(EXECUTABLES.map("chmod 755 " + getApplicationInfo.dataDir + '/' + _))
|
||||
val assetManager = getAssets
|
||||
var files: Array[String] = null
|
||||
try files = assetManager.list("acl") catch {
|
||||
case e: IOException =>
|
||||
Log.e(TAG, e.getMessage)
|
||||
app.track(e)
|
||||
}
|
||||
if (files != null) for (file <- files) autoClose(assetManager.open("acl/" + file))(in =>
|
||||
autoClose(new FileOutputStream(getApplicationInfo.dataDir + '/' + file))(out =>
|
||||
IOUtils.copy(in, out)))
|
||||
editor.putInt(Key.currentVersionCode, BuildConfig.VERSION_CODE).apply()
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
package com.github.shadowsocks
|
||||
|
||||
import android.app.backup.{BackupAgentHelper, FileBackupHelper, SharedPreferencesBackupHelper}
|
||||
import com.github.shadowsocks.acl.Acl
|
||||
import com.github.shadowsocks.database.DBHelper
|
||||
|
||||
class ShadowsocksBackupAgent extends BackupAgentHelper {
|
||||
@@ -38,6 +39,7 @@ class ShadowsocksBackupAgent extends BackupAgentHelper {
|
||||
override def onCreate() {
|
||||
val helper = new SharedPreferencesBackupHelper(this, PREFS_DISPLAY)
|
||||
addHelper(MY_PREFS_BACKUP_KEY, helper)
|
||||
addHelper(DATABASE, new FileBackupHelper(this, "../databases/" + DBHelper.PROFILE))
|
||||
addHelper(DATABASE, new FileBackupHelper(this, "../databases/" + DBHelper.PROFILE,
|
||||
"../" + Acl.CUSTOM_RULES + ".acl"))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ class ShadowsocksNatService extends BaseService {
|
||||
p.println(conf)
|
||||
})
|
||||
|
||||
val cmd = ArrayBuffer[String](getApplicationInfo.dataDir + "/ss-local"
|
||||
val cmd = ArrayBuffer[String](getApplicationInfo.nativeLibraryDir + "/libss-local.so"
|
||||
, "-b" , "127.0.0.1"
|
||||
, "-t" , "600"
|
||||
, "-P", getApplicationInfo.dataDir
|
||||
@@ -94,7 +94,7 @@ class ShadowsocksNatService extends BaseService {
|
||||
profile.host
|
||||
}
|
||||
|
||||
val cmd = ArrayBuffer[String](getApplicationInfo.dataDir + "/kcptun"
|
||||
val cmd = ArrayBuffer[String](getApplicationInfo.nativeLibraryDir + "/libkcptun.so"
|
||||
, "-r", host + ":" + profile.kcpPort
|
||||
, "-l", "127.0.0.1:" + (profile.localPort + 90))
|
||||
try cmd ++= Utils.translateCommandline(profile.kcpcli) catch {
|
||||
@@ -114,7 +114,7 @@ class ShadowsocksNatService extends BaseService {
|
||||
Utils.printToFile(new File(getApplicationInfo.dataDir + "/ss-tunnel-nat.conf"))(p => {
|
||||
p.println(conf)
|
||||
})
|
||||
val cmd = ArrayBuffer[String](getApplicationInfo.dataDir + "/ss-tunnel"
|
||||
val cmd = ArrayBuffer[String](getApplicationInfo.nativeLibraryDir + "/libss-tunnel.so"
|
||||
, "-u"
|
||||
, "-t" , "10"
|
||||
, "-b" , "127.0.0.1"
|
||||
@@ -142,7 +142,7 @@ class ShadowsocksNatService extends BaseService {
|
||||
Utils.printToFile(new File(getApplicationInfo.dataDir + "/ss-tunnel-nat.conf"))(p => {
|
||||
p.println(conf)
|
||||
})
|
||||
val cmdBuf = ArrayBuffer[String](getApplicationInfo.dataDir + "/ss-tunnel"
|
||||
val cmdBuf = ArrayBuffer[String](getApplicationInfo.nativeLibraryDir + "/libss-tunnel.so"
|
||||
, "-t" , "10"
|
||||
, "-b" , "127.0.0.1"
|
||||
, "-l" , (profile.localPort + 63).toString
|
||||
@@ -179,7 +179,7 @@ class ShadowsocksNatService extends BaseService {
|
||||
Utils.printToFile(new File(getApplicationInfo.dataDir + "/pdnsd-nat.conf"))(p => {
|
||||
p.println(conf)
|
||||
})
|
||||
val cmd = Array(getApplicationInfo.dataDir + "/pdnsd", "-c", getApplicationInfo.dataDir + "/pdnsd-nat.conf")
|
||||
val cmd = Array(getApplicationInfo.nativeLibraryDir + "/libpdnsd.so", "-c", getApplicationInfo.dataDir + "/pdnsd-nat.conf")
|
||||
|
||||
if (BuildConfig.DEBUG) Log.d(TAG, cmd.mkString(" "))
|
||||
|
||||
@@ -188,7 +188,7 @@ class ShadowsocksNatService extends BaseService {
|
||||
|
||||
def startRedsocksDaemon() {
|
||||
val conf = ConfigUtils.REDSOCKS.formatLocal(Locale.ENGLISH, profile.localPort)
|
||||
val cmd = Array(getApplicationInfo.dataDir + "/redsocks", "-c", getApplicationInfo.dataDir + "/redsocks-nat.conf")
|
||||
val cmd = Array(getApplicationInfo.nativeLibraryDir + "/libredsocks.so", "-c", getApplicationInfo.dataDir + "/redsocks-nat.conf")
|
||||
Utils.printToFile(new File(getApplicationInfo.dataDir + "/redsocks-nat.conf"))(p => {
|
||||
p.println(conf)
|
||||
})
|
||||
|
||||
@@ -182,7 +182,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
profile.host
|
||||
}
|
||||
|
||||
val cmd = ArrayBuffer(getApplicationInfo.dataDir + "/kcptun"
|
||||
val cmd = ArrayBuffer(getApplicationInfo.nativeLibraryDir + "/libkcptun.so"
|
||||
, "-r", host + ":" + profile.kcpPort
|
||||
, "-l", "127.0.0.1:" + (profile.localPort + 90)
|
||||
, "--path", protectPath)
|
||||
@@ -204,7 +204,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
p.println(conf)
|
||||
})
|
||||
|
||||
val cmd = ArrayBuffer[String](getApplicationInfo.dataDir + "/ss-local", "-V", "-U"
|
||||
val cmd = ArrayBuffer[String](getApplicationInfo.nativeLibraryDir + "/libss-local.so", "-V", "-U"
|
||||
, "-b", "127.0.0.1"
|
||||
, "-t", "600"
|
||||
, "-P", getApplicationInfo.dataDir
|
||||
@@ -231,7 +231,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
p.println(conf)
|
||||
})
|
||||
|
||||
val cmd = ArrayBuffer[String](getApplicationInfo.dataDir + "/ss-local", "-V"
|
||||
val cmd = ArrayBuffer[String](getApplicationInfo.nativeLibraryDir + "/libss-local.so", "-V"
|
||||
, "-b", "127.0.0.1"
|
||||
, "-t", "600"
|
||||
, "-P", getApplicationInfo.dataDir
|
||||
@@ -266,7 +266,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
Utils.printToFile(new File(getApplicationInfo.dataDir + "/ss-tunnel-vpn.conf"))(p => {
|
||||
p.println(conf)
|
||||
})
|
||||
val cmd = ArrayBuffer[String](getApplicationInfo.dataDir + "/ss-tunnel"
|
||||
val cmd = ArrayBuffer[String](getApplicationInfo.nativeLibraryDir + "/libss-tunnel.so"
|
||||
, "-V"
|
||||
, "-t", "10"
|
||||
, "-b", "127.0.0.1"
|
||||
@@ -300,7 +300,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
Utils.printToFile(new File(getApplicationInfo.dataDir + "/pdnsd-vpn.conf"))(p => {
|
||||
p.println(conf)
|
||||
})
|
||||
val cmd = Array(getApplicationInfo.dataDir + "/pdnsd", "-c", getApplicationInfo.dataDir + "/pdnsd-vpn.conf")
|
||||
val cmd = Array(getApplicationInfo.nativeLibraryDir + "/libpdnsd.so", "-c", getApplicationInfo.dataDir + "/pdnsd-vpn.conf")
|
||||
|
||||
if (BuildConfig.DEBUG) Log.d(TAG, cmd.mkString(" "))
|
||||
|
||||
@@ -358,7 +358,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
|
||||
val fd = conn.getFd
|
||||
|
||||
var cmd = ArrayBuffer[String](getApplicationInfo.dataDir + "/tun2socks",
|
||||
var cmd = ArrayBuffer[String](getApplicationInfo.nativeLibraryDir + "/libtun2socks.so",
|
||||
"--netif-ipaddr", PRIVATE_VLAN.formatLocal(Locale.ENGLISH, "2"),
|
||||
"--netif-netmask", "255.255.255.0",
|
||||
"--socks-server-addr", "127.0.0.1:" + profile.localPort,
|
||||
|
||||
@@ -51,15 +51,15 @@ class Acl {
|
||||
bypass = other.bypass
|
||||
this
|
||||
}
|
||||
def fromSource(value: Source): Acl = {
|
||||
def fromSource(value: Source, defaultBypass: Boolean = false): Acl = {
|
||||
bypassHostnames.clear()
|
||||
proxyHostnames.clear()
|
||||
this.subnets.clear()
|
||||
bypass = false
|
||||
bypass = defaultBypass
|
||||
lazy val bypassSubnets = new mutable.SortedList[Subnet]()
|
||||
lazy val proxySubnets = new mutable.SortedList[Subnet]()
|
||||
var hostnames: mutable.SortedList[String] = proxyHostnames
|
||||
var subnets: mutable.SortedList[Subnet] = proxySubnets
|
||||
var hostnames: mutable.SortedList[String] = if (defaultBypass) proxyHostnames else bypassHostnames
|
||||
var subnets: mutable.SortedList[Subnet] = if (defaultBypass) proxySubnets else bypassSubnets
|
||||
for (line <- value.getLines()) (line.indexOf('#') match {
|
||||
case -1 => line
|
||||
case index => line.substring(0, index) // trim comments
|
||||
@@ -80,7 +80,7 @@ class Acl {
|
||||
}
|
||||
case _ =>
|
||||
}
|
||||
this.subnets ++= (if (bypass) bypassSubnets else proxySubnets)
|
||||
this.subnets ++= (if (bypass) proxySubnets else bypassSubnets)
|
||||
this
|
||||
}
|
||||
final def fromId(id: String): Acl = fromSource(Source.fromFile(Acl.getPath(id)))
|
||||
@@ -88,10 +88,9 @@ class Acl {
|
||||
override def toString: String = {
|
||||
val result = new StringBuilder()
|
||||
result.append(if (bypass) "[bypass_all]\n" else "[proxy_all]\n")
|
||||
var bypassList = bypassHostnames.toStream
|
||||
var proxyList = proxyHostnames.toStream
|
||||
if (bypass) bypassList = subnets.toStream.map(_.toString) #::: bypassList
|
||||
else proxyList = subnets.toStream.map(_.toString) #::: proxyList
|
||||
val (bypassList, proxyList) =
|
||||
if (bypass) (bypassHostnames.toStream, subnets.toStream.map(_.toString) #::: proxyHostnames.toStream)
|
||||
else (subnets.toStream.map(_.toString) #::: bypassHostnames.toStream, proxyHostnames.toStream)
|
||||
if (bypassList.nonEmpty) {
|
||||
result.append("[bypass_list]\n")
|
||||
result.append(bypassList.mkString("\n"))
|
||||
|
||||
@@ -4,7 +4,8 @@ import java.net.IDN
|
||||
import java.util.Locale
|
||||
|
||||
import android.content.{ClipData, ClipboardManager, Context, DialogInterface}
|
||||
import android.os.{Bundle, Handler}
|
||||
import android.os.Bundle
|
||||
import android.support.design.widget.Snackbar
|
||||
import android.support.v7.app.AlertDialog
|
||||
import android.support.v7.widget.RecyclerView.ViewHolder
|
||||
import android.support.v7.widget.helper.ItemTouchHelper
|
||||
@@ -61,9 +62,10 @@ class CustomRulesFragment extends ToolbarFragment with Toolbar.OnMenuItemClickLi
|
||||
.setView(view))
|
||||
}
|
||||
|
||||
private val handler = new Handler()
|
||||
private val selectedItems = new mutable.HashSet[AnyRef]
|
||||
private def onSelectedItemsUpdated(): Unit = selectionItem.setVisible(selectedItems.nonEmpty)
|
||||
private def onSelectedItemsUpdated(): Unit = if (selectionItem != null) {
|
||||
selectionItem.setVisible(selectedItems.nonEmpty)
|
||||
}
|
||||
|
||||
private final class AclRuleViewHolder(view: View) extends RecyclerView.ViewHolder(view)
|
||||
with View.OnClickListener with View.OnLongClickListener {
|
||||
@@ -92,7 +94,15 @@ class CustomRulesFragment extends ToolbarFragment with Toolbar.OnMenuItemClickLi
|
||||
undoManager.remove((-1, item))
|
||||
}): DialogInterface.OnClickListener)
|
||||
.setPositiveButton(android.R.string.ok, ((_, _) =>
|
||||
if (adapter.addFromTemplate(templateSelector.getSelectedItemPosition, editText.getText)) adapter.remove(item))
|
||||
adapter.addFromTemplate(templateSelector.getSelectedItemPosition, editText.getText) match {
|
||||
case -1 =>
|
||||
case index =>
|
||||
val item = this.item
|
||||
list.post(() => {
|
||||
list.scrollToPosition(index)
|
||||
adapter.remove(item)
|
||||
})
|
||||
})
|
||||
: DialogInterface.OnClickListener)
|
||||
.create().show()
|
||||
}
|
||||
@@ -109,7 +119,7 @@ class CustomRulesFragment extends ToolbarFragment with Toolbar.OnMenuItemClickLi
|
||||
private var savePending: Boolean = _
|
||||
private def apply() = if (!savePending) {
|
||||
savePending = true
|
||||
handler.post(() => {
|
||||
list.post(() => {
|
||||
Acl.save(Acl.CUSTOM_RULES, acl)
|
||||
savePending = false
|
||||
})
|
||||
@@ -123,28 +133,30 @@ class CustomRulesFragment extends ToolbarFragment with Toolbar.OnMenuItemClickLi
|
||||
def onCreateViewHolder(vg: ViewGroup, i: Int) = new AclRuleViewHolder(LayoutInflater.from(vg.getContext)
|
||||
.inflate(android.R.layout.simple_list_item_1, vg, false))
|
||||
|
||||
def addSubnet(subnet: Subnet): Boolean = if (acl.subnets.add(subnet)) {
|
||||
notifyItemInserted(acl.subnets.indexOf(subnet))
|
||||
def addSubnet(subnet: Subnet): Int = if (acl.subnets.add(subnet)) {
|
||||
val index = acl.subnets.indexOf(subnet)
|
||||
notifyItemInserted(index)
|
||||
apply()
|
||||
true
|
||||
} else false
|
||||
def addHostname(hostname: String): Boolean = if (acl.proxyHostnames.add(hostname)) {
|
||||
notifyItemInserted(acl.proxyHostnames.indexOf(hostname) + acl.subnets.size)
|
||||
index
|
||||
} else -1
|
||||
def addHostname(hostname: String): Int = if (acl.proxyHostnames.add(hostname)) {
|
||||
val index = acl.proxyHostnames.indexOf(hostname) + acl.subnets.size
|
||||
notifyItemInserted(index)
|
||||
apply()
|
||||
true
|
||||
} else false
|
||||
def addToProxy(input: String): Boolean = try addSubnet(Subnet.fromString(input)) catch {
|
||||
index
|
||||
} else -1
|
||||
def addToProxy(input: String): Int = try addSubnet(Subnet.fromString(input)) catch {
|
||||
case _: IllegalArgumentException => addHostname(input)
|
||||
}
|
||||
def addFromTemplate(template: Int, text: CharSequence): Boolean = template match {
|
||||
def addFromTemplate(template: Int, text: CharSequence): Int = template match {
|
||||
case GENERIC => addToProxy(text.toString)
|
||||
case DOMAIN => try addHostname(TEMPLATE_DOMAIN.formatLocal(Locale.ENGLISH,
|
||||
IDN.toASCII(text.toString, IDN.ALLOW_UNASSIGNED | IDN.USE_STD3_ASCII_RULES).replaceAll("\\.", "\\\\."))) catch {
|
||||
case exc: IllegalArgumentException =>
|
||||
Toast.makeText(getActivity, exc.getMessage, Toast.LENGTH_SHORT).show()
|
||||
false
|
||||
-1
|
||||
}
|
||||
case _ => false
|
||||
case _ => -1
|
||||
}
|
||||
|
||||
def remove(i: Int) {
|
||||
@@ -196,13 +208,17 @@ class CustomRulesFragment extends ToolbarFragment with Toolbar.OnMenuItemClickLi
|
||||
|
||||
def getSectionTitle(i: Int): String = {
|
||||
val j = i - acl.subnets.size
|
||||
(if (j < 0) acl.subnets(i).address.toString.charAt(0).toString else {
|
||||
val hostname = acl.proxyHostnames(i)
|
||||
PATTERN_DOMAIN.findFirstMatchIn(hostname) match {
|
||||
case Some(m) => m.matched.replaceAll("\\\\.", ".") // don't convert IDN yet
|
||||
case None => hostname
|
||||
}
|
||||
}).substring(0, 1)
|
||||
try {
|
||||
(if (j < 0) acl.subnets(i).address.getHostAddress.substring(0, 1) else {
|
||||
val hostname = acl.proxyHostnames(i)
|
||||
PATTERN_DOMAIN.findFirstMatchIn(hostname) match {
|
||||
case Some(m) => m.matched.replaceAll("\\\\.", ".") // don't convert IDN yet
|
||||
case None => hostname
|
||||
}
|
||||
}).substring(0, 1)
|
||||
} catch {
|
||||
case _: IndexOutOfBoundsException => " "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -231,7 +247,7 @@ class CustomRulesFragment extends ToolbarFragment with Toolbar.OnMenuItemClickLi
|
||||
toolbar.inflateMenu(R.menu.custom_rules_menu)
|
||||
toolbar.setOnMenuItemClickListener(this)
|
||||
selectionItem = toolbar.getMenu.findItem(R.id.selection)
|
||||
app.updateAssets()
|
||||
selectionItem.setVisible(selectedItems.nonEmpty)
|
||||
list = view.findViewById(R.id.list).asInstanceOf[RecyclerView]
|
||||
list.setLayoutManager(new LinearLayoutManager(getActivity, LinearLayoutManager.VERTICAL, false))
|
||||
list.setItemAnimator(new DefaultItemAnimator)
|
||||
@@ -276,7 +292,16 @@ class CustomRulesFragment extends ToolbarFragment with Toolbar.OnMenuItemClickLi
|
||||
.create().show()
|
||||
true
|
||||
case R.id.action_import =>
|
||||
clipboard.getPrimaryClip.getItemAt(0).getText.toString.split("\n").foreach(adapter.addToProxy)
|
||||
try {
|
||||
val items = clipboard.getPrimaryClip.getItemAt(0).getText.toString.split("\n")
|
||||
if (items.nonEmpty) {
|
||||
items.foreach(adapter.addToProxy)
|
||||
return true
|
||||
}
|
||||
} catch {
|
||||
case _: Exception =>
|
||||
}
|
||||
Snackbar.make(getActivity.findViewById(R.id.snackbar), R.string.action_import_err, Snackbar.LENGTH_LONG).show()
|
||||
true
|
||||
case R.id.action_import_gfwlist =>
|
||||
val acl = new Acl().fromId(Acl.GFWLIST)
|
||||
|
||||
@@ -18,7 +18,7 @@ class Subnet(val address: InetAddress, val prefixSize: Int) extends Comparable[S
|
||||
override def toString: String = if (address match {
|
||||
case _: Inet4Address => prefixSize == 32
|
||||
case _: Inet6Address => prefixSize == 128
|
||||
}) address.toString else address.toString + '/' + prefixSize
|
||||
}) address.getHostAddress else address.getHostAddress + '/' + prefixSize
|
||||
|
||||
override def compareTo(that: Subnet): Int = {
|
||||
val addrThis = address.getAddress
|
||||
@@ -26,7 +26,7 @@ class Subnet(val address: InetAddress, val prefixSize: Int) extends Comparable[S
|
||||
var result = addrThis lengthCompare addrThat.length // IPv4 address goes first
|
||||
if (result != 0) return result
|
||||
for ((x, y) <- addrThis zip addrThat) {
|
||||
result = x compare y
|
||||
result = (x & 0xFF) compare (y & 0xFF) // undo sign extension of signed byte
|
||||
if (result != 0) return result
|
||||
}
|
||||
prefixSize compare that.prefixSize
|
||||
|
||||
@@ -25,6 +25,7 @@ import java.util.Locale
|
||||
|
||||
import android.content.SharedPreferences
|
||||
import android.os.Binder
|
||||
import android.text.TextUtils
|
||||
import android.util.Base64
|
||||
import com.github.shadowsocks.utils.Key
|
||||
import com.j256.ormlite.field.{DataType, DatabaseField}
|
||||
@@ -103,7 +104,7 @@ class Profile {
|
||||
|
||||
override def toString: String = "ss://" + Base64.encodeToString("%s%s:%s@%s:%d".formatLocal(Locale.ENGLISH,
|
||||
method, if (auth) "-auth" else "", password, host, remotePort).getBytes, Base64.NO_PADDING | Base64.NO_WRAP) +
|
||||
'#' + URLEncoder.encode(name, "utf-8")
|
||||
(if (TextUtils.isEmpty(name)) "" else '#' + URLEncoder.encode(name, "utf-8"))
|
||||
|
||||
def isMethodUnsafe: Boolean = "table".equalsIgnoreCase(method) || "rc4".equalsIgnoreCase(method)
|
||||
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@ class KcpCliPreferenceDialogFragment extends EditTextPreferenceDialogFragment {
|
||||
super.onPrepareDialogBuilder(builder)
|
||||
builder.setNeutralButton("?", ((_, _) => new AlertDialog.Builder(builder.getContext)
|
||||
.setTitle("?")
|
||||
.setMessage(Shell.SH.run(builder.getContext.getApplicationInfo.dataDir + "/kcptun --help")
|
||||
.setMessage(Shell.SH.run(builder.getContext.getApplicationInfo.nativeLibraryDir + "/libkcptun.so --help")
|
||||
.asScala
|
||||
.dropWhile(line => line != "GLOBAL OPTIONS:")
|
||||
.drop(1)
|
||||
|
||||
@@ -27,6 +27,8 @@ object Executable {
|
||||
val SS_TUNNEL = "ss-tunnel"
|
||||
val TUN2SOCKS = "tun2socks"
|
||||
val KCPTUN = "kcptun"
|
||||
|
||||
val EXECUTABLES = Array(SS_LOCAL, SS_TUNNEL, PDNSD, REDSOCKS, TUN2SOCKS, KCPTUN)
|
||||
}
|
||||
|
||||
object ConfigUtils {
|
||||
|
||||
@@ -39,7 +39,10 @@ class SortedList[A] private(treeRef: ObjectRef[RB.Tree[A, Null]], from: Option[A
|
||||
}
|
||||
|
||||
// AbstractSeq
|
||||
def apply(i: Int): A = RB.nth(treeRef.elem, i).key // Should i out of range result in NullReferenceException?
|
||||
def apply(i: Int): A = try RB.nth(treeRef.elem, i).key catch {
|
||||
// out of bounds will result in accessing null nodes
|
||||
case e: NullPointerException => throw new IndexOutOfBoundsException().initCause(e)
|
||||
}
|
||||
def length: Int = size
|
||||
|
||||
// Buffer
|
||||
|
||||
Reference in New Issue
Block a user