Skip to content

Commit 99c78a7

Browse files
committed
Add unblock youku PAC file
1 parent 4951109 commit 99c78a7

File tree

9 files changed

+200
-21
lines changed

9 files changed

+200
-21
lines changed

MobileShadowSocks.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
4BF9030816BA9D5D00E35F60 /* com.linusyang.shadowsocks.plist in Resources */ = {isa = PBXBuildFile; fileRef = 4BF9030116BA9D5D00E35F60 /* com.linusyang.shadowsocks.plist */; };
5858
4BF9031116BA9F6A00E35F60 /* SettingTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BF9031216BA9F6A00E35F60 /* SettingTableViewController.m */; };
5959
4BF9031516BA9F8D00E35F60 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4BF9031316BA9F8D00E35F60 /* Localizable.strings */; };
60+
4BFF38D118F6924500C04078 /* unblock.pac in Resources */ = {isa = PBXBuildFile; fileRef = 4BFF38D018F6924500C04078 /* unblock.pac */; };
6061
/* End PBXBuildFile section */
6162

6263
/* Begin PBXBuildRule section */
@@ -188,6 +189,7 @@
188189
4BF9030116BA9D5D00E35F60 /* com.linusyang.shadowsocks.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = com.linusyang.shadowsocks.plist; sourceTree = "<group>"; };
189190
4BF9031216BA9F6A00E35F60 /* SettingTableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SettingTableViewController.m; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
190191
4BF9031616BA9F9200E35F60 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
192+
4BFF38D018F6924500C04078 /* unblock.pac */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = unblock.pac; sourceTree = "<group>"; };
191193
/* End PBXFileReference section */
192194

193195
/* Begin PBXFrameworksBuildPhase section */
@@ -303,6 +305,7 @@
303305
4B60977B1869FDC300A5FB30 /* InfoPlist.strings */,
304306
4BF9031316BA9F8D00E35F60 /* Localizable.strings */,
305307
4B080C8316FB2B6900DE1EE3 /* auto.pac */,
308+
4BFF38D018F6924500C04078 /* unblock.pac */,
306309
4BF9030116BA9D5D00E35F60 /* com.linusyang.shadowsocks.plist */,
307310
4B1604421715A43A00C2D873 /* Default-568h@2x.png */,
308311
4B3A811516BA4A2C00BE1B4C /* MobileShadowSocks-Info.plist */,
@@ -462,6 +465,7 @@
462465
4B6CD06C189191AF00360A26 /* AppIcon50x50@2x.png in Resources */,
463466
4B1604431715A43A00C2D873 /* Default-568h@2x.png in Resources */,
464467
4B6CD067189191AF00360A26 /* AppIcon29x29.png in Resources */,
468+
4BFF38D118F6924500C04078 /* unblock.pac in Resources */,
465469
);
466470
runOnlyForDeploymentPostprocessing = 0;
467471
};

MobileShadowSocks/SettingTableViewController.m

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@
1818
#import "UIAlertView+Blocks.h"
1919

2020
#define APP_VER @"0.3.1"
21-
#define APP_BUILD @"2"
21+
#define APP_BUILD @"3"
2222

2323
#define kURLPrefix @"ss://"
2424
#define kURLHelpFile @"https://github.com/linusyang/MobileShadowSocks/blob/master/README.md"
2525
#define kURLPubAccounts @"https://www.shadowsocks.net/"
26-
#define PAC_DEFAULT_NAME @"auto.pac"
26+
#define PAC_AUTO_NAME @"auto.pac"
27+
#define PAC_UNBLOCK_NAME @"unblock.pac"
2728

2829
#define CELL_INDEX_TITLE 0
2930
#define CELL_INDEX_KEY 1
@@ -90,7 +91,7 @@ - (id)initWithStyle:(UITableViewStyle)style
9091
self = [super initWithStyle:style];
9192
if (self) {
9293
_isBuggyPhotoPicker = !DEVICE_IS_IPAD() && SYSTEM_VERSION_LESS_THAN(@"7.0") && !SYSTEM_VERSION_LESS_THAN(@"6.0");
93-
_pacDefaultFile = [[NSString alloc] initWithFormat:@"%@/%@", [[NSBundle mainBundle] bundlePath], PAC_DEFAULT_NAME];
94+
_pacDefaultFile = [[NSString alloc] initWithFormat:@"%@/", [[NSBundle mainBundle] bundlePath]];
9495
_proxyManager = [[ProxyManager alloc] init];
9596
_proxyManager.delegate = self;
9697

@@ -264,11 +265,12 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath
264265
NSString *cellType = (NSString *) [tableCell objectAtIndex:3];
265266
if ([cellType hasPrefix:CELL_BUTTON]) {
266267
if ([cellKey isEqualToString:@"DEFAULT_PAC_BUTTON"]) {
267-
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Warning", nil)
268-
message:NSLocalizedString(@"Default PAC file might only be useful for users in China. Confirm to use it?", nil)
269-
delegate:self
268+
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Choose PAC File", nil)
269+
message:NSLocalizedString(@"China Whitelist will bypass websites in China. Unblock Youku will let you visit video sites in China like Youku via ShadowSocks proxy.", nil)
270+
delegate:self
270271
cancelButtonTitle:NSLocalizedString(@"Cancel",nil)
271-
otherButtonTitles:NSLocalizedString(@"OK",nil),
272+
otherButtonTitles:NSLocalizedString(@"China Whitelist",nil),
273+
NSLocalizedString(@"Unblock Youku",nil),
272274
nil];
273275
[alert setTag:kAlertViewTagDefaultPac];
274276
[alert show];
@@ -486,8 +488,6 @@ - (void)showQRCodeError:(NSString *)rawLink baseHint:(NSString *)baseHint
486488
NSString *message;
487489
if (rawLink) {
488490
message = [NSString stringWithFormat:@"%@:\n%@", baseHint, rawLink];
489-
} else {
490-
message = [baseHint stringByAppendingString:@"."];
491491
}
492492
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"QR Code Error", nil)
493493
message:message
@@ -517,12 +517,17 @@ - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)butto
517517
}
518518

519519
case kAlertViewTagDefaultPac: {
520+
NSString *pacFile = PAC_AUTO_NAME;
521+
if (buttonIndex != alertView.firstOtherButtonIndex) {
522+
pacFile = PAC_UNBLOCK_NAME;
523+
}
520524
for (UITableViewCell *cell in self.tableView.visibleCells) {
521525
if ([cell.accessoryView isKindOfClass:[UITextField class]]) {
522526
UITextField *textField = (UITextField *) cell.accessoryView;
523527
if ([textField tag] == _pacFileCellTag) {
524-
[textField setText:_pacDefaultFile];
525-
[[ProfileManager sharedProfileManager] saveObject:_pacDefaultFile forKey:kProfilePac];
528+
NSString *pacPath = [_pacDefaultFile stringByAppendingString:pacFile];
529+
[textField setText:pacPath];
530+
[[ProfileManager sharedProfileManager] saveObject:pacPath forKey:kProfilePac];
526531
break;
527532
}
528533
}

MobileShadowSocks/auto.pac

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -657,9 +657,11 @@ function FindProxyForURL(url, host) {
657657
]
658658
];
659659
var vhost = host.toLowerCase();
660-
for (var j = 0; j < rules.length; j++) {
660+
var rules_len = rules.length;
661+
for (var j = 0; j < rules_len; j++) {
661662
var rule_list = rules[j];
662-
for (var i = 0; i < rule_list.length; i++) {
663+
var rule_list_len = rule_list.length;
664+
for (var i = 0; i < rule_list_len; i++) {
663665
var rule_entry = rule_list[i];
664666
var rule_dot = '.' + rule_entry;
665667
if (vhost === rule_entry || vhost.indexOf(rule_dot, vhost.length - rule_dot.length) !== -1) {

MobileShadowSocks/en.lproj/Localizable.strings

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@
1313
"Camera Usage" = "Camera Usage";
1414
Cancel = Cancel;
1515
"Cannot parse URL link" = "Cannot parse URL link";
16+
"China Whitelist" = "China Whitelist";
17+
"China Whitelist will bypass websites in China. Unblock Youku will let you visit video sites in China like Youku via ShadowSocks proxy." = "China Whitelist will bypass websites in China. Unblock Youku will let you visit video sites in China like Youku via ShadowSocks proxy.";
18+
"Choose PAC File" = "Choose PAC File";
1619
Cipher = Cipher;
1720
"Copy Link" = "Copy Link";
1821
"Create New Profile" = "Create New Profile";
1922
DES = DES;
2023
Default = Default;
21-
"Default PAC file might only be useful for users in China. Confirm to use it?" = "Default PAC file might only be useful for users in China. Confirm to use it?";
2224
Done = Done;
2325
Edit = Edit;
2426
"Edit Profile" = "Edit Profile";
@@ -33,7 +35,6 @@
3335
"Help Page" = "Help Page";
3436
"I've shared a #ShadowSocks profile with QR Code." = "I've shared a #ShadowSocks profile with QR Code.";
3537
"I've shared a #ShadowSocks# profile with QR Code." = "I've shared a #ShadowSocks# profile with QR Code.";
36-
IDEA = IDEA;
3738
"Icon and ShadowSocks (libev) by @madeye" = "Icon and ShadowSocks (libev) by @madeye";
3839
"Image is saved to photo library." = "Image is saved to photo library.";
3940
"Import or Share Profiles by QR Code" = "Import or Share Profiles by QR Code";
@@ -56,6 +57,7 @@
5657
"Profile name is empty. Do you want to overwrite the default profile, or retry with a new name?" = "Profile name is empty. Do you want to overwrite the default profile, or retry with a new name?";
5758
Profiles = Profiles;
5859
"Proxy Settings" = "Proxy Settings";
60+
"Public Accounts" = "Public Accounts";
5961
"QR Code" = "QR Code";
6062
"QR Code Error" = "QR Code Error";
6163
RC2 = RC2;
@@ -64,7 +66,6 @@
6466
"Repair Service" = "Repair Service";
6567
Retry = Retry;
6668
Rev = Rev;
67-
SEED = SEED;
6869
"Save to Default" = "Save to Default";
6970
"Save to Photo Library" = "Save to Photo Library";
7071
"Scan QR Code" = "Scan QR Code";
@@ -83,6 +84,7 @@
8384
Torch = Torch;
8485
Twitter = Twitter;
8586
"Twitter account is not available." = "Twitter account is not available.";
87+
"Unblock Youku" = "Unblock Youku";
8688
"Use Default PAC File" = "Use Default PAC File";
8789
Version = Version;
8890
Warning = Warning;

MobileShadowSocks/unblock.pac

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
// Based on Unblock-Youku project
2+
// https://github.com/zhuzhuor/Unblock-Youku/blob/master/shared/urls.js
3+
4+
function FindProxyForURL(url, host) {
5+
var PROXY = 'SOCKS 127.0.0.1:1983';
6+
var rules = [
7+
// for both chrome extension and server
8+
[
9+
'http://v.youku.com/player/*',
10+
'http://api.youku.com/player/*',
11+
'http://v2.tudou.com/*',
12+
'http://www.tudou.com/a/*',
13+
'http://www.tudou.com/v/*',
14+
'http://www.tudou.com/outplay/goto/getTvcCode*',
15+
'http://www.tudou.com/tvp/alist.action*',
16+
'http://s.plcloud.music.qq.com/fcgi-bin/p.fcg*',
17+
'http://hot.vrs.sohu.com/*',
18+
'http://live.tv.sohu.com/live/player*',
19+
'http://hot.vrs.letv.com/*',
20+
//'http://g3.letv.cn/*',
21+
'http://data.video.qiyi.com/*',
22+
23+
// cause oversea servers unusable?
24+
// 'http://interface.bilibili.tv/player*',
25+
26+
'http://220.181.61.229/*',
27+
'http://61.135.183.45/*',
28+
'http://61.135.183.46/*',
29+
'http://220.181.19.218/*',
30+
'http://220.181.61.212/*',
31+
'http://220.181.61.213/*',
32+
'http://220.181.118.181/*',
33+
'http://123.126.48.47/*',
34+
'http://123.126.48.48/*',
35+
36+
'http://vv.video.qq.com/*',
37+
'http://tt.video.qq.com/getinfo*',
38+
'http://ice.video.qq.com/getinfo*',
39+
'http://tjsa.video.qq.com/getinfo*',
40+
'http://a10.video.qq.com/getinfo*',
41+
'http://xyy.video.qq.com/getinfo*',
42+
'http://vcp.video.qq.com/getinfo*',
43+
'http://vsh.video.qq.com/getinfo*',
44+
'http://vbj.video.qq.com/getinfo*',
45+
'http://bobo.video.qq.com/getinfo*',
46+
'http://flvs.video.qq.com/getinfo*',
47+
'http://rcgi.video.qq.com/report*',
48+
49+
'http://geo.js.kankan.xunlei.com/*',
50+
'http://web-play.pptv.com/*',
51+
'http://web-play.pplive.cn/*',
52+
// 'http://c1.pptv.com/*',
53+
'http://dyn.ugc.pps.tv/*',
54+
'http://v.pps.tv/ugc/ajax/aj_html5_url.php*',
55+
'http://inner.kandian.com/*',
56+
'http://ipservice.163.com/*',
57+
'http://so.open.163.com/open/info.htm*',
58+
'http://zb.s.qq.com/*',
59+
'http://ip.kankan.xunlei.com/*',
60+
'http://vxml.56.com/json/*',
61+
62+
'http://music.sina.com.cn/yueku/intro/*',
63+
//'http://ting.baidu.com/data/music/songlink*',
64+
//'http://ting.baidu.com/data/music/songinfo*',
65+
//'http://ting.baidu.com/song/*/download*',
66+
'http://music.sina.com.cn/radio/port/webFeatureRadioLimitList.php*',
67+
'http://play.baidu.com/data/music/songlink*',
68+
69+
'http://v.iask.com/v_play.php*',
70+
'http://v.iask.com/v_play_ipad.cx.php*',
71+
'http://tv.weibo.com/player/*',
72+
'http://wtv.v.iask.com/*.m3u8',
73+
'http://wtv.v.iask.com/mcdn.php',
74+
'http://video.sina.com.cn/interface/l/u/getFocusStatus.php*',
75+
76+
//'http://kandian.com/player/getEpgInfo*', // !!!
77+
//'http://cdn.kandian.com/*',
78+
'http://www.yinyuetai.com/insite/*',
79+
'http://www.yinyuetai.com/main/get-*',
80+
81+
'http://*.dpool.sina.com.cn/iplookup*',
82+
'http://*/vrs_flash.action*',
83+
'http://*/?prot=2&type=1*',
84+
'http://*/?prot=2&file=/*',
85+
'http://api.letv.com/streamblock*',
86+
'http://api.letv.com/mms/out/video/play*',
87+
'http://api.letv.com/mms/out/common/geturl*',
88+
'http://api.letv.com/geturl*',
89+
'http://live.gslb.letv.com/gslb?*',
90+
'http://vdn.apps.cntv.cn/api/get*',
91+
'http://vip.sports.cntv.cn/check.do*',
92+
'http://vip.sports.cntv.cn/play.do*',
93+
'http://vip.sports.cntv.cn/servlets/encryptvideopath.do*',
94+
],
95+
96+
// only for server
97+
[
98+
// for Mobile apps // Video apps
99+
'http://api.3g.youku.com/layout*',
100+
'http://api.3g.youku.com/v3/play/address*',
101+
'http://api.3g.youku.com/openapi-wireless/videos/*/download*',
102+
'http://api.3g.youku.com/videos/*/download*',
103+
'http://api.3g.youku.com/common/v3/play*',
104+
'http://tv.api.3g.youku.com/openapi-wireless/v3/play/address*',
105+
'http://tv.api.3g.youku.com/common/v3/hasadv/play*',
106+
'http://tv.api.3g.youku.com/common/v3/play*',
107+
'http://play.api.3g.youku.com/common/v3/hasadv/play*',
108+
'http://play.api.3g.youku.com/common/v3/play*',
109+
'http://play.api.3g.youku.com/v3/play/address*',
110+
'http://play.api.3g.tudou.com/v*',
111+
'http://tv.api.3g.tudou.com/tv/play?*',
112+
'http://api.3g.tudou.com/*',
113+
'http://api.tv.sohu.com/mobile_user/device/clientconf.json?*',
114+
'http://access.tv.sohu.com/*',
115+
'http://iface2.iqiyi.com/php/xyz/iface/*',
116+
'http://dynamic.app.m.letv.com/*/dynamic.php?*playid*',
117+
'http://dynamic.meizi.app.m.letv.com/*/dynamic.php?*playid*',
118+
'http://listso.m.areainfo.ppstream.com/ip/q.php*',
119+
'http://api.letv.com/getipgeo',
120+
'http://m.letv.com/api/geturl?*',
121+
'http://vv.video.qq.com/getvinfo*',
122+
'http://bkvv.video.qq.com/getvinfo*',
123+
// Music apps
124+
'http://3g.music.qq.com/*',
125+
'http://mqqplayer.3g.qq.com/*',
126+
'http://proxy.music.qq.com/*',
127+
'http://ip2.kugou.com/check/isCn/*',
128+
'http://ip.kugou.com/check/isCn/*',
129+
'http://client.api.ttpod.com/global*',
130+
'http://mobi.kuwo.cn/*',
131+
'http://mobilefeedback.kugou.com/*',
132+
'http://tingapi.ting.baidu.com/v1/restserver/ting?*method=baidu.ting.song*',
133+
'http://serviceinfo.sdk.duomi.com/api/serviceinfo/getserverlist*',
134+
'http://music.163.com/api/copyright/restrict/?*',
135+
'http://music.163.com/api/batch',
136+
'http://spark.api.xiami.com/api?*method=Songs.getTrackDetail*',
137+
// for PC Clients only
138+
'http://iplocation.geo.qiyi.com/cityjson',
139+
'http://sns.video.qq.com/tunnel/fcgi-bin/tunnel*',
140+
'http://v5.pc.duomi.com/single-ajaxsingle-isban*',
141+
'https://openapi.youku.com/*', // see issue #118
142+
'https://61.135.196.99/*', //n-openapi.youku.com
143+
'https://220.181.185.150/*', //zw-openapi.youku.com
144+
'https://httpbin.org/get', // for testing
145+
// for MiBox iCNTV Authentication
146+
'http://tms.is.ysten.com:8080/yst-tms/login.action?*',
147+
// for 3rd party's DNS for Apple TV (see pull request #78)
148+
'http://180.153.225.136/*',
149+
'http://118.244.244.124/*',
150+
'http://210.129.145.150/*',
151+
'http://182.16.230.98/*', //Updated on Jan. 3, for new DNS of apple tv.
152+
]
153+
];
154+
var vurl = url.toLowerCase();
155+
var rules_len = rules.length;
156+
for (var j = 0; j < rules_len; j++) {
157+
var rule_list = rules[j];
158+
var rule_list_len = rule_list.length;
159+
for (var i = 0; i < rule_list_len; i++) {
160+
if (shExpMatch(vurl, rule_list[i])) {
161+
return PROXY;
162+
}
163+
}
164+
}
165+
return 'DIRECT';
166+
}

MobileShadowSocks/zh-Hans.lproj/Localizable.strings

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
"Camera Usage" = "\U76f8\U673a\U7528\U6cd5";
1212
Cancel = "\U53d6\U6d88";
1313
"Cannot parse URL link" = "\U65e0\U6cd5\U89e3\U6790 URL \U94fe\U63a5";
14+
"China Whitelist will bypass websites in China. Unblock Youku will let you visit video sites in China like Youku via ShadowSocks proxy." = "\U4f7f\U7528 China Whitelist \U53ef\U4e0d\U7ecf\U8fc7\U4ee3\U7406\U8bbf\U95ee\U5e38\U7528\U7684\U56fd\U5185\U7f51\U7ad9 (\U9002\U5408\U5883\U5185\U7528\U6237)\U3002\n\U4f7f\U7528 Unblock Youku \U53ef\U7ecf\U8fc7\U5f71\U68ad\U670d\U52a1\U5668\U8bbf\U95ee\U56fd\U5185\U89c6\U9891\U7f51\U7ad9 (\U9002\U5408\U5883\U5916\U7528\U6237)\U3002";
1415
Cipher = "\U52a0\U5bc6\U65b9\U5f0f";
1516
"Copy Link" = "\U62f7\U8d1d\U94fe\U63a5";
1617
"Create New Profile" = "\U65b0\U589e\U914d\U7f6e";
1718
Default = "\U9ed8\U8ba4";
18-
"Default PAC file might only be useful for users in China. Confirm to use it?" = "\U81ea\U5e26 PAC \U4f7f\U7528\U201c\U767d\U540d\U5355\U201d\U6a21\U5f0f\Uff0c\U5883\U5916\U7f51\U7ad9\U5c06\U4f7f\U7528\U4ee3\U7406\U8bbf\U95ee\Uff0c\U786e\U5b9a\U4f7f\U7528\U5417\Uff1f\n\n\U63d0\U793a\Uff1a\U53ef\U5728\U6392\U9664\U5217\U8868\U5185\U8bbe\U7f6e\U4e0d\U4f7f\U7528\U4ee3\U7406\U7684\U57df\U540d\U3002";
1919
Done = "\U5b8c\U6210";
2020
Edit = "\U7f16\U8f91";
2121
"Edit Profile" = "\U7f16\U8f91\U914d\U7f6e";

MobileShadowSocks/zh-Hant.lproj/Localizable.strings

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
"Camera Usage" = "\U76f8\U6a5f\U7528\U6cd5";
1212
Cancel = "\U53d6\U6d88";
1313
"Cannot parse URL link" = "\U7121\U6cd5\U89e3\U6790 URL \U9023\U7d50";
14+
"China Whitelist will bypass websites in China. Unblock Youku will let you visit video sites in China like Youku via ShadowSocks proxy." = "\U4f7f\U7528 China Whitelist \U8a2a\U554f\U5e38\U898b\U5927\U9678\U7db2\U7ad9\U6642\U53ef\U4e0d\U7d93\U904e\U4ee3\U7406 (\U9069\U5408\U5728\U4e2d\U570b\U5927\U9678\U7684\U7528\U6236)\U3002\n\U4f7f\U7528 Unblock Youku \U53ef\U7d93\U904e\U5f71\U68ad\U4f3a\U670d\U5668\U8a2a\U554f\U4e2d\U570b\U5927\U9678\U7684\U8996\U983b\U7db2\U7ad9 (\U9069\U5408\U4e2d\U570b\U5927\U9678\U4ee5\U5916\U7528\U6236)\U3002";
1415
Cipher = "\U52a0\U5bc6\U65b9\U5f0f";
1516
"Copy Link" = "\U62f7\U8c9d\U9023\U7d50";
1617
"Create New Profile" = "\U65b0\U589e\U914d\U7f6e";
1718
Default = "\U9810\U8a2d";
18-
"Default PAC file might only be useful for users in China. Confirm to use it?" = "\U81ea\U5e36 PAC \U4f7f\U7528\U201c\U767d\U540d\U55ae\U201d\U6a21\U5f0f\Uff0c\U4e2d\U570b\U5927\U9678\U4ee5\U5916\U7684\U7db2\U7ad9\U5c07\U4f7f\U7528\U4ee3\U7406\U8a2a\U554f\Uff0c\U78ba\U5b9a\U4f7f\U7528\U55ce\Uff1f\n\n\U63d0\U793a\Uff1a\U53ef\U5728\U6392\U9664\U5217\U8868\U5167\U8a2d\U5b9a\U4e0d\U4f7f\U7528\U4ee3\U7406\U7684\U57df\U540d\U3002";
1919
Done = "\U5b8c\U6210";
2020
Edit = "\U7de8\U8f2f";
2121
"Edit Profile" = "\U7de8\U8f2f\U914d\U7f6e";

shadowsocks-libev

Submodule shadowsocks-libev updated from daae15d to 888a8e1

0 commit comments

Comments
 (0)