Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de9c5ba9cc | ||
|
|
2aae00cf68 | ||
|
|
68be2d34a1 | ||
|
|
7895ccf720 | ||
|
|
e92900dbbd | ||
|
|
eada271c49 |
1
.github/workflows/build.yaml
vendored
1
.github/workflows/build.yaml
vendored
@@ -67,7 +67,6 @@ jobs:
|
||||
- name: Setup Flutter
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version: 3.24.5
|
||||
channel: stable
|
||||
cache: true
|
||||
|
||||
|
||||
24
CHANGELOG.md
24
CHANGELOG.md
@@ -1,3 +1,27 @@
|
||||
## v0.8.79
|
||||
|
||||
- Fix tab delay view issues
|
||||
|
||||
- Fix tray action issues
|
||||
|
||||
- Fix get profile redirect client ua issues
|
||||
|
||||
- Fix proxy card delay view issues
|
||||
|
||||
- Add Russian, Japanese adaptation
|
||||
|
||||
- Fix some issues
|
||||
|
||||
- Update changelog
|
||||
|
||||
## v0.8.78
|
||||
|
||||
- Fix list form input view issues
|
||||
|
||||
- Fix traffic view issues
|
||||
|
||||
- Update changelog
|
||||
|
||||
## v0.8.77
|
||||
|
||||
- Optimize performance
|
||||
|
||||
Binary file not shown.
@@ -28,6 +28,14 @@ import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
func splitByComma(s string) interface{} {
|
||||
parts := strings.Split(s, ",")
|
||||
if len(parts) > 1 {
|
||||
return parts
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
var (
|
||||
isRunning = false
|
||||
runLock sync.Mutex
|
||||
@@ -162,7 +170,17 @@ func decorationConfig(profileId string, cfg config.RawConfig) *config.RawConfig
|
||||
|
||||
func genHosts(hosts, patchHosts map[string]any) {
|
||||
for k, v := range patchHosts {
|
||||
hosts[k] = v
|
||||
if str, ok := v.(string); ok {
|
||||
hosts[k] = splitByComma(str)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func modPatchDns(dns *config.RawDNS) {
|
||||
for pair := dns.NameServerPolicy.Oldest(); pair != nil; pair = pair.Next() {
|
||||
if str, ok := pair.Value.(string); ok {
|
||||
dns.NameServerPolicy.Set(pair.Key, splitByComma(str))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -228,6 +246,7 @@ func overwriteConfig(targetConfig *config.RawConfig, patchConfig config.RawConfi
|
||||
}
|
||||
genHosts(targetConfig.Hosts, patchConfig.Hosts)
|
||||
if configParams.OverrideDns {
|
||||
modPatchDns(&patchConfig.DNS)
|
||||
targetConfig.DNS = patchConfig.DNS
|
||||
} else {
|
||||
if targetConfig.DNS.Enable == false {
|
||||
|
||||
@@ -62,15 +62,15 @@ class ApplicationState extends ConsumerState<Application> {
|
||||
_autoUpdateProfilesTask();
|
||||
globalState.appController = AppController(context, ref);
|
||||
globalState.measure = Measure.of(context);
|
||||
ref.listenManual(themeSettingProvider.select((state) => state.fontFamily),
|
||||
(prev, next) {
|
||||
if (prev != next) {
|
||||
globalState.measure = Measure.of(
|
||||
context,
|
||||
fontFamily: next.value,
|
||||
);
|
||||
}
|
||||
}, fireImmediately: true);
|
||||
// ref.listenManual(themeSettingProvider.select((state) => state.fontFamily),
|
||||
// (prev, next) {
|
||||
// if (prev != next) {
|
||||
// globalState.measure = Measure.of(
|
||||
// context,
|
||||
// fontFamily: next.value,
|
||||
// );
|
||||
// }
|
||||
// }, fireImmediately: true);
|
||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
|
||||
final currentContext = globalState.navigatorKey.currentContext;
|
||||
if (currentContext != null) {
|
||||
@@ -194,7 +194,6 @@ class ApplicationState extends ConsumerState<Application> {
|
||||
themeMode: themeProps.themeMode,
|
||||
theme: ThemeData(
|
||||
useMaterial3: true,
|
||||
fontFamily: themeProps.fontFamily.value,
|
||||
pageTransitionsTheme: _pageTransitionsTheme,
|
||||
colorScheme: _getAppColorScheme(
|
||||
brightness: Brightness.light,
|
||||
@@ -204,13 +203,12 @@ class ApplicationState extends ConsumerState<Application> {
|
||||
),
|
||||
darkTheme: ThemeData(
|
||||
useMaterial3: true,
|
||||
fontFamily: themeProps.fontFamily.value,
|
||||
pageTransitionsTheme: _pageTransitionsTheme,
|
||||
colorScheme: _getAppColorScheme(
|
||||
brightness: Brightness.dark,
|
||||
systemColorSchemes: systemColorSchemes,
|
||||
primaryColor: themeProps.primaryColor,
|
||||
).toPrueBlack(themeProps.prueBlack),
|
||||
).toPureBlack(themeProps.pureBlack),
|
||||
),
|
||||
home: child,
|
||||
);
|
||||
|
||||
@@ -235,12 +235,12 @@ class ClashCore {
|
||||
return int.parse(value);
|
||||
}
|
||||
|
||||
Future<ClashConfig?> getProfile(String id) async {
|
||||
Future<ClashConfigSnippet?> getProfile(String id) async {
|
||||
final res = await clashInterface.getProfile(id);
|
||||
if (res.isEmpty) {
|
||||
return null;
|
||||
}
|
||||
return ClashConfig.fromJson(json.decode(res));
|
||||
return ClashConfigSnippet.fromJson(json.decode(res));
|
||||
}
|
||||
|
||||
resetTraffic() {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
extension ColorExtension on Color {
|
||||
|
||||
Color get toLight {
|
||||
return withOpacity(0.8);
|
||||
}
|
||||
@@ -51,7 +50,7 @@ extension ColorExtension on Color {
|
||||
}
|
||||
|
||||
extension ColorSchemeExtension on ColorScheme {
|
||||
ColorScheme toPrueBlack(bool isPrueBlack) => isPrueBlack
|
||||
ColorScheme toPureBlack(bool isPrueBlack) => isPrueBlack
|
||||
? copyWith(
|
||||
surface: Colors.black,
|
||||
surfaceContainer: surfaceContainer.darken(
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:fl_clash/common/common.dart';
|
||||
|
||||
import '../state.dart';
|
||||
import 'package:fl_clash/state.dart';
|
||||
|
||||
class FlClashHttpOverrides extends HttpOverrides {
|
||||
static String handleFindProxy(Uri url) {
|
||||
if ([localhost].contains(url.host)) {
|
||||
return "DIRECT";
|
||||
}
|
||||
final port = globalState.config.patchClashConfig.mixedPort;
|
||||
final isStart = globalState.appState.runTime != null;
|
||||
commonPrint.log("find $url proxy:$isStart");
|
||||
if (!isStart) return "DIRECT";
|
||||
return "PROXY localhost:$port";
|
||||
}
|
||||
|
||||
@override
|
||||
HttpClient createHttpClient(SecurityContext? context) {
|
||||
final client = super.createHttpClient(context);
|
||||
client.badCertificateCallback = (_, __, ___) => true;
|
||||
client.findProxy = (url) {
|
||||
if ([localhost].contains(url.host)) {
|
||||
return "DIRECT";
|
||||
}
|
||||
final port = globalState.config.patchClashConfig.mixedPort;
|
||||
final isStart = globalState.appState.runTime != null;
|
||||
commonPrint.log("find $url proxy:$isStart");
|
||||
if (!isStart) return "DIRECT";
|
||||
return "PROXY localhost:$port";
|
||||
};
|
||||
client.findProxy = handleFindProxy;
|
||||
return client;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ class Navigation {
|
||||
const NavigationItem(
|
||||
icon: Icon(Icons.space_dashboard),
|
||||
label: PageLabel.dashboard,
|
||||
keep: false,
|
||||
fragment: DashboardFragment(
|
||||
key: GlobalObjectKey(PageLabel.dashboard),
|
||||
),
|
||||
|
||||
@@ -25,7 +25,7 @@ class Render {
|
||||
debouncer.call(
|
||||
DebounceTag.renderPause,
|
||||
_pause,
|
||||
duration: Duration(seconds: 15),
|
||||
duration: Duration(seconds: 5),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'dart:io';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:dio/io.dart';
|
||||
import 'package:fl_clash/common/common.dart';
|
||||
import 'package:fl_clash/models/models.dart';
|
||||
import 'package:fl_clash/state.dart';
|
||||
@@ -10,6 +11,7 @@ import 'package:flutter/cupertino.dart';
|
||||
|
||||
class Request {
|
||||
late final Dio _dio;
|
||||
late final Dio _clashDio;
|
||||
String? userAgent;
|
||||
|
||||
Request() {
|
||||
@@ -20,22 +22,24 @@ class Request {
|
||||
},
|
||||
),
|
||||
);
|
||||
_clashDio = Dio();
|
||||
_clashDio.httpClientAdapter = IOHttpClientAdapter(createHttpClient: () {
|
||||
final client = HttpClient();
|
||||
client.findProxy = (Uri uri) {
|
||||
client.userAgent = globalState.ua;
|
||||
return FlClashHttpOverrides.handleFindProxy(uri);
|
||||
};
|
||||
return client;
|
||||
});
|
||||
}
|
||||
|
||||
Future<Response> getFileResponseForUrl(String url) async {
|
||||
final response = await _dio
|
||||
.get(
|
||||
url,
|
||||
options: Options(
|
||||
headers: {
|
||||
"User-Agent": globalState.ua,
|
||||
},
|
||||
responseType: ResponseType.bytes,
|
||||
),
|
||||
)
|
||||
.timeout(
|
||||
httpTimeoutDuration * 6,
|
||||
);
|
||||
final response = await _clashDio.get(
|
||||
url,
|
||||
options: Options(
|
||||
responseType: ResponseType.bytes,
|
||||
),
|
||||
);
|
||||
return response;
|
||||
}
|
||||
|
||||
@@ -109,9 +113,6 @@ class Request {
|
||||
.get(
|
||||
"http://$localhost:$helperPort/ping",
|
||||
options: Options(
|
||||
headers: {
|
||||
"User-Agent": browserUa,
|
||||
},
|
||||
responseType: ResponseType.plain,
|
||||
),
|
||||
)
|
||||
|
||||
@@ -28,7 +28,9 @@ class AppController {
|
||||
AppController(this.context, WidgetRef ref) : _ref = ref;
|
||||
|
||||
updateClashConfigDebounce() {
|
||||
debouncer.call(DebounceTag.updateClashConfig, updateClashConfig);
|
||||
debouncer.call(DebounceTag.updateClashConfig, () {
|
||||
updateClashConfig(true);
|
||||
});
|
||||
}
|
||||
|
||||
updateGroupsDebounce() {
|
||||
@@ -41,10 +43,12 @@ class AppController {
|
||||
});
|
||||
}
|
||||
|
||||
applyProfileDebounce() {
|
||||
debouncer.call(DebounceTag.addCheckIpNum, () {
|
||||
applyProfile();
|
||||
});
|
||||
applyProfileDebounce({
|
||||
bool silence = false,
|
||||
}) {
|
||||
debouncer.call(DebounceTag.applyProfile, (silence) {
|
||||
applyProfile(silence: silence);
|
||||
}, args: [silence]);
|
||||
}
|
||||
|
||||
savePreferencesDebounce() {
|
||||
@@ -156,18 +160,18 @@ class AppController {
|
||||
.read(profilesProvider.notifier)
|
||||
.setProfile(newProfile.copyWith(isUpdating: false));
|
||||
if (profile.id == _ref.read(currentProfileIdProvider)) {
|
||||
applyProfileDebounce();
|
||||
applyProfileDebounce(silence: true);
|
||||
}
|
||||
}
|
||||
|
||||
_setProfile(Profile profile) {
|
||||
setProfile(Profile profile) {
|
||||
_ref.read(profilesProvider.notifier).setProfile(profile);
|
||||
}
|
||||
|
||||
setProfile(Profile profile) {
|
||||
_setProfile(profile);
|
||||
setProfileAndAutoApply(Profile profile) {
|
||||
_ref.read(profilesProvider.notifier).setProfile(profile);
|
||||
if (profile.id == _ref.read(currentProfileIdProvider)) {
|
||||
applyProfileDebounce();
|
||||
applyProfileDebounce(silence: true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,8 +223,8 @@ class AppController {
|
||||
return currentGroupName;
|
||||
}
|
||||
|
||||
getRealProxyName(proxyName) {
|
||||
return _ref.read(getRealTestUrlProvider(proxyName));
|
||||
ProxyCardState getProxyCardState(proxyName) {
|
||||
return _ref.read(getProxyCardStateProvider(proxyName));
|
||||
}
|
||||
|
||||
getSelectedProxyName(groupName) {
|
||||
@@ -232,7 +236,7 @@ class AppController {
|
||||
if (profile == null || profile.currentGroupName == groupName) {
|
||||
return;
|
||||
}
|
||||
_setProfile(
|
||||
setProfile(
|
||||
profile.copyWith(currentGroupName: groupName),
|
||||
);
|
||||
}
|
||||
@@ -754,13 +758,13 @@ class AppController {
|
||||
updateSystemProxy() {
|
||||
_ref.read(networkSettingProvider.notifier).updateState(
|
||||
(state) => state.copyWith(
|
||||
systemProxy: state.systemProxy,
|
||||
systemProxy: !state.systemProxy,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
updateStart() {
|
||||
updateStatus(_ref.read(runTimeProvider.notifier).isStart);
|
||||
updateStatus(!_ref.read(runTimeProvider.notifier).isStart);
|
||||
}
|
||||
|
||||
updateCurrentSelectedMap(String groupName, String proxyName) {
|
||||
@@ -794,10 +798,10 @@ class AppController {
|
||||
_ref.read(patchClashConfigProvider.notifier).updateState(
|
||||
(state) => state.copyWith(mode: mode),
|
||||
);
|
||||
if (mode == Mode.global) {
|
||||
updateCurrentGroupName(GroupName.GLOBAL.name);
|
||||
}
|
||||
addCheckIpNumDebounce();
|
||||
// if (mode == Mode.global) {
|
||||
// updateCurrentGroupName(GroupName.GLOBAL.name);
|
||||
// }
|
||||
// addCheckIpNumDebounce();
|
||||
}
|
||||
|
||||
updateAutoLaunch() {
|
||||
|
||||
@@ -219,8 +219,6 @@ enum ProxiesIconStyle {
|
||||
}
|
||||
|
||||
enum FontFamily {
|
||||
system(),
|
||||
miSans("MiSans"),
|
||||
twEmoji("Twemoji"),
|
||||
icon("Icons");
|
||||
|
||||
|
||||
@@ -48,6 +48,32 @@ class StatusItem extends ConsumerWidget {
|
||||
}
|
||||
}
|
||||
|
||||
class ListenItem extends ConsumerWidget {
|
||||
const ListenItem({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, ref) {
|
||||
final listen =
|
||||
ref.watch(patchClashConfigProvider.select((state) => state.dns.listen));
|
||||
return ListItem.input(
|
||||
title: Text(appLocalizations.listen),
|
||||
subtitle: Text(listen),
|
||||
delegate: InputDelegate(
|
||||
title: appLocalizations.listen,
|
||||
value: listen,
|
||||
onChanged: (String? value) {
|
||||
if (value == null) {
|
||||
return;
|
||||
}
|
||||
ref
|
||||
.read(patchClashConfigProvider.notifier)
|
||||
.updateState((state) => state.copyWith.dns(listen: value));
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class PreferH3Item extends ConsumerWidget {
|
||||
const PreferH3Item({super.key});
|
||||
|
||||
@@ -596,6 +622,7 @@ class DnsOptions extends StatelessWidget {
|
||||
title: appLocalizations.options,
|
||||
items: [
|
||||
const StatusItem(),
|
||||
const ListenItem(),
|
||||
const UseHostsItem(),
|
||||
const UseSystemHostsItem(),
|
||||
const IPv6Item(),
|
||||
|
||||
@@ -62,12 +62,12 @@ class _MemoryInfoState extends State<MemoryInfo> {
|
||||
onPressed: () {
|
||||
clashCore.requestGc();
|
||||
},
|
||||
child: ValueListenableBuilder(
|
||||
valueListenable: _memoryInfoStateNotifier,
|
||||
builder: (_, trafficValue, __) {
|
||||
return Column(
|
||||
children: [
|
||||
Padding(
|
||||
child: Column(
|
||||
children: [
|
||||
ValueListenableBuilder(
|
||||
valueListenable: _memoryInfoStateNotifier,
|
||||
builder: (_, trafficValue, __) {
|
||||
return Padding(
|
||||
padding: baseInfoEdgeInsets.copyWith(
|
||||
bottom: 0,
|
||||
top: 12,
|
||||
@@ -87,30 +87,30 @@ class _MemoryInfoState extends State<MemoryInfo> {
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
Flexible(
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned.fill(
|
||||
child: WaveView(
|
||||
waveAmplitude: 12.0,
|
||||
waveFrequency: 0.35,
|
||||
waveColor: darkenLighter,
|
||||
),
|
||||
),
|
||||
Positioned.fill(
|
||||
child: WaveView(
|
||||
waveAmplitude: 12.0,
|
||||
waveFrequency: 0.9,
|
||||
waveColor: darken,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
Flexible(
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned.fill(
|
||||
child: WaveView(
|
||||
waveAmplitude: 12.0,
|
||||
waveFrequency: 0.35,
|
||||
waveColor: darkenLighter,
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
},
|
||||
Positioned.fill(
|
||||
child: WaveView(
|
||||
waveAmplitude: 12.0,
|
||||
waveFrequency: 0.9,
|
||||
waveColor: darken,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -59,7 +59,9 @@ class _NetworkDetectionState extends ConsumerState<NetworkDetection> {
|
||||
final isStart = appState.runTime != null;
|
||||
if (_preIsStart == false &&
|
||||
_preIsStart == isStart &&
|
||||
_networkDetectionState.value.ipInfo != null) return;
|
||||
_networkDetectionState.value.ipInfo != null) {
|
||||
return;
|
||||
}
|
||||
_clearSetTimeoutTimer();
|
||||
_networkDetectionState.value = _networkDetectionState.value.copyWith(
|
||||
isTesting: true,
|
||||
|
||||
@@ -11,7 +11,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
class TrafficUsage extends StatelessWidget {
|
||||
const TrafficUsage({super.key});
|
||||
|
||||
Widget getTrafficDataItem(
|
||||
Widget _buildTrafficDataItem(
|
||||
BuildContext context,
|
||||
Icon icon,
|
||||
TrafficValue trafficValue,
|
||||
@@ -189,7 +189,7 @@ class TrafficUsage extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
),
|
||||
getTrafficDataItem(
|
||||
_buildTrafficDataItem(
|
||||
context,
|
||||
Icon(
|
||||
Icons.arrow_upward,
|
||||
@@ -201,7 +201,7 @@ class TrafficUsage extends StatelessWidget {
|
||||
const SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
getTrafficDataItem(
|
||||
_buildTrafficDataItem(
|
||||
context,
|
||||
Icon(
|
||||
Icons.arrow_downward,
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
import 'package:fl_clash/models/models.dart';
|
||||
import 'package:fl_clash/widgets/scaffold.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class CustomProfile extends StatefulWidget {
|
||||
final String profileId;
|
||||
|
||||
const CustomProfile({
|
||||
super.key,
|
||||
required this.profileId,
|
||||
});
|
||||
|
||||
@override
|
||||
State<CustomProfile> createState() => _CustomProfileState();
|
||||
}
|
||||
|
||||
class _CustomProfileState extends State<CustomProfile> {
|
||||
final _currentClashConfigNotifier = ValueNotifier<ClashConfig?>(null);
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_initCurrentClashConfig();
|
||||
}
|
||||
|
||||
_initCurrentClashConfig() async {
|
||||
// final currentProfileId = globalState.config.currentProfileId;
|
||||
// if (currentProfileId == null) {
|
||||
// return;
|
||||
// }
|
||||
// _currentClashConfigNotifier.value =
|
||||
// await clashCore.getProfile(currentProfileId);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return CommonScaffold(
|
||||
body: ValueListenableBuilder(
|
||||
valueListenable: _currentClashConfigNotifier,
|
||||
builder: (_, clashConfig, ___) {
|
||||
if (clashConfig == null) {
|
||||
return Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
}
|
||||
return Column(
|
||||
children: [],
|
||||
);
|
||||
},
|
||||
),
|
||||
title: "自定义",
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -80,9 +80,9 @@ class _EditProfileState extends State<EditProfile> {
|
||||
);
|
||||
}
|
||||
}
|
||||
appController.setProfile(await profile.saveFile(fileData!));
|
||||
appController.setProfileAndAutoApply(await profile.saveFile(fileData!));
|
||||
} else if (!hasUpdate) {
|
||||
appController.setProfile(profile);
|
||||
appController.setProfileAndAutoApply(profile);
|
||||
} else {
|
||||
globalState.homeScaffoldKey.currentState?.loadingRun(
|
||||
() async {
|
||||
|
||||
87
lib/fragments/profiles/gen_profile.dart
Normal file
87
lib/fragments/profiles/gen_profile.dart
Normal file
@@ -0,0 +1,87 @@
|
||||
import 'package:fl_clash/clash/core.dart';
|
||||
import 'package:fl_clash/models/models.dart';
|
||||
import 'package:fl_clash/state.dart';
|
||||
import 'package:fl_clash/widgets/card.dart';
|
||||
import 'package:fl_clash/widgets/scaffold.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class GenProfile extends StatefulWidget {
|
||||
final String profileId;
|
||||
|
||||
const GenProfile({
|
||||
super.key,
|
||||
required this.profileId,
|
||||
});
|
||||
|
||||
@override
|
||||
State<GenProfile> createState() => _GenProfileState();
|
||||
}
|
||||
|
||||
class _GenProfileState extends State<GenProfile> {
|
||||
final _currentClashConfigNotifier = ValueNotifier<ClashConfigSnippet?>(null);
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_initCurrentClashConfig();
|
||||
}
|
||||
|
||||
_initCurrentClashConfig() async {
|
||||
final currentProfileId = globalState.config.currentProfileId;
|
||||
if (currentProfileId == null) {
|
||||
return;
|
||||
}
|
||||
_currentClashConfigNotifier.value =
|
||||
await clashCore.getProfile(currentProfileId);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return CommonScaffold(
|
||||
body: ValueListenableBuilder(
|
||||
valueListenable: _currentClashConfigNotifier,
|
||||
builder: (_, clashConfig, ___) {
|
||||
if (clashConfig == null) {
|
||||
return Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
}
|
||||
return Padding(
|
||||
padding: EdgeInsets.all(16),
|
||||
child: CustomScrollView(
|
||||
slivers: [
|
||||
SliverGrid.builder(
|
||||
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
|
||||
maxCrossAxisExtent: 100,
|
||||
mainAxisExtent: 50,
|
||||
mainAxisSpacing: 8,
|
||||
crossAxisSpacing: 8,
|
||||
),
|
||||
itemCount: clashConfig.proxyGroups.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return CommonCard(
|
||||
onPressed: () {},
|
||||
child: Text(
|
||||
clashConfig.proxyGroups[index].name,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
SliverList.builder(
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
final rule = clashConfig.rule[index];
|
||||
return Text(
|
||||
rule,
|
||||
);
|
||||
},
|
||||
itemCount: clashConfig.rule.length,
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
title: "自定义",
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import 'add_profile.dart';
|
||||
import 'gen_profile.dart';
|
||||
|
||||
class ProfilesFragment extends StatefulWidget {
|
||||
const ProfilesFragment({super.key});
|
||||
@@ -181,10 +182,6 @@ class ProfileItem extends StatelessWidget {
|
||||
await globalState.appController.deleteProfile(profile.id);
|
||||
}
|
||||
|
||||
_handleUpdateProfile() async {
|
||||
await globalState.safeRun<void>(updateProfile);
|
||||
}
|
||||
|
||||
Future updateProfile() async {
|
||||
final appController = globalState.appController;
|
||||
if (profile.type == ProfileType.file) return;
|
||||
@@ -277,14 +274,14 @@ class ProfileItem extends StatelessWidget {
|
||||
}
|
||||
}
|
||||
|
||||
// _handlePushCustomPage(BuildContext context, String id) {
|
||||
// BaseNavigator.push(
|
||||
// context,
|
||||
// CustomProfile(
|
||||
// profileId: id,
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
_handlePushGenProfilePage(BuildContext context, String id) {
|
||||
BaseNavigator.push(
|
||||
context,
|
||||
GenProfile(
|
||||
profileId: id,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -323,7 +320,7 @@ class ProfileItem extends StatelessWidget {
|
||||
icon: Icons.sync_alt_sharp,
|
||||
label: appLocalizations.sync,
|
||||
onPressed: () {
|
||||
_handleUpdateProfile();
|
||||
updateProfile();
|
||||
},
|
||||
),
|
||||
// ActionItemData(
|
||||
@@ -338,7 +335,7 @@ class ProfileItem extends StatelessWidget {
|
||||
// icon: Icons.extension_outlined,
|
||||
// label: "自定义",
|
||||
// onPressed: () {
|
||||
// _handlePushCustomPage(context, profile.id);
|
||||
// _handlePushGenProfilePage(context, profile.id);
|
||||
// },
|
||||
// ),
|
||||
ActionItemData(
|
||||
|
||||
@@ -22,44 +22,52 @@ double getItemHeight(ProxyCardType proxyCardType) {
|
||||
|
||||
proxyDelayTest(Proxy proxy, [String? testUrl]) async {
|
||||
final appController = globalState.appController;
|
||||
final proxyName = appController.getRealProxyName(proxy.name);
|
||||
final url = appController.getRealTestUrl(testUrl);
|
||||
final state = appController.getProxyCardState(proxy.name);
|
||||
final url = state.testUrl.getSafeValue(
|
||||
appController.getRealTestUrl(testUrl),
|
||||
);
|
||||
if (state.proxyName.isEmpty) {
|
||||
return;
|
||||
}
|
||||
appController.setDelay(
|
||||
Delay(
|
||||
url: url,
|
||||
name: proxyName,
|
||||
name: state.proxyName,
|
||||
value: 0,
|
||||
),
|
||||
);
|
||||
appController.setDelay(
|
||||
await clashCore.getDelay(
|
||||
url,
|
||||
proxyName,
|
||||
state.proxyName,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
delayTest(List<Proxy> proxies, [String? testUrl]) async {
|
||||
final appController = globalState.appController;
|
||||
final proxyNames = proxies
|
||||
.map((proxy) => appController.getRealProxyName(proxy.name))
|
||||
.toSet()
|
||||
.toList();
|
||||
|
||||
final url = appController.getRealTestUrl(testUrl);
|
||||
final proxyNames = proxies.map((proxy) => proxy.name).toSet().toList();
|
||||
|
||||
final delayProxies = proxyNames.map<Future>((proxyName) async {
|
||||
final state = appController.getProxyCardState(proxyName);
|
||||
final url = state.testUrl.getSafeValue(
|
||||
appController.getRealTestUrl(testUrl),
|
||||
);
|
||||
final name = state.proxyName;
|
||||
if (name.isEmpty) {
|
||||
return;
|
||||
}
|
||||
appController.setDelay(
|
||||
Delay(
|
||||
url: url,
|
||||
name: proxyName,
|
||||
name: name,
|
||||
value: 0,
|
||||
),
|
||||
);
|
||||
appController.setDelay(
|
||||
await clashCore.getDelay(
|
||||
url,
|
||||
proxyName,
|
||||
name,
|
||||
),
|
||||
);
|
||||
}).toList();
|
||||
|
||||
@@ -108,7 +108,7 @@ class ProxiesTabFragmentState extends ConsumerState<ProxiesTabFragment>
|
||||
|
||||
_tabControllerListener([int? index]) {
|
||||
int? groupIndex = index;
|
||||
if(groupIndex == -1){
|
||||
if (groupIndex == -1) {
|
||||
return;
|
||||
}
|
||||
final appController = globalState.appController;
|
||||
|
||||
@@ -98,7 +98,7 @@ class _ThemeColorsBoxState extends ConsumerState<ThemeColorsBox> {
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
children: [
|
||||
_FontFamilyItem(),
|
||||
// _FontFamilyItem(),
|
||||
_ThemeModeItem(),
|
||||
_PrimaryColorItem(),
|
||||
_PrueBlackItem(),
|
||||
@@ -110,74 +110,74 @@ class _ThemeColorsBoxState extends ConsumerState<ThemeColorsBox> {
|
||||
}
|
||||
}
|
||||
|
||||
class _FontFamilyItem extends ConsumerWidget {
|
||||
const _FontFamilyItem();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final fontFamily =
|
||||
ref.watch(themeSettingProvider.select((state) => state.fontFamily));
|
||||
List<FontFamilyItem> fontFamilyItems = [
|
||||
FontFamilyItem(
|
||||
label: appLocalizations.systemFont,
|
||||
fontFamily: FontFamily.system,
|
||||
),
|
||||
const FontFamilyItem(
|
||||
label: "MiSans",
|
||||
fontFamily: FontFamily.miSans,
|
||||
),
|
||||
];
|
||||
return ItemCard(
|
||||
info: Info(
|
||||
label: appLocalizations.fontFamily,
|
||||
iconData: Icons.text_fields,
|
||||
),
|
||||
child: Container(
|
||||
margin: const EdgeInsets.only(
|
||||
left: 16,
|
||||
right: 16,
|
||||
),
|
||||
height: 48,
|
||||
child: ListView.separated(
|
||||
scrollDirection: Axis.horizontal,
|
||||
itemBuilder: (_, index) {
|
||||
final fontFamilyItem = fontFamilyItems[index];
|
||||
return CommonCard(
|
||||
isSelected: fontFamilyItem.fontFamily == fontFamily,
|
||||
onPressed: () {
|
||||
ref.read(themeSettingProvider.notifier).updateState(
|
||||
(state) => state.copyWith(
|
||||
fontFamily: fontFamilyItem.fontFamily,
|
||||
),
|
||||
);
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Flexible(
|
||||
child: Text(
|
||||
fontFamilyItem.label,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
separatorBuilder: (_, __) {
|
||||
return const SizedBox(
|
||||
width: 16,
|
||||
);
|
||||
},
|
||||
itemCount: fontFamilyItems.length,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
// class _FontFamilyItem extends ConsumerWidget {
|
||||
// const _FontFamilyItem();
|
||||
//
|
||||
// @override
|
||||
// Widget build(BuildContext context, WidgetRef ref) {
|
||||
// final fontFamily =
|
||||
// ref.watch(themeSettingProvider.select((state) => state.fontFamily));
|
||||
// List<FontFamilyItem> fontFamilyItems = [
|
||||
// FontFamilyItem(
|
||||
// label: appLocalizations.systemFont,
|
||||
// fontFamily: FontFamily.system,
|
||||
// ),
|
||||
// const FontFamilyItem(
|
||||
// label: "roboto",
|
||||
// fontFamily: FontFamily.roboto,
|
||||
// ),
|
||||
// ];
|
||||
// return ItemCard(
|
||||
// info: Info(
|
||||
// label: appLocalizations.fontFamily,
|
||||
// iconData: Icons.text_fields,
|
||||
// ),
|
||||
// child: Container(
|
||||
// margin: const EdgeInsets.only(
|
||||
// left: 16,
|
||||
// right: 16,
|
||||
// ),
|
||||
// height: 48,
|
||||
// child: ListView.separated(
|
||||
// scrollDirection: Axis.horizontal,
|
||||
// itemBuilder: (_, index) {
|
||||
// final fontFamilyItem = fontFamilyItems[index];
|
||||
// return CommonCard(
|
||||
// isSelected: fontFamilyItem.fontFamily == fontFamily,
|
||||
// onPressed: () {
|
||||
// ref.read(themeSettingProvider.notifier).updateState(
|
||||
// (state) => state.copyWith(
|
||||
// fontFamily: fontFamilyItem.fontFamily,
|
||||
// ),
|
||||
// );
|
||||
// },
|
||||
// child: Padding(
|
||||
// padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
// child: Row(
|
||||
// mainAxisSize: MainAxisSize.min,
|
||||
// mainAxisAlignment: MainAxisAlignment.start,
|
||||
// children: [
|
||||
// Flexible(
|
||||
// child: Text(
|
||||
// fontFamilyItem.label,
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// },
|
||||
// separatorBuilder: (_, __) {
|
||||
// return const SizedBox(
|
||||
// width: 16,
|
||||
// );
|
||||
// },
|
||||
// itemCount: fontFamilyItems.length,
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
class _ThemeModeItem extends ConsumerWidget {
|
||||
const _ThemeModeItem();
|
||||
@@ -320,7 +320,7 @@ class _PrueBlackItem extends ConsumerWidget {
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final prueBlack =
|
||||
ref.watch(themeSettingProvider.select((state) => state.prueBlack));
|
||||
ref.watch(themeSettingProvider.select((state) => state.pureBlack));
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||
child: ListItem.switchItem(
|
||||
@@ -328,13 +328,13 @@ class _PrueBlackItem extends ConsumerWidget {
|
||||
Icons.contrast,
|
||||
color: context.colorScheme.primary,
|
||||
),
|
||||
title: Text(appLocalizations.prueBlackMode),
|
||||
title: Text(appLocalizations.pureBlackMode),
|
||||
delegate: SwitchDelegate(
|
||||
value: prueBlack,
|
||||
onChanged: (value) {
|
||||
ref.read(themeSettingProvider.notifier).updateState(
|
||||
(state) => state.copyWith(
|
||||
prueBlack: value,
|
||||
pureBlack: value,
|
||||
),
|
||||
);
|
||||
},
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
"other": "Other",
|
||||
"about": "About",
|
||||
"en": "English",
|
||||
"ja": "Japanese",
|
||||
"ru": "Russian",
|
||||
"zh_CN": "Simplified Chinese",
|
||||
"theme": "Theme",
|
||||
"themeDesc": "Set dark mode,adjust the color",
|
||||
@@ -215,12 +217,12 @@
|
||||
"go": "Go",
|
||||
"externalLink": "External link",
|
||||
"otherContributors": "Other contributors",
|
||||
"autoCloseConnections": "Auto lose connections",
|
||||
"autoCloseConnections": "Auto close connections",
|
||||
"autoCloseConnectionsDesc": "Auto close connections after change node",
|
||||
"onlyStatisticsProxy": "Only statistics proxy",
|
||||
"onlyStatisticsProxyDesc": "When turned on, only statistics proxy traffic",
|
||||
"deleteProfileTip": "Sure you want to delete the current profile?",
|
||||
"prueBlackMode": "Prue black mode",
|
||||
"pureBlackMode": "Pure black mode",
|
||||
"keepAliveIntervalDesc": "Tcp keep alive interval",
|
||||
"entries": " entries",
|
||||
"local": "Local",
|
||||
@@ -343,5 +345,6 @@
|
||||
"copyLink": "Copy link",
|
||||
"exportFile": "Export file",
|
||||
"cacheCorrupt": "The cache is corrupt. Do you want to clear it?",
|
||||
"detectionTip": "Relying on third-party api is for reference only"
|
||||
"detectionTip": "Relying on third-party api is for reference only",
|
||||
"listen": "Listen"
|
||||
}
|
||||
350
lib/l10n/arb/intl_ja.arb
Normal file
350
lib/l10n/arb/intl_ja.arb
Normal file
@@ -0,0 +1,350 @@
|
||||
{
|
||||
"rule": "ルール",
|
||||
"global": "グローバル",
|
||||
"direct": "ダイレクト",
|
||||
"dashboard": "ダッシュボード",
|
||||
"proxies": "プロキシ",
|
||||
"profile": "プロファイル",
|
||||
"profiles": "プロファイル一覧",
|
||||
"tools": "ツール",
|
||||
"logs": "ログ",
|
||||
"logsDesc": "ログキャプチャ記録",
|
||||
"resources": "リソース",
|
||||
"resourcesDesc": "外部リソース関連情報",
|
||||
"trafficUsage": "トラフィック使用量",
|
||||
"coreInfo": "コア情報",
|
||||
"nullCoreInfoDesc": "コア情報を取得できません",
|
||||
"networkSpeed": "ネットワーク速度",
|
||||
"outboundMode": "アウトバウンドモード",
|
||||
"networkDetection": "ネットワーク検出",
|
||||
"upload": "アップロード",
|
||||
"download": "ダウンロード",
|
||||
"noProxy": "プロキシなし",
|
||||
"noProxyDesc": "プロファイルを作成するか、有効なプロファイルを追加してください",
|
||||
"nullProfileDesc": "プロファイルがありません。追加してください",
|
||||
"nullLogsDesc": "ログがありません",
|
||||
"settings": "設定",
|
||||
"language": "言語",
|
||||
"defaultText": "デフォルト",
|
||||
"more": "詳細",
|
||||
"other": "その他",
|
||||
"about": "について",
|
||||
"en": "英語",
|
||||
"ja": "日本語",
|
||||
"ru": "ロシア語",
|
||||
"zh_CN": "簡体字中国語",
|
||||
"theme": "テーマ",
|
||||
"themeDesc": "ダークモードの設定、色の調整",
|
||||
"override": "上書き",
|
||||
"overrideDesc": "プロキシ関連設定を上書き",
|
||||
"allowLan": "LANを許可",
|
||||
"allowLanDesc": "LAN経由でのプロキシアクセスを許可",
|
||||
"tun": "TUN",
|
||||
"tunDesc": "管理者モードでのみ有効",
|
||||
"minimizeOnExit": "終了時に最小化",
|
||||
"minimizeOnExitDesc": "システムの終了イベントを変更",
|
||||
"autoLaunch": "自動起動",
|
||||
"autoLaunchDesc": "システムの自動起動に従う",
|
||||
"silentLaunch": "バックグラウンド起動",
|
||||
"silentLaunchDesc": "バックグラウンドで起動",
|
||||
"autoRun": "自動実行",
|
||||
"autoRunDesc": "アプリ起動時に自動実行",
|
||||
"logcat": "ログキャット",
|
||||
"logcatDesc": "無効化するとログエントリを非表示",
|
||||
"autoCheckUpdate": "自動更新チェック",
|
||||
"autoCheckUpdateDesc": "起動時に更新を自動チェック",
|
||||
"accessControl": "アクセス制御",
|
||||
"accessControlDesc": "アプリケーションのプロキシアクセスを設定",
|
||||
"application": "アプリケーション",
|
||||
"applicationDesc": "アプリ関連設定を変更",
|
||||
"edit": "編集",
|
||||
"confirm": "確認",
|
||||
"update": "更新",
|
||||
"add": "追加",
|
||||
"save": "保存",
|
||||
"delete": "削除",
|
||||
"years": "年",
|
||||
"months": "月",
|
||||
"hours": "時間",
|
||||
"days": "日",
|
||||
"minutes": "分",
|
||||
"seconds": "秒",
|
||||
"ago": "前",
|
||||
"just": "たった今",
|
||||
"qrcode": "QRコード",
|
||||
"qrcodeDesc": "QRコードをスキャンしてプロファイルを取得",
|
||||
"url": "URL",
|
||||
"urlDesc": "URL経由でプロファイルを取得",
|
||||
"file": "ファイル",
|
||||
"fileDesc": "プロファイルを直接アップロード",
|
||||
"name": "名前",
|
||||
"profileNameNullValidationDesc": "プロファイル名を入力してください",
|
||||
"profileUrlNullValidationDesc": "プロファイルURLを入力してください",
|
||||
"profileUrlInvalidValidationDesc": "有効なプロファイルURLを入力してください",
|
||||
"autoUpdate": "自動更新",
|
||||
"autoUpdateInterval": "自動更新間隔(分)",
|
||||
"profileAutoUpdateIntervalNullValidationDesc": "自動更新間隔を入力してください",
|
||||
"profileAutoUpdateIntervalInvalidValidationDesc": "有効な間隔形式を入力してください",
|
||||
"themeMode": "テーマモード",
|
||||
"themeColor": "テーマカラー",
|
||||
"preview": "プレビュー",
|
||||
"auto": "自動",
|
||||
"light": "ライト",
|
||||
"dark": "ダーク",
|
||||
"importFromURL": "URLからインポート",
|
||||
"submit": "送信",
|
||||
"doYouWantToPass": "通過させますか?",
|
||||
"create": "作成",
|
||||
"defaultSort": "デフォルト順",
|
||||
"delaySort": "遅延順",
|
||||
"nameSort": "名前順",
|
||||
"pleaseUploadFile": "ファイルをアップロードしてください",
|
||||
"pleaseUploadValidQrcode": "有効なQRコードをアップロードしてください",
|
||||
"blacklistMode": "ブラックリストモード",
|
||||
"whitelistMode": "ホワイトリストモード",
|
||||
"filterSystemApp": "システムアプリを除外",
|
||||
"cancelFilterSystemApp": "システムアプリの除外を解除",
|
||||
"selectAll": "すべて選択",
|
||||
"cancelSelectAll": "全選択解除",
|
||||
"appAccessControl": "アプリアクセス制御",
|
||||
"accessControlAllowDesc": "選択したアプリのみVPNを許可",
|
||||
"accessControlNotAllowDesc": "選択したアプリをVPNから除外",
|
||||
"selected": "選択済み",
|
||||
"unableToUpdateCurrentProfileDesc": "現在のプロファイルを更新できません",
|
||||
"noMoreInfoDesc": "追加情報なし",
|
||||
"profileParseErrorDesc": "プロファイル解析エラー",
|
||||
"proxyPort": "プロキシポート",
|
||||
"proxyPortDesc": "Clashのリスニングポートを設定",
|
||||
"port": "ポート",
|
||||
"logLevel": "ログレベル",
|
||||
"show": "表示",
|
||||
"exit": "終了",
|
||||
"systemProxy": "システムプロキシ",
|
||||
"project": "プロジェクト",
|
||||
"core": "コア",
|
||||
"tabAnimation": "タブアニメーション",
|
||||
"tabAnimationDesc": "有効化するとホームタブに切り替えアニメーションを追加",
|
||||
"desc": "ClashMetaベースのマルチプラットフォームプロキシクライアント。シンプルで使いやすく、オープンソースで広告なし。",
|
||||
"startVpn": "VPNを開始中...",
|
||||
"stopVpn": "VPNを停止中...",
|
||||
"discovery": "新しいバージョンを発見",
|
||||
"compatible": "互換モード",
|
||||
"compatibleDesc": "有効化すると一部機能を失いますが、Clashの完全サポートを獲得",
|
||||
"notSelectedTip": "現在のプロキシグループは選択できません",
|
||||
"tip": "ヒント",
|
||||
"backupAndRecovery": "バックアップと復元",
|
||||
"backupAndRecoveryDesc": "WebDAVまたはファイルでデータを同期",
|
||||
"account": "アカウント",
|
||||
"backup": "バックアップ",
|
||||
"recovery": "復元",
|
||||
"recoveryProfiles": "プロファイルのみ復元",
|
||||
"recoveryAll": "全データ復元",
|
||||
"recoverySuccess": "復元成功",
|
||||
"backupSuccess": "バックアップ成功",
|
||||
"noInfo": "情報なし",
|
||||
"pleaseBindWebDAV": "WebDAVをバインドしてください",
|
||||
"bind": "バインド",
|
||||
"connectivity": "接続性:",
|
||||
"webDAVConfiguration": "WebDAV設定",
|
||||
"address": "アドレス",
|
||||
"addressHelp": "WebDAVサーバーアドレス",
|
||||
"addressTip": "有効なWebDAVアドレスを入力",
|
||||
"password": "パスワード",
|
||||
"passwordTip": "パスワードは必須です",
|
||||
"accountTip": "アカウントは必須です",
|
||||
"checkUpdate": "更新を確認",
|
||||
"discoverNewVersion": "新バージョンを発見",
|
||||
"checkUpdateError": "アプリは最新版です",
|
||||
"goDownload": "ダウンロードへ",
|
||||
"unknown": "不明",
|
||||
"geoData": "地域データ",
|
||||
"externalResources": "外部リソース",
|
||||
"checking": "確認中...",
|
||||
"country": "国",
|
||||
"checkError": "確認エラー",
|
||||
"search": "検索",
|
||||
"allowBypass": "アプリがVPNをバイパスすることを許可",
|
||||
"allowBypassDesc": "有効化すると一部アプリがVPNをバイパス",
|
||||
"externalController": "外部コントローラー",
|
||||
"externalControllerDesc": "有効化するとClashコアをポート9090で制御可能",
|
||||
"ipv6Desc": "有効化するとIPv6トラフィックを受信可能",
|
||||
"app": "アプリ",
|
||||
"general": "一般",
|
||||
"vpnSystemProxyDesc": "HTTPプロキシをVpnServiceに接続",
|
||||
"systemProxyDesc": "HTTPプロキシをVpnServiceに接続",
|
||||
"unifiedDelay": "統一遅延",
|
||||
"unifiedDelayDesc": "ハンドシェイクなどの余分な遅延を削除",
|
||||
"tcpConcurrent": "TCP並列処理",
|
||||
"tcpConcurrentDesc": "TCP並列処理を許可",
|
||||
"geodataLoader": "Geo低メモリモード",
|
||||
"geodataLoaderDesc": "有効化するとGeo低メモリローダーを使用",
|
||||
"requests": "リクエスト",
|
||||
"requestsDesc": "最近のリクエスト記録を表示",
|
||||
"findProcessMode": "プロセス検出",
|
||||
"findProcessModeDesc": "有効化するとフラッシュバックのリスクあり",
|
||||
"init": "初期化",
|
||||
"infiniteTime": "長期有効",
|
||||
"expirationTime": "有効期限",
|
||||
"connections": "接続",
|
||||
"connectionsDesc": "現在の接続データを表示",
|
||||
"nullRequestsDesc": "リクエストなし",
|
||||
"nullConnectionsDesc": "接続なし",
|
||||
"intranetIP": "イントラネットIP",
|
||||
"view": "表示",
|
||||
"cut": "切り取り",
|
||||
"copy": "コピー",
|
||||
"paste": "貼り付け",
|
||||
"testUrl": "URLテスト",
|
||||
"sync": "同期",
|
||||
"exclude": "最近のタスクから非表示",
|
||||
"excludeDesc": "アプリがバックグラウンド時に最近のタスクから非表示",
|
||||
"oneColumn": "1列",
|
||||
"twoColumns": "2列",
|
||||
"threeColumns": "3列",
|
||||
"fourColumns": "4列",
|
||||
"expand": "標準",
|
||||
"shrink": "縮小",
|
||||
"min": "最小化",
|
||||
"tab": "タブ",
|
||||
"list": "リスト",
|
||||
"delay": "遅延",
|
||||
"style": "スタイル",
|
||||
"size": "サイズ",
|
||||
"sort": "並び替え",
|
||||
"columns": "列",
|
||||
"proxiesSetting": "プロキシ設定",
|
||||
"proxyGroup": "プロキシグループ",
|
||||
"go": "移動",
|
||||
"externalLink": "外部リンク",
|
||||
"otherContributors": "その他の貢献者",
|
||||
"autoCloseConnections": "接続を自動閉じる",
|
||||
"autoCloseConnectionsDesc": "ノード変更後に接続を自動閉じる",
|
||||
"onlyStatisticsProxy": "プロキシのみ統計",
|
||||
"onlyStatisticsProxyDesc": "有効化するとプロキシトラフィックのみ統計",
|
||||
"deleteProfileTip": "現在のプロファイルを削除しますか?",
|
||||
"pureBlackMode": "純黒モード",
|
||||
"keepAliveIntervalDesc": "TCPキープアライブ間隔",
|
||||
"entries": " エントリ",
|
||||
"local": "ローカル",
|
||||
"remote": "リモート",
|
||||
"remoteBackupDesc": "WebDAVにデータをバックアップ",
|
||||
"remoteRecoveryDesc": "WebDAVからデータを復元",
|
||||
"localBackupDesc": "ローカルにデータをバックアップ",
|
||||
"localRecoveryDesc": "ファイルからデータを復元",
|
||||
"mode": "モード",
|
||||
"time": "時間",
|
||||
"source": "ソース",
|
||||
"allApps": "全アプリ",
|
||||
"onlyOtherApps": "サードパーティアプリのみ",
|
||||
"action": "アクション",
|
||||
"intelligentSelected": "インテリジェント選択",
|
||||
"clipboardImport": "クリップボードからインポート",
|
||||
"clipboardExport": "クリップボードにエクスポート",
|
||||
"layout": "レイアウト",
|
||||
"tight": "密",
|
||||
"standard": "標準",
|
||||
"loose": "疎",
|
||||
"profilesSort": "プロファイルの並び替え",
|
||||
"start": "開始",
|
||||
"stop": "停止",
|
||||
"appDesc": "アプリ関連設定の処理",
|
||||
"vpnDesc": "VPN関連設定の変更",
|
||||
"generalDesc": "一般設定の上書き",
|
||||
"dnsDesc": "DNS関連設定の更新",
|
||||
"key": "キー",
|
||||
"value": "値",
|
||||
"notEmpty": "空欄不可",
|
||||
"hostsDesc": "ホストを追加",
|
||||
"vpnTip": "変更はVPN再起動後に有効",
|
||||
"vpnEnableDesc": "VpnService経由で全システムトラフィックをルーティング",
|
||||
"options": "オプション",
|
||||
"loopback": "ループバック解除ツール",
|
||||
"loopbackDesc": "UWPループバック解除用",
|
||||
"providers": "プロバイダー",
|
||||
"proxyProviders": "プロキシプロバイダー",
|
||||
"ruleProviders": "ルールプロバイダー",
|
||||
"overrideDns": "DNS上書き",
|
||||
"overrideDnsDesc": "有効化するとプロファイルのDNS設定を上書き",
|
||||
"status": "ステータス",
|
||||
"statusDesc": "無効時はシステムDNSを使用",
|
||||
"preferH3Desc": "DOHのHTTP/3を優先使用",
|
||||
"respectRules": "ルール尊重",
|
||||
"respectRulesDesc": "DNS接続がルールに従う(proxy-server-nameserverの設定が必要)",
|
||||
"dnsMode": "DNSモード",
|
||||
"fakeipRange": "Fakeip範囲",
|
||||
"fakeipFilter": "Fakeipフィルター",
|
||||
"defaultNameserver": "デフォルトネームサーバー",
|
||||
"defaultNameserverDesc": "DNSサーバーの解決用",
|
||||
"nameserver": "ネームサーバー",
|
||||
"nameserverDesc": "ドメイン解決用",
|
||||
"useHosts": "ホストを使用",
|
||||
"useSystemHosts": "システムホストを使用",
|
||||
"nameserverPolicy": "ネームサーバーポリシー",
|
||||
"nameserverPolicyDesc": "対応するネームサーバーポリシーを指定",
|
||||
"proxyNameserver": "プロキシネームサーバー",
|
||||
"proxyNameserverDesc": "プロキシノード解決用ドメイン",
|
||||
"fallback": "フォールバック",
|
||||
"fallbackDesc": "通常はオフショアDNSを使用",
|
||||
"fallbackFilter": "フォールバックフィルター",
|
||||
"geoipCode": "GeoIPコード",
|
||||
"ipcidr": "IPCIDR",
|
||||
"domain": "ドメイン",
|
||||
"reset": "リセット",
|
||||
"action_view": "表示/非表示",
|
||||
"action_start": "開始/停止",
|
||||
"action_mode": "モード切替",
|
||||
"action_proxy": "システムプロキシ",
|
||||
"action_tun": "TUN",
|
||||
"disclaimer": "免責事項",
|
||||
"disclaimerDesc": "本ソフトウェアは学習交流や科学研究などの非営利目的でのみ使用されます。商用利用は厳禁です。いかなる商用活動も本ソフトウェアとは無関係です。",
|
||||
"agree": "同意",
|
||||
"hotkeyManagement": "ホットキー管理",
|
||||
"hotkeyManagementDesc": "キーボードでアプリを制御",
|
||||
"pressKeyboard": "キーボードを押してください",
|
||||
"inputCorrectHotkey": "正しいホットキーを入力",
|
||||
"hotkeyConflict": "ホットキー競合",
|
||||
"remove": "削除",
|
||||
"noHotKey": "ホットキーなし",
|
||||
"noNetwork": "ネットワークなし",
|
||||
"ipv6InboundDesc": "IPv6インバウンドを許可",
|
||||
"exportLogs": "ログをエクスポート",
|
||||
"exportSuccess": "エクスポート成功",
|
||||
"iconStyle": "アイコンスタイル",
|
||||
"onlyIcon": "アイコンのみ",
|
||||
"noIcon": "なし",
|
||||
"stackMode": "スタックモード",
|
||||
"network": "ネットワーク",
|
||||
"networkDesc": "ネットワーク関連設定の変更",
|
||||
"bypassDomain": "バイパスドメイン",
|
||||
"bypassDomainDesc": "システムプロキシ有効時のみ適用",
|
||||
"resetTip": "リセットを確定",
|
||||
"regExp": "正規表現",
|
||||
"icon": "アイコン",
|
||||
"iconConfiguration": "アイコン設定",
|
||||
"noData": "データなし",
|
||||
"adminAutoLaunch": "管理者自動起動",
|
||||
"adminAutoLaunchDesc": "管理者モードで起動",
|
||||
"fontFamily": "フォントファミリー",
|
||||
"systemFont": "システムフォント",
|
||||
"toggle": "トグル",
|
||||
"system": "システム",
|
||||
"routeMode": "ルートモード",
|
||||
"routeMode_bypassPrivate": "プライベートルートをバイパス",
|
||||
"routeMode_config": "設定を使用",
|
||||
"routeAddress": "ルートアドレス",
|
||||
"routeAddressDesc": "ルートアドレスを設定",
|
||||
"pleaseInputAdminPassword": "管理者パスワードを入力",
|
||||
"copyEnvVar": "環境変数をコピー",
|
||||
"memoryInfo": "メモリ情報",
|
||||
"cancel": "キャンセル",
|
||||
"fileIsUpdate": "ファイルが変更されました。保存しますか?",
|
||||
"profileHasUpdate": "プロファイルが変更されました。自動更新を無効化しますか?",
|
||||
"hasCacheChange": "変更をキャッシュしますか?",
|
||||
"nullProxies": "プロキシなし",
|
||||
"copySuccess": "コピー成功",
|
||||
"copyLink": "リンクをコピー",
|
||||
"exportFile": "ファイルをエクスポート",
|
||||
"cacheCorrupt": "キャッシュが破損しています。クリアしますか?",
|
||||
"detectionTip": "サードパーティAPIに依存(参考値)",
|
||||
"listen": "リスン"
|
||||
}
|
||||
350
lib/l10n/arb/intl_ru.arb
Normal file
350
lib/l10n/arb/intl_ru.arb
Normal file
@@ -0,0 +1,350 @@
|
||||
{
|
||||
"rule": "Правило",
|
||||
"global": "Глобальный",
|
||||
"direct": "Прямой",
|
||||
"dashboard": "Панель управления",
|
||||
"proxies": "Прокси",
|
||||
"profile": "Профиль",
|
||||
"profiles": "Профили",
|
||||
"tools": "Инструменты",
|
||||
"logs": "Логи",
|
||||
"logsDesc": "Записи захвата логов",
|
||||
"resources": "Ресурсы",
|
||||
"resourcesDesc": "Информация, связанная с внешними ресурсами",
|
||||
"trafficUsage": "Использование трафика",
|
||||
"coreInfo": "Информация о ядре",
|
||||
"nullCoreInfoDesc": "Не удалось получить информацию о ядре",
|
||||
"networkSpeed": "Скорость сети",
|
||||
"outboundMode": "Режим исходящего трафика",
|
||||
"networkDetection": "Обнаружение сети",
|
||||
"upload": "Загрузка",
|
||||
"download": "Скачивание",
|
||||
"noProxy": "Нет прокси",
|
||||
"noProxyDesc": "Пожалуйста, создайте профиль или добавьте действительный профиль",
|
||||
"nullProfileDesc": "Нет профиля, пожалуйста, добавьте профиль",
|
||||
"nullLogsDesc": "Нет логов",
|
||||
"settings": "Настройки",
|
||||
"language": "Язык",
|
||||
"defaultText": "По умолчанию",
|
||||
"more": "Еще",
|
||||
"other": "Другое",
|
||||
"about": "О программе",
|
||||
"en": "Английский",
|
||||
"ja": "Японский",
|
||||
"ru": "Русский",
|
||||
"zh_CN": "Упрощенный китайский",
|
||||
"theme": "Тема",
|
||||
"themeDesc": "Установить темный режим, настроить цвет",
|
||||
"override": "Переопределить",
|
||||
"overrideDesc": "Переопределить конфигурацию, связанную с прокси",
|
||||
"allowLan": "Разрешить LAN",
|
||||
"allowLanDesc": "Разрешить доступ к прокси через локальную сеть",
|
||||
"tun": "TUN",
|
||||
"tunDesc": "действительно только в режиме администратора",
|
||||
"minimizeOnExit": "Свернуть при выходе",
|
||||
"minimizeOnExitDesc": "Изменить стандартное событие выхода из системы",
|
||||
"autoLaunch": "Автозапуск",
|
||||
"autoLaunchDesc": "Следовать автозапуску системы",
|
||||
"silentLaunch": "Тихий запуск",
|
||||
"silentLaunchDesc": "Запуск в фоновом режиме",
|
||||
"autoRun": "Автозапуск",
|
||||
"autoRunDesc": "Автоматический запуск при открытии приложения",
|
||||
"logcat": "Logcat",
|
||||
"logcatDesc": "Отключение скроет запись логов",
|
||||
"autoCheckUpdate": "Автопроверка обновлений",
|
||||
"autoCheckUpdateDesc": "Автоматически проверять обновления при запуске приложения",
|
||||
"accessControl": "Контроль доступа",
|
||||
"accessControlDesc": "Настройка доступа приложений к прокси",
|
||||
"application": "Приложение",
|
||||
"applicationDesc": "Изменение настроек, связанных с приложением",
|
||||
"edit": "Редактировать",
|
||||
"confirm": "Подтвердить",
|
||||
"update": "Обновить",
|
||||
"add": "Добавить",
|
||||
"save": "Сохранить",
|
||||
"delete": "Удалить",
|
||||
"years": "Лет",
|
||||
"months": "Месяцев",
|
||||
"hours": "Часов",
|
||||
"days": "Дней",
|
||||
"minutes": "Минут",
|
||||
"seconds": "Секунд",
|
||||
"ago": " назад",
|
||||
"just": "Только что",
|
||||
"qrcode": "QR-код",
|
||||
"qrcodeDesc": "Сканируйте QR-код для получения профиля",
|
||||
"url": "URL",
|
||||
"urlDesc": "Получить профиль через URL",
|
||||
"file": "Файл",
|
||||
"fileDesc": "Прямая загрузка профиля",
|
||||
"name": "Имя",
|
||||
"profileNameNullValidationDesc": "Пожалуйста, введите имя профиля",
|
||||
"profileUrlNullValidationDesc": "Пожалуйста, введите URL профиля",
|
||||
"profileUrlInvalidValidationDesc": "Пожалуйста, введите действительный URL профиля",
|
||||
"autoUpdate": "Автообновление",
|
||||
"autoUpdateInterval": "Интервал автообновления (минуты)",
|
||||
"profileAutoUpdateIntervalNullValidationDesc": "Пожалуйста, введите интервал времени для автообновления",
|
||||
"profileAutoUpdateIntervalInvalidValidationDesc": "Пожалуйста, введите действительный формат интервала времени",
|
||||
"themeMode": "Режим темы",
|
||||
"themeColor": "Цвет темы",
|
||||
"preview": "Предпросмотр",
|
||||
"auto": "Авто",
|
||||
"light": "Светлый",
|
||||
"dark": "Темный",
|
||||
"importFromURL": "Импорт из URL",
|
||||
"submit": "Отправить",
|
||||
"doYouWantToPass": "Вы хотите пропустить",
|
||||
"create": "Создать",
|
||||
"defaultSort": "Сортировка по умолчанию",
|
||||
"delaySort": "Сортировка по задержке",
|
||||
"nameSort": "Сортировка по имени",
|
||||
"pleaseUploadFile": "Пожалуйста, загрузите файл",
|
||||
"pleaseUploadValidQrcode": "Пожалуйста, загрузите действительный QR-код",
|
||||
"blacklistMode": "Режим черного списка",
|
||||
"whitelistMode": "Режим белого списка",
|
||||
"filterSystemApp": "Фильтровать системные приложения",
|
||||
"cancelFilterSystemApp": "Отменить фильтрацию системных приложений",
|
||||
"selectAll": "Выбрать все",
|
||||
"cancelSelectAll": "Отменить выбор всего",
|
||||
"appAccessControl": "Контроль доступа приложений",
|
||||
"accessControlAllowDesc": "Разрешить только выбранным приложениям доступ к VPN",
|
||||
"accessControlNotAllowDesc": "Выбранные приложения будут исключены из VPN",
|
||||
"selected": "Выбрано",
|
||||
"unableToUpdateCurrentProfileDesc": "невозможно обновить текущий профиль",
|
||||
"noMoreInfoDesc": "Нет дополнительной информации",
|
||||
"profileParseErrorDesc": "ошибка разбора профиля",
|
||||
"proxyPort": "Порт прокси",
|
||||
"proxyPortDesc": "Установить порт прослушивания Clash",
|
||||
"port": "Порт",
|
||||
"logLevel": "Уровень логов",
|
||||
"show": "Показать",
|
||||
"exit": "Выход",
|
||||
"systemProxy": "Системный прокси",
|
||||
"project": "Проект",
|
||||
"core": "Ядро",
|
||||
"tabAnimation": "Анимация вкладок",
|
||||
"tabAnimationDesc": "При включении домашняя вкладка добавит анимацию переключения",
|
||||
"desc": "Многоплатформенный прокси-клиент на основе ClashMeta, простой и удобный в использовании, с открытым исходным кодом и без рекламы.",
|
||||
"startVpn": "Запуск VPN...",
|
||||
"stopVpn": "Остановка VPN...",
|
||||
"discovery": "Обнаружена новая версия",
|
||||
"compatible": "Режим совместимости",
|
||||
"compatibleDesc": "Включение приведет к потере части функциональности приложения, но обеспечит полную поддержку Clash.",
|
||||
"notSelectedTip": "Текущая группа прокси не может быть выбрана.",
|
||||
"tip": "подсказка",
|
||||
"backupAndRecovery": "Резервное копирование и восстановление",
|
||||
"backupAndRecoveryDesc": "Синхронизация данных через WebDAV или файл",
|
||||
"account": "Аккаунт",
|
||||
"backup": "Резервное копирование",
|
||||
"recovery": "Восстановление",
|
||||
"recoveryProfiles": "Только восстановление профилей",
|
||||
"recoveryAll": "Восстановить все данные",
|
||||
"recoverySuccess": "Восстановление успешно",
|
||||
"backupSuccess": "Резервное копирование успешно",
|
||||
"noInfo": "Нет информации",
|
||||
"pleaseBindWebDAV": "Пожалуйста, привяжите WebDAV",
|
||||
"bind": "Привязать",
|
||||
"connectivity": "Связь:",
|
||||
"webDAVConfiguration": "Конфигурация WebDAV",
|
||||
"address": "Адрес",
|
||||
"addressHelp": "Адрес сервера WebDAV",
|
||||
"addressTip": "Пожалуйста, введите действительный адрес WebDAV",
|
||||
"password": "Пароль",
|
||||
"passwordTip": "Пароль не может быть пустым",
|
||||
"accountTip": "Аккаунт не может быть пустым",
|
||||
"checkUpdate": "Проверить обновления",
|
||||
"discoverNewVersion": "Обнаружена новая версия",
|
||||
"checkUpdateError": "Текущее приложение уже является последней версией",
|
||||
"goDownload": "Перейти к загрузке",
|
||||
"unknown": "Неизвестно",
|
||||
"geoData": "Геоданные",
|
||||
"externalResources": "Внешние ресурсы",
|
||||
"checking": "Проверка...",
|
||||
"country": "Страна",
|
||||
"checkError": "Ошибка проверки",
|
||||
"search": "Поиск",
|
||||
"allowBypass": "Разрешить приложениям обходить VPN",
|
||||
"allowBypassDesc": "Некоторые приложения могут обходить VPN при включении",
|
||||
"externalController": "Внешний контроллер",
|
||||
"externalControllerDesc": "При включении ядро Clash можно контролировать на порту 9090",
|
||||
"ipv6Desc": "При включении будет возможно получать IPv6 трафик",
|
||||
"app": "Приложение",
|
||||
"general": "Общие",
|
||||
"vpnSystemProxyDesc": "Прикрепить HTTP-прокси к VpnService",
|
||||
"systemProxyDesc": "Прикрепить HTTP-прокси к VpnService",
|
||||
"unifiedDelay": "Унифицированная задержка",
|
||||
"unifiedDelayDesc": "Убрать дополнительные задержки, такие как рукопожатие",
|
||||
"tcpConcurrent": "TCP параллелизм",
|
||||
"tcpConcurrentDesc": "Включение позволит использовать параллелизм TCP",
|
||||
"geodataLoader": "Режим низкого потребления памяти для геоданных",
|
||||
"geodataLoaderDesc": "Включение будет использовать загрузчик геоданных с низким потреблением памяти",
|
||||
"requests": "Запросы",
|
||||
"requestsDesc": "Просмотр последних записей запросов",
|
||||
"findProcessMode": "Режим поиска процесса",
|
||||
"findProcessModeDesc": "Есть риск сбоя после включения",
|
||||
"init": "Инициализация",
|
||||
"infiniteTime": "Долгосрочное действие",
|
||||
"expirationTime": "Время истечения",
|
||||
"connections": "Соединения",
|
||||
"connectionsDesc": "Просмотр текущих данных о соединениях",
|
||||
"nullRequestsDesc": "Нет запросов",
|
||||
"nullConnectionsDesc": "Нет соединений",
|
||||
"intranetIP": "Внутренний IP",
|
||||
"view": "Просмотр",
|
||||
"cut": "Вырезать",
|
||||
"copy": "Копировать",
|
||||
"paste": "Вставить",
|
||||
"testUrl": "Тест URL",
|
||||
"sync": "Синхронизация",
|
||||
"exclude": "Скрыть из последних задач",
|
||||
"excludeDesc": "Когда приложение находится в фоновом режиме, оно скрыто из последних задач",
|
||||
"oneColumn": "Один столбец",
|
||||
"twoColumns": "Два столбца",
|
||||
"threeColumns": "Три столбца",
|
||||
"fourColumns": "Четыре столбца",
|
||||
"expand": "Стандартный",
|
||||
"shrink": "Сжать",
|
||||
"min": "Мин",
|
||||
"tab": "Вкладка",
|
||||
"list": "Список",
|
||||
"delay": "Задержка",
|
||||
"style": "Стиль",
|
||||
"size": "Размер",
|
||||
"sort": "Сортировка",
|
||||
"columns": "Столбцы",
|
||||
"proxiesSetting": "Настройка прокси",
|
||||
"proxyGroup": "Группа прокси",
|
||||
"go": "Перейти",
|
||||
"externalLink": "Внешняя ссылка",
|
||||
"otherContributors": "Другие участники",
|
||||
"autoCloseConnections": "Автоматическое закрытие соединений",
|
||||
"autoCloseConnectionsDesc": "Автоматически закрывать соединения после смены узла",
|
||||
"onlyStatisticsProxy": "Только статистика прокси",
|
||||
"onlyStatisticsProxyDesc": "При включении будет учитываться только трафик прокси",
|
||||
"deleteProfileTip": "Вы уверены, что хотите удалить текущий профиль?",
|
||||
"pureBlackMode": "Чисто черный режим",
|
||||
"keepAliveIntervalDesc": "Интервал поддержания TCP-соединения",
|
||||
"entries": " записей",
|
||||
"local": "Локальный",
|
||||
"remote": "Удаленный",
|
||||
"remoteBackupDesc": "Резервное копирование локальных данных на WebDAV",
|
||||
"remoteRecoveryDesc": "Восстановление данных с WebDAV",
|
||||
"localBackupDesc": "Резервное копирование локальных данных на локальный диск",
|
||||
"localRecoveryDesc": "Восстановление данных из файла",
|
||||
"mode": "Режим",
|
||||
"time": "Время",
|
||||
"source": "Источник",
|
||||
"allApps": "Все приложения",
|
||||
"onlyOtherApps": "Только сторонние приложения",
|
||||
"action": "Действие",
|
||||
"intelligentSelected": "Интеллектуальный выбор",
|
||||
"clipboardImport": "Импорт из буфера обмена",
|
||||
"clipboardExport": "Экспорт в буфер обмена",
|
||||
"layout": "Макет",
|
||||
"tight": "Плотный",
|
||||
"standard": "Стандартный",
|
||||
"loose": "Свободный",
|
||||
"profilesSort": "Сортировка профилей",
|
||||
"start": "Старт",
|
||||
"stop": "Стоп",
|
||||
"appDesc": "Обработка настроек, связанных с приложением",
|
||||
"vpnDesc": "Изменение настроек, связанных с VPN",
|
||||
"generalDesc": "Переопределение общих настроек",
|
||||
"dnsDesc": "Обновление настроек, связанных с DNS",
|
||||
"key": "Ключ",
|
||||
"value": "Значение",
|
||||
"notEmpty": "Не может быть пустым",
|
||||
"hostsDesc": "Добавить Hosts",
|
||||
"vpnTip": "Изменения вступят в силу после перезапуска VPN",
|
||||
"vpnEnableDesc": "Автоматически направляет весь системный трафик через VpnService",
|
||||
"options": "Опции",
|
||||
"loopback": "Инструмент разблокировки Loopback",
|
||||
"loopbackDesc": "Используется для разблокировки Loopback UWP",
|
||||
"providers": "Провайдеры",
|
||||
"proxyProviders": "Провайдеры прокси",
|
||||
"ruleProviders": "Провайдеры правил",
|
||||
"overrideDns": "Переопределить DNS",
|
||||
"overrideDnsDesc": "Включение переопределит настройки DNS в профиле",
|
||||
"status": "Статус",
|
||||
"statusDesc": "Системный DNS будет использоваться при выключении",
|
||||
"preferH3Desc": "Приоритетное использование HTTP/3 для DOH",
|
||||
"respectRules": "Соблюдение правил",
|
||||
"respectRulesDesc": "DNS-соединение следует правилам, необходимо настроить proxy-server-nameserver",
|
||||
"dnsMode": "Режим DNS",
|
||||
"fakeipRange": "Диапазон Fakeip",
|
||||
"fakeipFilter": "Фильтр Fakeip",
|
||||
"defaultNameserver": "Сервер имен по умолчанию",
|
||||
"defaultNameserverDesc": "Для разрешения DNS-сервера",
|
||||
"nameserver": "Сервер имен",
|
||||
"nameserverDesc": "Для разрешения домена",
|
||||
"useHosts": "Использовать hosts",
|
||||
"useSystemHosts": "Использовать системные hosts",
|
||||
"nameserverPolicy": "Политика сервера имен",
|
||||
"nameserverPolicyDesc": "Указать соответствующую политику сервера имен",
|
||||
"proxyNameserver": "Прокси-сервер имен",
|
||||
"proxyNameserverDesc": "Домен для разрешения прокси-узлов",
|
||||
"fallback": "Резервный",
|
||||
"fallbackDesc": "Обычно используется оффшорный DNS",
|
||||
"fallbackFilter": "Фильтр резервного DNS",
|
||||
"geoipCode": "Код Geoip",
|
||||
"ipcidr": "IPCIDR",
|
||||
"domain": "Домен",
|
||||
"reset": "Сброс",
|
||||
"action_view": "Показать/Скрыть",
|
||||
"action_start": "Старт/Стоп",
|
||||
"action_mode": "Переключить режим",
|
||||
"action_proxy": "Системный прокси",
|
||||
"action_tun": "TUN",
|
||||
"disclaimer": "Отказ от ответственности",
|
||||
"disclaimerDesc": "Это программное обеспечение используется только в некоммерческих целях, таких как учебные обмены и научные исследования. Запрещено использовать это программное обеспечение в коммерческих целях. Любая коммерческая деятельность, если таковая имеется, не имеет отношения к этому программному обеспечению.",
|
||||
"agree": "Согласен",
|
||||
"hotkeyManagement": "Управление горячими клавишами",
|
||||
"hotkeyManagementDesc": "Использование клавиатуры для управления приложением",
|
||||
"pressKeyboard": "Пожалуйста, нажмите клавишу.",
|
||||
"inputCorrectHotkey": "Пожалуйста, введите правильную горячую клавишу",
|
||||
"hotkeyConflict": "Конфликт горячих клавиш",
|
||||
"remove": "Удалить",
|
||||
"noHotKey": "Нет горячей клавиши",
|
||||
"noNetwork": "Нет сети",
|
||||
"ipv6InboundDesc": "Разрешить входящий IPv6",
|
||||
"exportLogs": "Экспорт логов",
|
||||
"exportSuccess": "Экспорт успешен",
|
||||
"iconStyle": "Стиль иконки",
|
||||
"onlyIcon": "Только иконка",
|
||||
"noIcon": "Нет иконки",
|
||||
"stackMode": "Режим стека",
|
||||
"network": "Сеть",
|
||||
"networkDesc": "Изменение настроек, связанных с сетью",
|
||||
"bypassDomain": "Обход домена",
|
||||
"bypassDomainDesc": "Действует только при включенном системном прокси",
|
||||
"resetTip": "Убедитесь, что хотите сбросить",
|
||||
"regExp": "Регулярное выражение",
|
||||
"icon": "Иконка",
|
||||
"iconConfiguration": "Конфигурация иконки",
|
||||
"noData": "Нет данных",
|
||||
"adminAutoLaunch": "Автозапуск с правами администратора",
|
||||
"adminAutoLaunchDesc": "Запуск с правами администратора при загрузке системы",
|
||||
"fontFamily": "Семейство шрифтов",
|
||||
"systemFont": "Системный шрифт",
|
||||
"toggle": "Переключить",
|
||||
"system": "Система",
|
||||
"routeMode": "Режим маршрутизации",
|
||||
"routeMode_bypassPrivate": "Обход частных адресов маршрутизации",
|
||||
"routeMode_config": "Использовать конфигурацию",
|
||||
"routeAddress": "Адрес маршрутизации",
|
||||
"routeAddressDesc": "Настройка адреса прослушивания маршрутизации",
|
||||
"pleaseInputAdminPassword": "Пожалуйста, введите пароль администратора",
|
||||
"copyEnvVar": "Копирование переменных окружения",
|
||||
"memoryInfo": "Информация о памяти",
|
||||
"cancel": "Отмена",
|
||||
"fileIsUpdate": "Файл был изменен. Хотите сохранить изменения?",
|
||||
"profileHasUpdate": "Профиль был изменен. Хотите отключить автообновление?",
|
||||
"hasCacheChange": "Хотите сохранить изменения в кэше?",
|
||||
"nullProxies": "Нет прокси",
|
||||
"copySuccess": "Копирование успешно",
|
||||
"copyLink": "Копировать ссылку",
|
||||
"exportFile": "Экспорт файла",
|
||||
"cacheCorrupt": "Кэш поврежден. Хотите очистить его?",
|
||||
"detectionTip": "Опирается на сторонний API, только для справки",
|
||||
"listen": "Слушать"
|
||||
}
|
||||
@@ -30,6 +30,8 @@
|
||||
"other": "其他",
|
||||
"about": "关于",
|
||||
"en": "英语",
|
||||
"ja": "日语",
|
||||
"ru": "俄语",
|
||||
"zh_CN": "中文简体",
|
||||
"theme": "主题",
|
||||
"themeDesc": "设置深色模式,调整色彩",
|
||||
@@ -220,7 +222,7 @@
|
||||
"onlyStatisticsProxy": "仅统计代理",
|
||||
"onlyStatisticsProxyDesc": "开启后,将只统计代理流量",
|
||||
"deleteProfileTip": "确定要删除当前配置吗?",
|
||||
"prueBlackMode": "纯黑模式",
|
||||
"pureBlackMode": "纯黑模式",
|
||||
"keepAliveIntervalDesc": "TCP保持活动间隔",
|
||||
"entries": "个条目",
|
||||
"local": "本地",
|
||||
@@ -343,5 +345,6 @@
|
||||
"copyLink": "复制链接",
|
||||
"exportFile": "导出文件",
|
||||
"cacheCorrupt": "缓存已损坏,是否清空?",
|
||||
"detectionTip": "依赖第三方api仅供参考"
|
||||
"detectionTip": "依赖第三方api,仅供参考",
|
||||
"listen": "监听"
|
||||
}
|
||||
|
||||
@@ -17,11 +17,15 @@ import 'package:intl/message_lookup_by_library.dart';
|
||||
import 'package:intl/src/intl_helpers.dart';
|
||||
|
||||
import 'messages_en.dart' as messages_en;
|
||||
import 'messages_ja.dart' as messages_ja;
|
||||
import 'messages_ru.dart' as messages_ru;
|
||||
import 'messages_zh_CN.dart' as messages_zh_cn;
|
||||
|
||||
typedef Future<dynamic> LibraryLoader();
|
||||
Map<String, LibraryLoader> _deferredLibraries = {
|
||||
'en': () => new SynchronousFuture(null),
|
||||
'ja': () => new SynchronousFuture(null),
|
||||
'ru': () => new SynchronousFuture(null),
|
||||
'zh_CN': () => new SynchronousFuture(null),
|
||||
};
|
||||
|
||||
@@ -29,6 +33,10 @@ MessageLookupByLibrary? _findExact(String localeName) {
|
||||
switch (localeName) {
|
||||
case 'en':
|
||||
return messages_en.messages;
|
||||
case 'ja':
|
||||
return messages_ja.messages;
|
||||
case 'ru':
|
||||
return messages_ru.messages;
|
||||
case 'zh_CN':
|
||||
return messages_zh_cn.messages;
|
||||
default:
|
||||
|
||||
@@ -89,7 +89,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||
"Auto check for updates when the app starts",
|
||||
),
|
||||
"autoCloseConnections": MessageLookupByLibrary.simpleMessage(
|
||||
"Auto lose connections",
|
||||
"Auto close connections",
|
||||
),
|
||||
"autoCloseConnectionsDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Auto close connections after change node",
|
||||
@@ -296,6 +296,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||
"ipv6InboundDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Allow IPv6 inbound",
|
||||
),
|
||||
"ja": MessageLookupByLibrary.simpleMessage("Japanese"),
|
||||
"just": MessageLookupByLibrary.simpleMessage("Just"),
|
||||
"keepAliveIntervalDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Tcp keep alive interval",
|
||||
@@ -305,6 +306,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||
"layout": MessageLookupByLibrary.simpleMessage("Layout"),
|
||||
"light": MessageLookupByLibrary.simpleMessage("Light"),
|
||||
"list": MessageLookupByLibrary.simpleMessage("List"),
|
||||
"listen": MessageLookupByLibrary.simpleMessage("Listen"),
|
||||
"local": MessageLookupByLibrary.simpleMessage("Local"),
|
||||
"localBackupDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Backup local data to local",
|
||||
@@ -470,7 +472,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||
"Set the Clash listening port",
|
||||
),
|
||||
"proxyProviders": MessageLookupByLibrary.simpleMessage("Proxy providers"),
|
||||
"prueBlackMode": MessageLookupByLibrary.simpleMessage("Prue black mode"),
|
||||
"pureBlackMode": MessageLookupByLibrary.simpleMessage("Pure black mode"),
|
||||
"qrcode": MessageLookupByLibrary.simpleMessage("QR code"),
|
||||
"qrcodeDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Scan QR code to obtain profile",
|
||||
@@ -513,6 +515,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||
"Bypass private route address",
|
||||
),
|
||||
"routeMode_config": MessageLookupByLibrary.simpleMessage("Use config"),
|
||||
"ru": MessageLookupByLibrary.simpleMessage("Russian"),
|
||||
"rule": MessageLookupByLibrary.simpleMessage("Rule"),
|
||||
"ruleProviders": MessageLookupByLibrary.simpleMessage("Rule providers"),
|
||||
"save": MessageLookupByLibrary.simpleMessage("Save"),
|
||||
|
||||
472
lib/l10n/intl/messages_ja.dart
Normal file
472
lib/l10n/intl/messages_ja.dart
Normal file
@@ -0,0 +1,472 @@
|
||||
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
|
||||
// This is a library that provides messages for a ja locale. All the
|
||||
// messages from the main program should be duplicated here with the same
|
||||
// function name.
|
||||
|
||||
// Ignore issues from commonly used lints in this file.
|
||||
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
|
||||
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
|
||||
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
|
||||
// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes
|
||||
// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes
|
||||
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:intl/message_lookup_by_library.dart';
|
||||
|
||||
final messages = new MessageLookup();
|
||||
|
||||
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
|
||||
|
||||
class MessageLookup extends MessageLookupByLibrary {
|
||||
String get localeName => 'ja';
|
||||
|
||||
final messages = _notInlinedMessages(_notInlinedMessages);
|
||||
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
|
||||
"about": MessageLookupByLibrary.simpleMessage("について"),
|
||||
"accessControl": MessageLookupByLibrary.simpleMessage("アクセス制御"),
|
||||
"accessControlAllowDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"選択したアプリのみVPNを許可",
|
||||
),
|
||||
"accessControlDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"アプリケーションのプロキシアクセスを設定",
|
||||
),
|
||||
"accessControlNotAllowDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"選択したアプリをVPNから除外",
|
||||
),
|
||||
"account": MessageLookupByLibrary.simpleMessage("アカウント"),
|
||||
"accountTip": MessageLookupByLibrary.simpleMessage("アカウントは必須です"),
|
||||
"action": MessageLookupByLibrary.simpleMessage("アクション"),
|
||||
"action_mode": MessageLookupByLibrary.simpleMessage("モード切替"),
|
||||
"action_proxy": MessageLookupByLibrary.simpleMessage("システムプロキシ"),
|
||||
"action_start": MessageLookupByLibrary.simpleMessage("開始/停止"),
|
||||
"action_tun": MessageLookupByLibrary.simpleMessage("TUN"),
|
||||
"action_view": MessageLookupByLibrary.simpleMessage("表示/非表示"),
|
||||
"add": MessageLookupByLibrary.simpleMessage("追加"),
|
||||
"address": MessageLookupByLibrary.simpleMessage("アドレス"),
|
||||
"addressHelp": MessageLookupByLibrary.simpleMessage("WebDAVサーバーアドレス"),
|
||||
"addressTip": MessageLookupByLibrary.simpleMessage("有効なWebDAVアドレスを入力"),
|
||||
"adminAutoLaunch": MessageLookupByLibrary.simpleMessage("管理者自動起動"),
|
||||
"adminAutoLaunchDesc": MessageLookupByLibrary.simpleMessage("管理者モードで起動"),
|
||||
"ago": MessageLookupByLibrary.simpleMessage("前"),
|
||||
"agree": MessageLookupByLibrary.simpleMessage("同意"),
|
||||
"allApps": MessageLookupByLibrary.simpleMessage("全アプリ"),
|
||||
"allowBypass": MessageLookupByLibrary.simpleMessage("アプリがVPNをバイパスすることを許可"),
|
||||
"allowBypassDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"有効化すると一部アプリがVPNをバイパス",
|
||||
),
|
||||
"allowLan": MessageLookupByLibrary.simpleMessage("LANを許可"),
|
||||
"allowLanDesc": MessageLookupByLibrary.simpleMessage("LAN経由でのプロキシアクセスを許可"),
|
||||
"app": MessageLookupByLibrary.simpleMessage("アプリ"),
|
||||
"appAccessControl": MessageLookupByLibrary.simpleMessage("アプリアクセス制御"),
|
||||
"appDesc": MessageLookupByLibrary.simpleMessage("アプリ関連設定の処理"),
|
||||
"application": MessageLookupByLibrary.simpleMessage("アプリケーション"),
|
||||
"applicationDesc": MessageLookupByLibrary.simpleMessage("アプリ関連設定を変更"),
|
||||
"auto": MessageLookupByLibrary.simpleMessage("自動"),
|
||||
"autoCheckUpdate": MessageLookupByLibrary.simpleMessage("自動更新チェック"),
|
||||
"autoCheckUpdateDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"起動時に更新を自動チェック",
|
||||
),
|
||||
"autoCloseConnections": MessageLookupByLibrary.simpleMessage("接続を自動閉じる"),
|
||||
"autoCloseConnectionsDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"ノード変更後に接続を自動閉じる",
|
||||
),
|
||||
"autoLaunch": MessageLookupByLibrary.simpleMessage("自動起動"),
|
||||
"autoLaunchDesc": MessageLookupByLibrary.simpleMessage("システムの自動起動に従う"),
|
||||
"autoRun": MessageLookupByLibrary.simpleMessage("自動実行"),
|
||||
"autoRunDesc": MessageLookupByLibrary.simpleMessage("アプリ起動時に自動実行"),
|
||||
"autoUpdate": MessageLookupByLibrary.simpleMessage("自動更新"),
|
||||
"autoUpdateInterval": MessageLookupByLibrary.simpleMessage("自動更新間隔(分)"),
|
||||
"backup": MessageLookupByLibrary.simpleMessage("バックアップ"),
|
||||
"backupAndRecovery": MessageLookupByLibrary.simpleMessage("バックアップと復元"),
|
||||
"backupAndRecoveryDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"WebDAVまたはファイルでデータを同期",
|
||||
),
|
||||
"backupSuccess": MessageLookupByLibrary.simpleMessage("バックアップ成功"),
|
||||
"bind": MessageLookupByLibrary.simpleMessage("バインド"),
|
||||
"blacklistMode": MessageLookupByLibrary.simpleMessage("ブラックリストモード"),
|
||||
"bypassDomain": MessageLookupByLibrary.simpleMessage("バイパスドメイン"),
|
||||
"bypassDomainDesc": MessageLookupByLibrary.simpleMessage("システムプロキシ有効時のみ適用"),
|
||||
"cacheCorrupt": MessageLookupByLibrary.simpleMessage(
|
||||
"キャッシュが破損しています。クリアしますか?",
|
||||
),
|
||||
"cancel": MessageLookupByLibrary.simpleMessage("キャンセル"),
|
||||
"cancelFilterSystemApp": MessageLookupByLibrary.simpleMessage(
|
||||
"システムアプリの除外を解除",
|
||||
),
|
||||
"cancelSelectAll": MessageLookupByLibrary.simpleMessage("全選択解除"),
|
||||
"checkError": MessageLookupByLibrary.simpleMessage("確認エラー"),
|
||||
"checkUpdate": MessageLookupByLibrary.simpleMessage("更新を確認"),
|
||||
"checkUpdateError": MessageLookupByLibrary.simpleMessage("アプリは最新版です"),
|
||||
"checking": MessageLookupByLibrary.simpleMessage("確認中..."),
|
||||
"clipboardExport": MessageLookupByLibrary.simpleMessage("クリップボードにエクスポート"),
|
||||
"clipboardImport": MessageLookupByLibrary.simpleMessage("クリップボードからインポート"),
|
||||
"columns": MessageLookupByLibrary.simpleMessage("列"),
|
||||
"compatible": MessageLookupByLibrary.simpleMessage("互換モード"),
|
||||
"compatibleDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"有効化すると一部機能を失いますが、Clashの完全サポートを獲得",
|
||||
),
|
||||
"confirm": MessageLookupByLibrary.simpleMessage("確認"),
|
||||
"connections": MessageLookupByLibrary.simpleMessage("接続"),
|
||||
"connectionsDesc": MessageLookupByLibrary.simpleMessage("現在の接続データを表示"),
|
||||
"connectivity": MessageLookupByLibrary.simpleMessage("接続性:"),
|
||||
"copy": MessageLookupByLibrary.simpleMessage("コピー"),
|
||||
"copyEnvVar": MessageLookupByLibrary.simpleMessage("環境変数をコピー"),
|
||||
"copyLink": MessageLookupByLibrary.simpleMessage("リンクをコピー"),
|
||||
"copySuccess": MessageLookupByLibrary.simpleMessage("コピー成功"),
|
||||
"core": MessageLookupByLibrary.simpleMessage("コア"),
|
||||
"coreInfo": MessageLookupByLibrary.simpleMessage("コア情報"),
|
||||
"country": MessageLookupByLibrary.simpleMessage("国"),
|
||||
"create": MessageLookupByLibrary.simpleMessage("作成"),
|
||||
"cut": MessageLookupByLibrary.simpleMessage("切り取り"),
|
||||
"dark": MessageLookupByLibrary.simpleMessage("ダーク"),
|
||||
"dashboard": MessageLookupByLibrary.simpleMessage("ダッシュボード"),
|
||||
"days": MessageLookupByLibrary.simpleMessage("日"),
|
||||
"defaultNameserver": MessageLookupByLibrary.simpleMessage("デフォルトネームサーバー"),
|
||||
"defaultNameserverDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"DNSサーバーの解決用",
|
||||
),
|
||||
"defaultSort": MessageLookupByLibrary.simpleMessage("デフォルト順"),
|
||||
"defaultText": MessageLookupByLibrary.simpleMessage("デフォルト"),
|
||||
"delay": MessageLookupByLibrary.simpleMessage("遅延"),
|
||||
"delaySort": MessageLookupByLibrary.simpleMessage("遅延順"),
|
||||
"delete": MessageLookupByLibrary.simpleMessage("削除"),
|
||||
"deleteProfileTip": MessageLookupByLibrary.simpleMessage(
|
||||
"現在のプロファイルを削除しますか?",
|
||||
),
|
||||
"desc": MessageLookupByLibrary.simpleMessage(
|
||||
"ClashMetaベースのマルチプラットフォームプロキシクライアント。シンプルで使いやすく、オープンソースで広告なし。",
|
||||
),
|
||||
"detectionTip": MessageLookupByLibrary.simpleMessage("サードパーティAPIに依存(参考値)"),
|
||||
"direct": MessageLookupByLibrary.simpleMessage("ダイレクト"),
|
||||
"disclaimer": MessageLookupByLibrary.simpleMessage("免責事項"),
|
||||
"disclaimerDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"本ソフトウェアは学習交流や科学研究などの非営利目的でのみ使用されます。商用利用は厳禁です。いかなる商用活動も本ソフトウェアとは無関係です。",
|
||||
),
|
||||
"discoverNewVersion": MessageLookupByLibrary.simpleMessage("新バージョンを発見"),
|
||||
"discovery": MessageLookupByLibrary.simpleMessage("新しいバージョンを発見"),
|
||||
"dnsDesc": MessageLookupByLibrary.simpleMessage("DNS関連設定の更新"),
|
||||
"dnsMode": MessageLookupByLibrary.simpleMessage("DNSモード"),
|
||||
"doYouWantToPass": MessageLookupByLibrary.simpleMessage("通過させますか?"),
|
||||
"domain": MessageLookupByLibrary.simpleMessage("ドメイン"),
|
||||
"download": MessageLookupByLibrary.simpleMessage("ダウンロード"),
|
||||
"edit": MessageLookupByLibrary.simpleMessage("編集"),
|
||||
"en": MessageLookupByLibrary.simpleMessage("英語"),
|
||||
"entries": MessageLookupByLibrary.simpleMessage(" エントリ"),
|
||||
"exclude": MessageLookupByLibrary.simpleMessage("最近のタスクから非表示"),
|
||||
"excludeDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"アプリがバックグラウンド時に最近のタスクから非表示",
|
||||
),
|
||||
"exit": MessageLookupByLibrary.simpleMessage("終了"),
|
||||
"expand": MessageLookupByLibrary.simpleMessage("標準"),
|
||||
"expirationTime": MessageLookupByLibrary.simpleMessage("有効期限"),
|
||||
"exportFile": MessageLookupByLibrary.simpleMessage("ファイルをエクスポート"),
|
||||
"exportLogs": MessageLookupByLibrary.simpleMessage("ログをエクスポート"),
|
||||
"exportSuccess": MessageLookupByLibrary.simpleMessage("エクスポート成功"),
|
||||
"externalController": MessageLookupByLibrary.simpleMessage("外部コントローラー"),
|
||||
"externalControllerDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"有効化するとClashコアをポート9090で制御可能",
|
||||
),
|
||||
"externalLink": MessageLookupByLibrary.simpleMessage("外部リンク"),
|
||||
"externalResources": MessageLookupByLibrary.simpleMessage("外部リソース"),
|
||||
"fakeipFilter": MessageLookupByLibrary.simpleMessage("Fakeipフィルター"),
|
||||
"fakeipRange": MessageLookupByLibrary.simpleMessage("Fakeip範囲"),
|
||||
"fallback": MessageLookupByLibrary.simpleMessage("フォールバック"),
|
||||
"fallbackDesc": MessageLookupByLibrary.simpleMessage("通常はオフショアDNSを使用"),
|
||||
"fallbackFilter": MessageLookupByLibrary.simpleMessage("フォールバックフィルター"),
|
||||
"file": MessageLookupByLibrary.simpleMessage("ファイル"),
|
||||
"fileDesc": MessageLookupByLibrary.simpleMessage("プロファイルを直接アップロード"),
|
||||
"fileIsUpdate": MessageLookupByLibrary.simpleMessage(
|
||||
"ファイルが変更されました。保存しますか?",
|
||||
),
|
||||
"filterSystemApp": MessageLookupByLibrary.simpleMessage("システムアプリを除外"),
|
||||
"findProcessMode": MessageLookupByLibrary.simpleMessage("プロセス検出"),
|
||||
"findProcessModeDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"有効化するとフラッシュバックのリスクあり",
|
||||
),
|
||||
"fontFamily": MessageLookupByLibrary.simpleMessage("フォントファミリー"),
|
||||
"fourColumns": MessageLookupByLibrary.simpleMessage("4列"),
|
||||
"general": MessageLookupByLibrary.simpleMessage("一般"),
|
||||
"generalDesc": MessageLookupByLibrary.simpleMessage("一般設定の上書き"),
|
||||
"geoData": MessageLookupByLibrary.simpleMessage("地域データ"),
|
||||
"geodataLoader": MessageLookupByLibrary.simpleMessage("Geo低メモリモード"),
|
||||
"geodataLoaderDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"有効化するとGeo低メモリローダーを使用",
|
||||
),
|
||||
"geoipCode": MessageLookupByLibrary.simpleMessage("GeoIPコード"),
|
||||
"global": MessageLookupByLibrary.simpleMessage("グローバル"),
|
||||
"go": MessageLookupByLibrary.simpleMessage("移動"),
|
||||
"goDownload": MessageLookupByLibrary.simpleMessage("ダウンロードへ"),
|
||||
"hasCacheChange": MessageLookupByLibrary.simpleMessage("変更をキャッシュしますか?"),
|
||||
"hostsDesc": MessageLookupByLibrary.simpleMessage("ホストを追加"),
|
||||
"hotkeyConflict": MessageLookupByLibrary.simpleMessage("ホットキー競合"),
|
||||
"hotkeyManagement": MessageLookupByLibrary.simpleMessage("ホットキー管理"),
|
||||
"hotkeyManagementDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"キーボードでアプリを制御",
|
||||
),
|
||||
"hours": MessageLookupByLibrary.simpleMessage("時間"),
|
||||
"icon": MessageLookupByLibrary.simpleMessage("アイコン"),
|
||||
"iconConfiguration": MessageLookupByLibrary.simpleMessage("アイコン設定"),
|
||||
"iconStyle": MessageLookupByLibrary.simpleMessage("アイコンスタイル"),
|
||||
"importFromURL": MessageLookupByLibrary.simpleMessage("URLからインポート"),
|
||||
"infiniteTime": MessageLookupByLibrary.simpleMessage("長期有効"),
|
||||
"init": MessageLookupByLibrary.simpleMessage("初期化"),
|
||||
"inputCorrectHotkey": MessageLookupByLibrary.simpleMessage("正しいホットキーを入力"),
|
||||
"intelligentSelected": MessageLookupByLibrary.simpleMessage("インテリジェント選択"),
|
||||
"intranetIP": MessageLookupByLibrary.simpleMessage("イントラネットIP"),
|
||||
"ipcidr": MessageLookupByLibrary.simpleMessage("IPCIDR"),
|
||||
"ipv6Desc": MessageLookupByLibrary.simpleMessage("有効化するとIPv6トラフィックを受信可能"),
|
||||
"ipv6InboundDesc": MessageLookupByLibrary.simpleMessage("IPv6インバウンドを許可"),
|
||||
"ja": MessageLookupByLibrary.simpleMessage("日本語"),
|
||||
"just": MessageLookupByLibrary.simpleMessage("たった今"),
|
||||
"keepAliveIntervalDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"TCPキープアライブ間隔",
|
||||
),
|
||||
"key": MessageLookupByLibrary.simpleMessage("キー"),
|
||||
"language": MessageLookupByLibrary.simpleMessage("言語"),
|
||||
"layout": MessageLookupByLibrary.simpleMessage("レイアウト"),
|
||||
"light": MessageLookupByLibrary.simpleMessage("ライト"),
|
||||
"list": MessageLookupByLibrary.simpleMessage("リスト"),
|
||||
"listen": MessageLookupByLibrary.simpleMessage("リスン"),
|
||||
"local": MessageLookupByLibrary.simpleMessage("ローカル"),
|
||||
"localBackupDesc": MessageLookupByLibrary.simpleMessage("ローカルにデータをバックアップ"),
|
||||
"localRecoveryDesc": MessageLookupByLibrary.simpleMessage("ファイルからデータを復元"),
|
||||
"logLevel": MessageLookupByLibrary.simpleMessage("ログレベル"),
|
||||
"logcat": MessageLookupByLibrary.simpleMessage("ログキャット"),
|
||||
"logcatDesc": MessageLookupByLibrary.simpleMessage("無効化するとログエントリを非表示"),
|
||||
"logs": MessageLookupByLibrary.simpleMessage("ログ"),
|
||||
"logsDesc": MessageLookupByLibrary.simpleMessage("ログキャプチャ記録"),
|
||||
"loopback": MessageLookupByLibrary.simpleMessage("ループバック解除ツール"),
|
||||
"loopbackDesc": MessageLookupByLibrary.simpleMessage("UWPループバック解除用"),
|
||||
"loose": MessageLookupByLibrary.simpleMessage("疎"),
|
||||
"memoryInfo": MessageLookupByLibrary.simpleMessage("メモリ情報"),
|
||||
"min": MessageLookupByLibrary.simpleMessage("最小化"),
|
||||
"minimizeOnExit": MessageLookupByLibrary.simpleMessage("終了時に最小化"),
|
||||
"minimizeOnExitDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"システムの終了イベントを変更",
|
||||
),
|
||||
"minutes": MessageLookupByLibrary.simpleMessage("分"),
|
||||
"mode": MessageLookupByLibrary.simpleMessage("モード"),
|
||||
"months": MessageLookupByLibrary.simpleMessage("月"),
|
||||
"more": MessageLookupByLibrary.simpleMessage("詳細"),
|
||||
"name": MessageLookupByLibrary.simpleMessage("名前"),
|
||||
"nameSort": MessageLookupByLibrary.simpleMessage("名前順"),
|
||||
"nameserver": MessageLookupByLibrary.simpleMessage("ネームサーバー"),
|
||||
"nameserverDesc": MessageLookupByLibrary.simpleMessage("ドメイン解決用"),
|
||||
"nameserverPolicy": MessageLookupByLibrary.simpleMessage("ネームサーバーポリシー"),
|
||||
"nameserverPolicyDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"対応するネームサーバーポリシーを指定",
|
||||
),
|
||||
"network": MessageLookupByLibrary.simpleMessage("ネットワーク"),
|
||||
"networkDesc": MessageLookupByLibrary.simpleMessage("ネットワーク関連設定の変更"),
|
||||
"networkDetection": MessageLookupByLibrary.simpleMessage("ネットワーク検出"),
|
||||
"networkSpeed": MessageLookupByLibrary.simpleMessage("ネットワーク速度"),
|
||||
"noData": MessageLookupByLibrary.simpleMessage("データなし"),
|
||||
"noHotKey": MessageLookupByLibrary.simpleMessage("ホットキーなし"),
|
||||
"noIcon": MessageLookupByLibrary.simpleMessage("なし"),
|
||||
"noInfo": MessageLookupByLibrary.simpleMessage("情報なし"),
|
||||
"noMoreInfoDesc": MessageLookupByLibrary.simpleMessage("追加情報なし"),
|
||||
"noNetwork": MessageLookupByLibrary.simpleMessage("ネットワークなし"),
|
||||
"noProxy": MessageLookupByLibrary.simpleMessage("プロキシなし"),
|
||||
"noProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"プロファイルを作成するか、有効なプロファイルを追加してください",
|
||||
),
|
||||
"notEmpty": MessageLookupByLibrary.simpleMessage("空欄不可"),
|
||||
"notSelectedTip": MessageLookupByLibrary.simpleMessage(
|
||||
"現在のプロキシグループは選択できません",
|
||||
),
|
||||
"nullConnectionsDesc": MessageLookupByLibrary.simpleMessage("接続なし"),
|
||||
"nullCoreInfoDesc": MessageLookupByLibrary.simpleMessage("コア情報を取得できません"),
|
||||
"nullLogsDesc": MessageLookupByLibrary.simpleMessage("ログがありません"),
|
||||
"nullProfileDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"プロファイルがありません。追加してください",
|
||||
),
|
||||
"nullProxies": MessageLookupByLibrary.simpleMessage("プロキシなし"),
|
||||
"nullRequestsDesc": MessageLookupByLibrary.simpleMessage("リクエストなし"),
|
||||
"oneColumn": MessageLookupByLibrary.simpleMessage("1列"),
|
||||
"onlyIcon": MessageLookupByLibrary.simpleMessage("アイコンのみ"),
|
||||
"onlyOtherApps": MessageLookupByLibrary.simpleMessage("サードパーティアプリのみ"),
|
||||
"onlyStatisticsProxy": MessageLookupByLibrary.simpleMessage("プロキシのみ統計"),
|
||||
"onlyStatisticsProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"有効化するとプロキシトラフィックのみ統計",
|
||||
),
|
||||
"options": MessageLookupByLibrary.simpleMessage("オプション"),
|
||||
"other": MessageLookupByLibrary.simpleMessage("その他"),
|
||||
"otherContributors": MessageLookupByLibrary.simpleMessage("その他の貢献者"),
|
||||
"outboundMode": MessageLookupByLibrary.simpleMessage("アウトバウンドモード"),
|
||||
"override": MessageLookupByLibrary.simpleMessage("上書き"),
|
||||
"overrideDesc": MessageLookupByLibrary.simpleMessage("プロキシ関連設定を上書き"),
|
||||
"overrideDns": MessageLookupByLibrary.simpleMessage("DNS上書き"),
|
||||
"overrideDnsDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"有効化するとプロファイルのDNS設定を上書き",
|
||||
),
|
||||
"password": MessageLookupByLibrary.simpleMessage("パスワード"),
|
||||
"passwordTip": MessageLookupByLibrary.simpleMessage("パスワードは必須です"),
|
||||
"paste": MessageLookupByLibrary.simpleMessage("貼り付け"),
|
||||
"pleaseBindWebDAV": MessageLookupByLibrary.simpleMessage(
|
||||
"WebDAVをバインドしてください",
|
||||
),
|
||||
"pleaseInputAdminPassword": MessageLookupByLibrary.simpleMessage(
|
||||
"管理者パスワードを入力",
|
||||
),
|
||||
"pleaseUploadFile": MessageLookupByLibrary.simpleMessage(
|
||||
"ファイルをアップロードしてください",
|
||||
),
|
||||
"pleaseUploadValidQrcode": MessageLookupByLibrary.simpleMessage(
|
||||
"有効なQRコードをアップロードしてください",
|
||||
),
|
||||
"port": MessageLookupByLibrary.simpleMessage("ポート"),
|
||||
"preferH3Desc": MessageLookupByLibrary.simpleMessage("DOHのHTTP/3を優先使用"),
|
||||
"pressKeyboard": MessageLookupByLibrary.simpleMessage("キーボードを押してください"),
|
||||
"preview": MessageLookupByLibrary.simpleMessage("プレビュー"),
|
||||
"profile": MessageLookupByLibrary.simpleMessage("プロファイル"),
|
||||
"profileAutoUpdateIntervalInvalidValidationDesc":
|
||||
MessageLookupByLibrary.simpleMessage("有効な間隔形式を入力してください"),
|
||||
"profileAutoUpdateIntervalNullValidationDesc":
|
||||
MessageLookupByLibrary.simpleMessage("自動更新間隔を入力してください"),
|
||||
"profileHasUpdate": MessageLookupByLibrary.simpleMessage(
|
||||
"プロファイルが変更されました。自動更新を無効化しますか?",
|
||||
),
|
||||
"profileNameNullValidationDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"プロファイル名を入力してください",
|
||||
),
|
||||
"profileParseErrorDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"プロファイル解析エラー",
|
||||
),
|
||||
"profileUrlInvalidValidationDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"有効なプロファイルURLを入力してください",
|
||||
),
|
||||
"profileUrlNullValidationDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"プロファイルURLを入力してください",
|
||||
),
|
||||
"profiles": MessageLookupByLibrary.simpleMessage("プロファイル一覧"),
|
||||
"profilesSort": MessageLookupByLibrary.simpleMessage("プロファイルの並び替え"),
|
||||
"project": MessageLookupByLibrary.simpleMessage("プロジェクト"),
|
||||
"providers": MessageLookupByLibrary.simpleMessage("プロバイダー"),
|
||||
"proxies": MessageLookupByLibrary.simpleMessage("プロキシ"),
|
||||
"proxiesSetting": MessageLookupByLibrary.simpleMessage("プロキシ設定"),
|
||||
"proxyGroup": MessageLookupByLibrary.simpleMessage("プロキシグループ"),
|
||||
"proxyNameserver": MessageLookupByLibrary.simpleMessage("プロキシネームサーバー"),
|
||||
"proxyNameserverDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"プロキシノード解決用ドメイン",
|
||||
),
|
||||
"proxyPort": MessageLookupByLibrary.simpleMessage("プロキシポート"),
|
||||
"proxyPortDesc": MessageLookupByLibrary.simpleMessage("Clashのリスニングポートを設定"),
|
||||
"proxyProviders": MessageLookupByLibrary.simpleMessage("プロキシプロバイダー"),
|
||||
"pureBlackMode": MessageLookupByLibrary.simpleMessage("純黒モード"),
|
||||
"qrcode": MessageLookupByLibrary.simpleMessage("QRコード"),
|
||||
"qrcodeDesc": MessageLookupByLibrary.simpleMessage("QRコードをスキャンしてプロファイルを取得"),
|
||||
"recovery": MessageLookupByLibrary.simpleMessage("復元"),
|
||||
"recoveryAll": MessageLookupByLibrary.simpleMessage("全データ復元"),
|
||||
"recoveryProfiles": MessageLookupByLibrary.simpleMessage("プロファイルのみ復元"),
|
||||
"recoverySuccess": MessageLookupByLibrary.simpleMessage("復元成功"),
|
||||
"regExp": MessageLookupByLibrary.simpleMessage("正規表現"),
|
||||
"remote": MessageLookupByLibrary.simpleMessage("リモート"),
|
||||
"remoteBackupDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"WebDAVにデータをバックアップ",
|
||||
),
|
||||
"remoteRecoveryDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"WebDAVからデータを復元",
|
||||
),
|
||||
"remove": MessageLookupByLibrary.simpleMessage("削除"),
|
||||
"requests": MessageLookupByLibrary.simpleMessage("リクエスト"),
|
||||
"requestsDesc": MessageLookupByLibrary.simpleMessage("最近のリクエスト記録を表示"),
|
||||
"reset": MessageLookupByLibrary.simpleMessage("リセット"),
|
||||
"resetTip": MessageLookupByLibrary.simpleMessage("リセットを確定"),
|
||||
"resources": MessageLookupByLibrary.simpleMessage("リソース"),
|
||||
"resourcesDesc": MessageLookupByLibrary.simpleMessage("外部リソース関連情報"),
|
||||
"respectRules": MessageLookupByLibrary.simpleMessage("ルール尊重"),
|
||||
"respectRulesDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"DNS接続がルールに従う(proxy-server-nameserverの設定が必要)",
|
||||
),
|
||||
"routeAddress": MessageLookupByLibrary.simpleMessage("ルートアドレス"),
|
||||
"routeAddressDesc": MessageLookupByLibrary.simpleMessage("ルートアドレスを設定"),
|
||||
"routeMode": MessageLookupByLibrary.simpleMessage("ルートモード"),
|
||||
"routeMode_bypassPrivate": MessageLookupByLibrary.simpleMessage(
|
||||
"プライベートルートをバイパス",
|
||||
),
|
||||
"routeMode_config": MessageLookupByLibrary.simpleMessage("設定を使用"),
|
||||
"ru": MessageLookupByLibrary.simpleMessage("ロシア語"),
|
||||
"rule": MessageLookupByLibrary.simpleMessage("ルール"),
|
||||
"ruleProviders": MessageLookupByLibrary.simpleMessage("ルールプロバイダー"),
|
||||
"save": MessageLookupByLibrary.simpleMessage("保存"),
|
||||
"search": MessageLookupByLibrary.simpleMessage("検索"),
|
||||
"seconds": MessageLookupByLibrary.simpleMessage("秒"),
|
||||
"selectAll": MessageLookupByLibrary.simpleMessage("すべて選択"),
|
||||
"selected": MessageLookupByLibrary.simpleMessage("選択済み"),
|
||||
"settings": MessageLookupByLibrary.simpleMessage("設定"),
|
||||
"show": MessageLookupByLibrary.simpleMessage("表示"),
|
||||
"shrink": MessageLookupByLibrary.simpleMessage("縮小"),
|
||||
"silentLaunch": MessageLookupByLibrary.simpleMessage("バックグラウンド起動"),
|
||||
"silentLaunchDesc": MessageLookupByLibrary.simpleMessage("バックグラウンドで起動"),
|
||||
"size": MessageLookupByLibrary.simpleMessage("サイズ"),
|
||||
"sort": MessageLookupByLibrary.simpleMessage("並び替え"),
|
||||
"source": MessageLookupByLibrary.simpleMessage("ソース"),
|
||||
"stackMode": MessageLookupByLibrary.simpleMessage("スタックモード"),
|
||||
"standard": MessageLookupByLibrary.simpleMessage("標準"),
|
||||
"start": MessageLookupByLibrary.simpleMessage("開始"),
|
||||
"startVpn": MessageLookupByLibrary.simpleMessage("VPNを開始中..."),
|
||||
"status": MessageLookupByLibrary.simpleMessage("ステータス"),
|
||||
"statusDesc": MessageLookupByLibrary.simpleMessage("無効時はシステムDNSを使用"),
|
||||
"stop": MessageLookupByLibrary.simpleMessage("停止"),
|
||||
"stopVpn": MessageLookupByLibrary.simpleMessage("VPNを停止中..."),
|
||||
"style": MessageLookupByLibrary.simpleMessage("スタイル"),
|
||||
"submit": MessageLookupByLibrary.simpleMessage("送信"),
|
||||
"sync": MessageLookupByLibrary.simpleMessage("同期"),
|
||||
"system": MessageLookupByLibrary.simpleMessage("システム"),
|
||||
"systemFont": MessageLookupByLibrary.simpleMessage("システムフォント"),
|
||||
"systemProxy": MessageLookupByLibrary.simpleMessage("システムプロキシ"),
|
||||
"systemProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"HTTPプロキシをVpnServiceに接続",
|
||||
),
|
||||
"tab": MessageLookupByLibrary.simpleMessage("タブ"),
|
||||
"tabAnimation": MessageLookupByLibrary.simpleMessage("タブアニメーション"),
|
||||
"tabAnimationDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"有効化するとホームタブに切り替えアニメーションを追加",
|
||||
),
|
||||
"tcpConcurrent": MessageLookupByLibrary.simpleMessage("TCP並列処理"),
|
||||
"tcpConcurrentDesc": MessageLookupByLibrary.simpleMessage("TCP並列処理を許可"),
|
||||
"testUrl": MessageLookupByLibrary.simpleMessage("URLテスト"),
|
||||
"theme": MessageLookupByLibrary.simpleMessage("テーマ"),
|
||||
"themeColor": MessageLookupByLibrary.simpleMessage("テーマカラー"),
|
||||
"themeDesc": MessageLookupByLibrary.simpleMessage("ダークモードの設定、色の調整"),
|
||||
"themeMode": MessageLookupByLibrary.simpleMessage("テーマモード"),
|
||||
"threeColumns": MessageLookupByLibrary.simpleMessage("3列"),
|
||||
"tight": MessageLookupByLibrary.simpleMessage("密"),
|
||||
"time": MessageLookupByLibrary.simpleMessage("時間"),
|
||||
"tip": MessageLookupByLibrary.simpleMessage("ヒント"),
|
||||
"toggle": MessageLookupByLibrary.simpleMessage("トグル"),
|
||||
"tools": MessageLookupByLibrary.simpleMessage("ツール"),
|
||||
"trafficUsage": MessageLookupByLibrary.simpleMessage("トラフィック使用量"),
|
||||
"tun": MessageLookupByLibrary.simpleMessage("TUN"),
|
||||
"tunDesc": MessageLookupByLibrary.simpleMessage("管理者モードでのみ有効"),
|
||||
"twoColumns": MessageLookupByLibrary.simpleMessage("2列"),
|
||||
"unableToUpdateCurrentProfileDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"現在のプロファイルを更新できません",
|
||||
),
|
||||
"unifiedDelay": MessageLookupByLibrary.simpleMessage("統一遅延"),
|
||||
"unifiedDelayDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"ハンドシェイクなどの余分な遅延を削除",
|
||||
),
|
||||
"unknown": MessageLookupByLibrary.simpleMessage("不明"),
|
||||
"update": MessageLookupByLibrary.simpleMessage("更新"),
|
||||
"upload": MessageLookupByLibrary.simpleMessage("アップロード"),
|
||||
"url": MessageLookupByLibrary.simpleMessage("URL"),
|
||||
"urlDesc": MessageLookupByLibrary.simpleMessage("URL経由でプロファイルを取得"),
|
||||
"useHosts": MessageLookupByLibrary.simpleMessage("ホストを使用"),
|
||||
"useSystemHosts": MessageLookupByLibrary.simpleMessage("システムホストを使用"),
|
||||
"value": MessageLookupByLibrary.simpleMessage("値"),
|
||||
"view": MessageLookupByLibrary.simpleMessage("表示"),
|
||||
"vpnDesc": MessageLookupByLibrary.simpleMessage("VPN関連設定の変更"),
|
||||
"vpnEnableDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"VpnService経由で全システムトラフィックをルーティング",
|
||||
),
|
||||
"vpnSystemProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"HTTPプロキシをVpnServiceに接続",
|
||||
),
|
||||
"vpnTip": MessageLookupByLibrary.simpleMessage("変更はVPN再起動後に有効"),
|
||||
"webDAVConfiguration": MessageLookupByLibrary.simpleMessage("WebDAV設定"),
|
||||
"whitelistMode": MessageLookupByLibrary.simpleMessage("ホワイトリストモード"),
|
||||
"years": MessageLookupByLibrary.simpleMessage("年"),
|
||||
"zh_CN": MessageLookupByLibrary.simpleMessage("簡体字中国語"),
|
||||
};
|
||||
}
|
||||
666
lib/l10n/intl/messages_ru.dart
Normal file
666
lib/l10n/intl/messages_ru.dart
Normal file
@@ -0,0 +1,666 @@
|
||||
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
|
||||
// This is a library that provides messages for a ru locale. All the
|
||||
// messages from the main program should be duplicated here with the same
|
||||
// function name.
|
||||
|
||||
// Ignore issues from commonly used lints in this file.
|
||||
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
|
||||
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
|
||||
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
|
||||
// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes
|
||||
// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes
|
||||
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:intl/message_lookup_by_library.dart';
|
||||
|
||||
final messages = new MessageLookup();
|
||||
|
||||
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
|
||||
|
||||
class MessageLookup extends MessageLookupByLibrary {
|
||||
String get localeName => 'ru';
|
||||
|
||||
final messages = _notInlinedMessages(_notInlinedMessages);
|
||||
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
|
||||
"about": MessageLookupByLibrary.simpleMessage("О программе"),
|
||||
"accessControl": MessageLookupByLibrary.simpleMessage("Контроль доступа"),
|
||||
"accessControlAllowDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Разрешить только выбранным приложениям доступ к VPN",
|
||||
),
|
||||
"accessControlDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Настройка доступа приложений к прокси",
|
||||
),
|
||||
"accessControlNotAllowDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Выбранные приложения будут исключены из VPN",
|
||||
),
|
||||
"account": MessageLookupByLibrary.simpleMessage("Аккаунт"),
|
||||
"accountTip": MessageLookupByLibrary.simpleMessage(
|
||||
"Аккаунт не может быть пустым",
|
||||
),
|
||||
"action": MessageLookupByLibrary.simpleMessage("Действие"),
|
||||
"action_mode": MessageLookupByLibrary.simpleMessage("Переключить режим"),
|
||||
"action_proxy": MessageLookupByLibrary.simpleMessage("Системный прокси"),
|
||||
"action_start": MessageLookupByLibrary.simpleMessage("Старт/Стоп"),
|
||||
"action_tun": MessageLookupByLibrary.simpleMessage("TUN"),
|
||||
"action_view": MessageLookupByLibrary.simpleMessage("Показать/Скрыть"),
|
||||
"add": MessageLookupByLibrary.simpleMessage("Добавить"),
|
||||
"address": MessageLookupByLibrary.simpleMessage("Адрес"),
|
||||
"addressHelp": MessageLookupByLibrary.simpleMessage("Адрес сервера WebDAV"),
|
||||
"addressTip": MessageLookupByLibrary.simpleMessage(
|
||||
"Пожалуйста, введите действительный адрес WebDAV",
|
||||
),
|
||||
"adminAutoLaunch": MessageLookupByLibrary.simpleMessage(
|
||||
"Автозапуск с правами администратора",
|
||||
),
|
||||
"adminAutoLaunchDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Запуск с правами администратора при загрузке системы",
|
||||
),
|
||||
"ago": MessageLookupByLibrary.simpleMessage(" назад"),
|
||||
"agree": MessageLookupByLibrary.simpleMessage("Согласен"),
|
||||
"allApps": MessageLookupByLibrary.simpleMessage("Все приложения"),
|
||||
"allowBypass": MessageLookupByLibrary.simpleMessage(
|
||||
"Разрешить приложениям обходить VPN",
|
||||
),
|
||||
"allowBypassDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Некоторые приложения могут обходить VPN при включении",
|
||||
),
|
||||
"allowLan": MessageLookupByLibrary.simpleMessage("Разрешить LAN"),
|
||||
"allowLanDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Разрешить доступ к прокси через локальную сеть",
|
||||
),
|
||||
"app": MessageLookupByLibrary.simpleMessage("Приложение"),
|
||||
"appAccessControl": MessageLookupByLibrary.simpleMessage(
|
||||
"Контроль доступа приложений",
|
||||
),
|
||||
"appDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Обработка настроек, связанных с приложением",
|
||||
),
|
||||
"application": MessageLookupByLibrary.simpleMessage("Приложение"),
|
||||
"applicationDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Изменение настроек, связанных с приложением",
|
||||
),
|
||||
"auto": MessageLookupByLibrary.simpleMessage("Авто"),
|
||||
"autoCheckUpdate": MessageLookupByLibrary.simpleMessage(
|
||||
"Автопроверка обновлений",
|
||||
),
|
||||
"autoCheckUpdateDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Автоматически проверять обновления при запуске приложения",
|
||||
),
|
||||
"autoCloseConnections": MessageLookupByLibrary.simpleMessage(
|
||||
"Автоматическое закрытие соединений",
|
||||
),
|
||||
"autoCloseConnectionsDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Автоматически закрывать соединения после смены узла",
|
||||
),
|
||||
"autoLaunch": MessageLookupByLibrary.simpleMessage("Автозапуск"),
|
||||
"autoLaunchDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Следовать автозапуску системы",
|
||||
),
|
||||
"autoRun": MessageLookupByLibrary.simpleMessage("Автозапуск"),
|
||||
"autoRunDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Автоматический запуск при открытии приложения",
|
||||
),
|
||||
"autoUpdate": MessageLookupByLibrary.simpleMessage("Автообновление"),
|
||||
"autoUpdateInterval": MessageLookupByLibrary.simpleMessage(
|
||||
"Интервал автообновления (минуты)",
|
||||
),
|
||||
"backup": MessageLookupByLibrary.simpleMessage("Резервное копирование"),
|
||||
"backupAndRecovery": MessageLookupByLibrary.simpleMessage(
|
||||
"Резервное копирование и восстановление",
|
||||
),
|
||||
"backupAndRecoveryDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Синхронизация данных через WebDAV или файл",
|
||||
),
|
||||
"backupSuccess": MessageLookupByLibrary.simpleMessage(
|
||||
"Резервное копирование успешно",
|
||||
),
|
||||
"bind": MessageLookupByLibrary.simpleMessage("Привязать"),
|
||||
"blacklistMode": MessageLookupByLibrary.simpleMessage(
|
||||
"Режим черного списка",
|
||||
),
|
||||
"bypassDomain": MessageLookupByLibrary.simpleMessage("Обход домена"),
|
||||
"bypassDomainDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Действует только при включенном системном прокси",
|
||||
),
|
||||
"cacheCorrupt": MessageLookupByLibrary.simpleMessage(
|
||||
"Кэш поврежден. Хотите очистить его?",
|
||||
),
|
||||
"cancel": MessageLookupByLibrary.simpleMessage("Отмена"),
|
||||
"cancelFilterSystemApp": MessageLookupByLibrary.simpleMessage(
|
||||
"Отменить фильтрацию системных приложений",
|
||||
),
|
||||
"cancelSelectAll": MessageLookupByLibrary.simpleMessage(
|
||||
"Отменить выбор всего",
|
||||
),
|
||||
"checkError": MessageLookupByLibrary.simpleMessage("Ошибка проверки"),
|
||||
"checkUpdate": MessageLookupByLibrary.simpleMessage("Проверить обновления"),
|
||||
"checkUpdateError": MessageLookupByLibrary.simpleMessage(
|
||||
"Текущее приложение уже является последней версией",
|
||||
),
|
||||
"checking": MessageLookupByLibrary.simpleMessage("Проверка..."),
|
||||
"clipboardExport": MessageLookupByLibrary.simpleMessage(
|
||||
"Экспорт в буфер обмена",
|
||||
),
|
||||
"clipboardImport": MessageLookupByLibrary.simpleMessage(
|
||||
"Импорт из буфера обмена",
|
||||
),
|
||||
"columns": MessageLookupByLibrary.simpleMessage("Столбцы"),
|
||||
"compatible": MessageLookupByLibrary.simpleMessage("Режим совместимости"),
|
||||
"compatibleDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Включение приведет к потере части функциональности приложения, но обеспечит полную поддержку Clash.",
|
||||
),
|
||||
"confirm": MessageLookupByLibrary.simpleMessage("Подтвердить"),
|
||||
"connections": MessageLookupByLibrary.simpleMessage("Соединения"),
|
||||
"connectionsDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Просмотр текущих данных о соединениях",
|
||||
),
|
||||
"connectivity": MessageLookupByLibrary.simpleMessage("Связь:"),
|
||||
"copy": MessageLookupByLibrary.simpleMessage("Копировать"),
|
||||
"copyEnvVar": MessageLookupByLibrary.simpleMessage(
|
||||
"Копирование переменных окружения",
|
||||
),
|
||||
"copyLink": MessageLookupByLibrary.simpleMessage("Копировать ссылку"),
|
||||
"copySuccess": MessageLookupByLibrary.simpleMessage("Копирование успешно"),
|
||||
"core": MessageLookupByLibrary.simpleMessage("Ядро"),
|
||||
"coreInfo": MessageLookupByLibrary.simpleMessage("Информация о ядре"),
|
||||
"country": MessageLookupByLibrary.simpleMessage("Страна"),
|
||||
"create": MessageLookupByLibrary.simpleMessage("Создать"),
|
||||
"cut": MessageLookupByLibrary.simpleMessage("Вырезать"),
|
||||
"dark": MessageLookupByLibrary.simpleMessage("Темный"),
|
||||
"dashboard": MessageLookupByLibrary.simpleMessage("Панель управления"),
|
||||
"days": MessageLookupByLibrary.simpleMessage("Дней"),
|
||||
"defaultNameserver": MessageLookupByLibrary.simpleMessage(
|
||||
"Сервер имен по умолчанию",
|
||||
),
|
||||
"defaultNameserverDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Для разрешения DNS-сервера",
|
||||
),
|
||||
"defaultSort": MessageLookupByLibrary.simpleMessage(
|
||||
"Сортировка по умолчанию",
|
||||
),
|
||||
"defaultText": MessageLookupByLibrary.simpleMessage("По умолчанию"),
|
||||
"delay": MessageLookupByLibrary.simpleMessage("Задержка"),
|
||||
"delaySort": MessageLookupByLibrary.simpleMessage("Сортировка по задержке"),
|
||||
"delete": MessageLookupByLibrary.simpleMessage("Удалить"),
|
||||
"deleteProfileTip": MessageLookupByLibrary.simpleMessage(
|
||||
"Вы уверены, что хотите удалить текущий профиль?",
|
||||
),
|
||||
"desc": MessageLookupByLibrary.simpleMessage(
|
||||
"Многоплатформенный прокси-клиент на основе ClashMeta, простой и удобный в использовании, с открытым исходным кодом и без рекламы.",
|
||||
),
|
||||
"detectionTip": MessageLookupByLibrary.simpleMessage(
|
||||
"Опирается на сторонний API, только для справки",
|
||||
),
|
||||
"direct": MessageLookupByLibrary.simpleMessage("Прямой"),
|
||||
"disclaimer": MessageLookupByLibrary.simpleMessage(
|
||||
"Отказ от ответственности",
|
||||
),
|
||||
"disclaimerDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Это программное обеспечение используется только в некоммерческих целях, таких как учебные обмены и научные исследования. Запрещено использовать это программное обеспечение в коммерческих целях. Любая коммерческая деятельность, если таковая имеется, не имеет отношения к этому программному обеспечению.",
|
||||
),
|
||||
"discoverNewVersion": MessageLookupByLibrary.simpleMessage(
|
||||
"Обнаружена новая версия",
|
||||
),
|
||||
"discovery": MessageLookupByLibrary.simpleMessage(
|
||||
"Обнаружена новая версия",
|
||||
),
|
||||
"dnsDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Обновление настроек, связанных с DNS",
|
||||
),
|
||||
"dnsMode": MessageLookupByLibrary.simpleMessage("Режим DNS"),
|
||||
"doYouWantToPass": MessageLookupByLibrary.simpleMessage(
|
||||
"Вы хотите пропустить",
|
||||
),
|
||||
"domain": MessageLookupByLibrary.simpleMessage("Домен"),
|
||||
"download": MessageLookupByLibrary.simpleMessage("Скачивание"),
|
||||
"edit": MessageLookupByLibrary.simpleMessage("Редактировать"),
|
||||
"en": MessageLookupByLibrary.simpleMessage("Английский"),
|
||||
"entries": MessageLookupByLibrary.simpleMessage(" записей"),
|
||||
"exclude": MessageLookupByLibrary.simpleMessage(
|
||||
"Скрыть из последних задач",
|
||||
),
|
||||
"excludeDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Когда приложение находится в фоновом режиме, оно скрыто из последних задач",
|
||||
),
|
||||
"exit": MessageLookupByLibrary.simpleMessage("Выход"),
|
||||
"expand": MessageLookupByLibrary.simpleMessage("Стандартный"),
|
||||
"expirationTime": MessageLookupByLibrary.simpleMessage("Время истечения"),
|
||||
"exportFile": MessageLookupByLibrary.simpleMessage("Экспорт файла"),
|
||||
"exportLogs": MessageLookupByLibrary.simpleMessage("Экспорт логов"),
|
||||
"exportSuccess": MessageLookupByLibrary.simpleMessage("Экспорт успешен"),
|
||||
"externalController": MessageLookupByLibrary.simpleMessage(
|
||||
"Внешний контроллер",
|
||||
),
|
||||
"externalControllerDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"При включении ядро Clash можно контролировать на порту 9090",
|
||||
),
|
||||
"externalLink": MessageLookupByLibrary.simpleMessage("Внешняя ссылка"),
|
||||
"externalResources": MessageLookupByLibrary.simpleMessage(
|
||||
"Внешние ресурсы",
|
||||
),
|
||||
"fakeipFilter": MessageLookupByLibrary.simpleMessage("Фильтр Fakeip"),
|
||||
"fakeipRange": MessageLookupByLibrary.simpleMessage("Диапазон Fakeip"),
|
||||
"fallback": MessageLookupByLibrary.simpleMessage("Резервный"),
|
||||
"fallbackDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Обычно используется оффшорный DNS",
|
||||
),
|
||||
"fallbackFilter": MessageLookupByLibrary.simpleMessage(
|
||||
"Фильтр резервного DNS",
|
||||
),
|
||||
"file": MessageLookupByLibrary.simpleMessage("Файл"),
|
||||
"fileDesc": MessageLookupByLibrary.simpleMessage("Прямая загрузка профиля"),
|
||||
"fileIsUpdate": MessageLookupByLibrary.simpleMessage(
|
||||
"Файл был изменен. Хотите сохранить изменения?",
|
||||
),
|
||||
"filterSystemApp": MessageLookupByLibrary.simpleMessage(
|
||||
"Фильтровать системные приложения",
|
||||
),
|
||||
"findProcessMode": MessageLookupByLibrary.simpleMessage(
|
||||
"Режим поиска процесса",
|
||||
),
|
||||
"findProcessModeDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Есть риск сбоя после включения",
|
||||
),
|
||||
"fontFamily": MessageLookupByLibrary.simpleMessage("Семейство шрифтов"),
|
||||
"fourColumns": MessageLookupByLibrary.simpleMessage("Четыре столбца"),
|
||||
"general": MessageLookupByLibrary.simpleMessage("Общие"),
|
||||
"generalDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Переопределение общих настроек",
|
||||
),
|
||||
"geoData": MessageLookupByLibrary.simpleMessage("Геоданные"),
|
||||
"geodataLoader": MessageLookupByLibrary.simpleMessage(
|
||||
"Режим низкого потребления памяти для геоданных",
|
||||
),
|
||||
"geodataLoaderDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Включение будет использовать загрузчик геоданных с низким потреблением памяти",
|
||||
),
|
||||
"geoipCode": MessageLookupByLibrary.simpleMessage("Код Geoip"),
|
||||
"global": MessageLookupByLibrary.simpleMessage("Глобальный"),
|
||||
"go": MessageLookupByLibrary.simpleMessage("Перейти"),
|
||||
"goDownload": MessageLookupByLibrary.simpleMessage("Перейти к загрузке"),
|
||||
"hasCacheChange": MessageLookupByLibrary.simpleMessage(
|
||||
"Хотите сохранить изменения в кэше?",
|
||||
),
|
||||
"hostsDesc": MessageLookupByLibrary.simpleMessage("Добавить Hosts"),
|
||||
"hotkeyConflict": MessageLookupByLibrary.simpleMessage(
|
||||
"Конфликт горячих клавиш",
|
||||
),
|
||||
"hotkeyManagement": MessageLookupByLibrary.simpleMessage(
|
||||
"Управление горячими клавишами",
|
||||
),
|
||||
"hotkeyManagementDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Использование клавиатуры для управления приложением",
|
||||
),
|
||||
"hours": MessageLookupByLibrary.simpleMessage("Часов"),
|
||||
"icon": MessageLookupByLibrary.simpleMessage("Иконка"),
|
||||
"iconConfiguration": MessageLookupByLibrary.simpleMessage(
|
||||
"Конфигурация иконки",
|
||||
),
|
||||
"iconStyle": MessageLookupByLibrary.simpleMessage("Стиль иконки"),
|
||||
"importFromURL": MessageLookupByLibrary.simpleMessage("Импорт из URL"),
|
||||
"infiniteTime": MessageLookupByLibrary.simpleMessage(
|
||||
"Долгосрочное действие",
|
||||
),
|
||||
"init": MessageLookupByLibrary.simpleMessage("Инициализация"),
|
||||
"inputCorrectHotkey": MessageLookupByLibrary.simpleMessage(
|
||||
"Пожалуйста, введите правильную горячую клавишу",
|
||||
),
|
||||
"intelligentSelected": MessageLookupByLibrary.simpleMessage(
|
||||
"Интеллектуальный выбор",
|
||||
),
|
||||
"intranetIP": MessageLookupByLibrary.simpleMessage("Внутренний IP"),
|
||||
"ipcidr": MessageLookupByLibrary.simpleMessage("IPCIDR"),
|
||||
"ipv6Desc": MessageLookupByLibrary.simpleMessage(
|
||||
"При включении будет возможно получать IPv6 трафик",
|
||||
),
|
||||
"ipv6InboundDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Разрешить входящий IPv6",
|
||||
),
|
||||
"ja": MessageLookupByLibrary.simpleMessage("Японский"),
|
||||
"just": MessageLookupByLibrary.simpleMessage("Только что"),
|
||||
"keepAliveIntervalDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Интервал поддержания TCP-соединения",
|
||||
),
|
||||
"key": MessageLookupByLibrary.simpleMessage("Ключ"),
|
||||
"language": MessageLookupByLibrary.simpleMessage("Язык"),
|
||||
"layout": MessageLookupByLibrary.simpleMessage("Макет"),
|
||||
"light": MessageLookupByLibrary.simpleMessage("Светлый"),
|
||||
"list": MessageLookupByLibrary.simpleMessage("Список"),
|
||||
"listen": MessageLookupByLibrary.simpleMessage("Слушать"),
|
||||
"local": MessageLookupByLibrary.simpleMessage("Локальный"),
|
||||
"localBackupDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Резервное копирование локальных данных на локальный диск",
|
||||
),
|
||||
"localRecoveryDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Восстановление данных из файла",
|
||||
),
|
||||
"logLevel": MessageLookupByLibrary.simpleMessage("Уровень логов"),
|
||||
"logcat": MessageLookupByLibrary.simpleMessage("Logcat"),
|
||||
"logcatDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Отключение скроет запись логов",
|
||||
),
|
||||
"logs": MessageLookupByLibrary.simpleMessage("Логи"),
|
||||
"logsDesc": MessageLookupByLibrary.simpleMessage("Записи захвата логов"),
|
||||
"loopback": MessageLookupByLibrary.simpleMessage(
|
||||
"Инструмент разблокировки Loopback",
|
||||
),
|
||||
"loopbackDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Используется для разблокировки Loopback UWP",
|
||||
),
|
||||
"loose": MessageLookupByLibrary.simpleMessage("Свободный"),
|
||||
"memoryInfo": MessageLookupByLibrary.simpleMessage("Информация о памяти"),
|
||||
"min": MessageLookupByLibrary.simpleMessage("Мин"),
|
||||
"minimizeOnExit": MessageLookupByLibrary.simpleMessage(
|
||||
"Свернуть при выходе",
|
||||
),
|
||||
"minimizeOnExitDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Изменить стандартное событие выхода из системы",
|
||||
),
|
||||
"minutes": MessageLookupByLibrary.simpleMessage("Минут"),
|
||||
"mode": MessageLookupByLibrary.simpleMessage("Режим"),
|
||||
"months": MessageLookupByLibrary.simpleMessage("Месяцев"),
|
||||
"more": MessageLookupByLibrary.simpleMessage("Еще"),
|
||||
"name": MessageLookupByLibrary.simpleMessage("Имя"),
|
||||
"nameSort": MessageLookupByLibrary.simpleMessage("Сортировка по имени"),
|
||||
"nameserver": MessageLookupByLibrary.simpleMessage("Сервер имен"),
|
||||
"nameserverDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Для разрешения домена",
|
||||
),
|
||||
"nameserverPolicy": MessageLookupByLibrary.simpleMessage(
|
||||
"Политика сервера имен",
|
||||
),
|
||||
"nameserverPolicyDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Указать соответствующую политику сервера имен",
|
||||
),
|
||||
"network": MessageLookupByLibrary.simpleMessage("Сеть"),
|
||||
"networkDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Изменение настроек, связанных с сетью",
|
||||
),
|
||||
"networkDetection": MessageLookupByLibrary.simpleMessage(
|
||||
"Обнаружение сети",
|
||||
),
|
||||
"networkSpeed": MessageLookupByLibrary.simpleMessage("Скорость сети"),
|
||||
"noData": MessageLookupByLibrary.simpleMessage("Нет данных"),
|
||||
"noHotKey": MessageLookupByLibrary.simpleMessage("Нет горячей клавиши"),
|
||||
"noIcon": MessageLookupByLibrary.simpleMessage("Нет иконки"),
|
||||
"noInfo": MessageLookupByLibrary.simpleMessage("Нет информации"),
|
||||
"noMoreInfoDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Нет дополнительной информации",
|
||||
),
|
||||
"noNetwork": MessageLookupByLibrary.simpleMessage("Нет сети"),
|
||||
"noProxy": MessageLookupByLibrary.simpleMessage("Нет прокси"),
|
||||
"noProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Пожалуйста, создайте профиль или добавьте действительный профиль",
|
||||
),
|
||||
"notEmpty": MessageLookupByLibrary.simpleMessage("Не может быть пустым"),
|
||||
"notSelectedTip": MessageLookupByLibrary.simpleMessage(
|
||||
"Текущая группа прокси не может быть выбрана.",
|
||||
),
|
||||
"nullConnectionsDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Нет соединений",
|
||||
),
|
||||
"nullCoreInfoDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Не удалось получить информацию о ядре",
|
||||
),
|
||||
"nullLogsDesc": MessageLookupByLibrary.simpleMessage("Нет логов"),
|
||||
"nullProfileDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Нет профиля, пожалуйста, добавьте профиль",
|
||||
),
|
||||
"nullProxies": MessageLookupByLibrary.simpleMessage("Нет прокси"),
|
||||
"nullRequestsDesc": MessageLookupByLibrary.simpleMessage("Нет запросов"),
|
||||
"oneColumn": MessageLookupByLibrary.simpleMessage("Один столбец"),
|
||||
"onlyIcon": MessageLookupByLibrary.simpleMessage("Только иконка"),
|
||||
"onlyOtherApps": MessageLookupByLibrary.simpleMessage(
|
||||
"Только сторонние приложения",
|
||||
),
|
||||
"onlyStatisticsProxy": MessageLookupByLibrary.simpleMessage(
|
||||
"Только статистика прокси",
|
||||
),
|
||||
"onlyStatisticsProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"При включении будет учитываться только трафик прокси",
|
||||
),
|
||||
"options": MessageLookupByLibrary.simpleMessage("Опции"),
|
||||
"other": MessageLookupByLibrary.simpleMessage("Другое"),
|
||||
"otherContributors": MessageLookupByLibrary.simpleMessage(
|
||||
"Другие участники",
|
||||
),
|
||||
"outboundMode": MessageLookupByLibrary.simpleMessage(
|
||||
"Режим исходящего трафика",
|
||||
),
|
||||
"override": MessageLookupByLibrary.simpleMessage("Переопределить"),
|
||||
"overrideDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Переопределить конфигурацию, связанную с прокси",
|
||||
),
|
||||
"overrideDns": MessageLookupByLibrary.simpleMessage("Переопределить DNS"),
|
||||
"overrideDnsDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Включение переопределит настройки DNS в профиле",
|
||||
),
|
||||
"password": MessageLookupByLibrary.simpleMessage("Пароль"),
|
||||
"passwordTip": MessageLookupByLibrary.simpleMessage(
|
||||
"Пароль не может быть пустым",
|
||||
),
|
||||
"paste": MessageLookupByLibrary.simpleMessage("Вставить"),
|
||||
"pleaseBindWebDAV": MessageLookupByLibrary.simpleMessage(
|
||||
"Пожалуйста, привяжите WebDAV",
|
||||
),
|
||||
"pleaseInputAdminPassword": MessageLookupByLibrary.simpleMessage(
|
||||
"Пожалуйста, введите пароль администратора",
|
||||
),
|
||||
"pleaseUploadFile": MessageLookupByLibrary.simpleMessage(
|
||||
"Пожалуйста, загрузите файл",
|
||||
),
|
||||
"pleaseUploadValidQrcode": MessageLookupByLibrary.simpleMessage(
|
||||
"Пожалуйста, загрузите действительный QR-код",
|
||||
),
|
||||
"port": MessageLookupByLibrary.simpleMessage("Порт"),
|
||||
"preferH3Desc": MessageLookupByLibrary.simpleMessage(
|
||||
"Приоритетное использование HTTP/3 для DOH",
|
||||
),
|
||||
"pressKeyboard": MessageLookupByLibrary.simpleMessage(
|
||||
"Пожалуйста, нажмите клавишу.",
|
||||
),
|
||||
"preview": MessageLookupByLibrary.simpleMessage("Предпросмотр"),
|
||||
"profile": MessageLookupByLibrary.simpleMessage("Профиль"),
|
||||
"profileAutoUpdateIntervalInvalidValidationDesc":
|
||||
MessageLookupByLibrary.simpleMessage(
|
||||
"Пожалуйста, введите действительный формат интервала времени",
|
||||
),
|
||||
"profileAutoUpdateIntervalNullValidationDesc":
|
||||
MessageLookupByLibrary.simpleMessage(
|
||||
"Пожалуйста, введите интервал времени для автообновления",
|
||||
),
|
||||
"profileHasUpdate": MessageLookupByLibrary.simpleMessage(
|
||||
"Профиль был изменен. Хотите отключить автообновление?",
|
||||
),
|
||||
"profileNameNullValidationDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Пожалуйста, введите имя профиля",
|
||||
),
|
||||
"profileParseErrorDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"ошибка разбора профиля",
|
||||
),
|
||||
"profileUrlInvalidValidationDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Пожалуйста, введите действительный URL профиля",
|
||||
),
|
||||
"profileUrlNullValidationDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Пожалуйста, введите URL профиля",
|
||||
),
|
||||
"profiles": MessageLookupByLibrary.simpleMessage("Профили"),
|
||||
"profilesSort": MessageLookupByLibrary.simpleMessage("Сортировка профилей"),
|
||||
"project": MessageLookupByLibrary.simpleMessage("Проект"),
|
||||
"providers": MessageLookupByLibrary.simpleMessage("Провайдеры"),
|
||||
"proxies": MessageLookupByLibrary.simpleMessage("Прокси"),
|
||||
"proxiesSetting": MessageLookupByLibrary.simpleMessage("Настройка прокси"),
|
||||
"proxyGroup": MessageLookupByLibrary.simpleMessage("Группа прокси"),
|
||||
"proxyNameserver": MessageLookupByLibrary.simpleMessage(
|
||||
"Прокси-сервер имен",
|
||||
),
|
||||
"proxyNameserverDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Домен для разрешения прокси-узлов",
|
||||
),
|
||||
"proxyPort": MessageLookupByLibrary.simpleMessage("Порт прокси"),
|
||||
"proxyPortDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Установить порт прослушивания Clash",
|
||||
),
|
||||
"proxyProviders": MessageLookupByLibrary.simpleMessage("Провайдеры прокси"),
|
||||
"pureBlackMode": MessageLookupByLibrary.simpleMessage("Чисто черный режим"),
|
||||
"qrcode": MessageLookupByLibrary.simpleMessage("QR-код"),
|
||||
"qrcodeDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Сканируйте QR-код для получения профиля",
|
||||
),
|
||||
"recovery": MessageLookupByLibrary.simpleMessage("Восстановление"),
|
||||
"recoveryAll": MessageLookupByLibrary.simpleMessage(
|
||||
"Восстановить все данные",
|
||||
),
|
||||
"recoveryProfiles": MessageLookupByLibrary.simpleMessage(
|
||||
"Только восстановление профилей",
|
||||
),
|
||||
"recoverySuccess": MessageLookupByLibrary.simpleMessage(
|
||||
"Восстановление успешно",
|
||||
),
|
||||
"regExp": MessageLookupByLibrary.simpleMessage("Регулярное выражение"),
|
||||
"remote": MessageLookupByLibrary.simpleMessage("Удаленный"),
|
||||
"remoteBackupDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Резервное копирование локальных данных на WebDAV",
|
||||
),
|
||||
"remoteRecoveryDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Восстановление данных с WebDAV",
|
||||
),
|
||||
"remove": MessageLookupByLibrary.simpleMessage("Удалить"),
|
||||
"requests": MessageLookupByLibrary.simpleMessage("Запросы"),
|
||||
"requestsDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Просмотр последних записей запросов",
|
||||
),
|
||||
"reset": MessageLookupByLibrary.simpleMessage("Сброс"),
|
||||
"resetTip": MessageLookupByLibrary.simpleMessage(
|
||||
"Убедитесь, что хотите сбросить",
|
||||
),
|
||||
"resources": MessageLookupByLibrary.simpleMessage("Ресурсы"),
|
||||
"resourcesDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Информация, связанная с внешними ресурсами",
|
||||
),
|
||||
"respectRules": MessageLookupByLibrary.simpleMessage("Соблюдение правил"),
|
||||
"respectRulesDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"DNS-соединение следует правилам, необходимо настроить proxy-server-nameserver",
|
||||
),
|
||||
"routeAddress": MessageLookupByLibrary.simpleMessage("Адрес маршрутизации"),
|
||||
"routeAddressDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Настройка адреса прослушивания маршрутизации",
|
||||
),
|
||||
"routeMode": MessageLookupByLibrary.simpleMessage("Режим маршрутизации"),
|
||||
"routeMode_bypassPrivate": MessageLookupByLibrary.simpleMessage(
|
||||
"Обход частных адресов маршрутизации",
|
||||
),
|
||||
"routeMode_config": MessageLookupByLibrary.simpleMessage(
|
||||
"Использовать конфигурацию",
|
||||
),
|
||||
"ru": MessageLookupByLibrary.simpleMessage("Русский"),
|
||||
"rule": MessageLookupByLibrary.simpleMessage("Правило"),
|
||||
"ruleProviders": MessageLookupByLibrary.simpleMessage("Провайдеры правил"),
|
||||
"save": MessageLookupByLibrary.simpleMessage("Сохранить"),
|
||||
"search": MessageLookupByLibrary.simpleMessage("Поиск"),
|
||||
"seconds": MessageLookupByLibrary.simpleMessage("Секунд"),
|
||||
"selectAll": MessageLookupByLibrary.simpleMessage("Выбрать все"),
|
||||
"selected": MessageLookupByLibrary.simpleMessage("Выбрано"),
|
||||
"settings": MessageLookupByLibrary.simpleMessage("Настройки"),
|
||||
"show": MessageLookupByLibrary.simpleMessage("Показать"),
|
||||
"shrink": MessageLookupByLibrary.simpleMessage("Сжать"),
|
||||
"silentLaunch": MessageLookupByLibrary.simpleMessage("Тихий запуск"),
|
||||
"silentLaunchDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Запуск в фоновом режиме",
|
||||
),
|
||||
"size": MessageLookupByLibrary.simpleMessage("Размер"),
|
||||
"sort": MessageLookupByLibrary.simpleMessage("Сортировка"),
|
||||
"source": MessageLookupByLibrary.simpleMessage("Источник"),
|
||||
"stackMode": MessageLookupByLibrary.simpleMessage("Режим стека"),
|
||||
"standard": MessageLookupByLibrary.simpleMessage("Стандартный"),
|
||||
"start": MessageLookupByLibrary.simpleMessage("Старт"),
|
||||
"startVpn": MessageLookupByLibrary.simpleMessage("Запуск VPN..."),
|
||||
"status": MessageLookupByLibrary.simpleMessage("Статус"),
|
||||
"statusDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Системный DNS будет использоваться при выключении",
|
||||
),
|
||||
"stop": MessageLookupByLibrary.simpleMessage("Стоп"),
|
||||
"stopVpn": MessageLookupByLibrary.simpleMessage("Остановка VPN..."),
|
||||
"style": MessageLookupByLibrary.simpleMessage("Стиль"),
|
||||
"submit": MessageLookupByLibrary.simpleMessage("Отправить"),
|
||||
"sync": MessageLookupByLibrary.simpleMessage("Синхронизация"),
|
||||
"system": MessageLookupByLibrary.simpleMessage("Система"),
|
||||
"systemFont": MessageLookupByLibrary.simpleMessage("Системный шрифт"),
|
||||
"systemProxy": MessageLookupByLibrary.simpleMessage("Системный прокси"),
|
||||
"systemProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Прикрепить HTTP-прокси к VpnService",
|
||||
),
|
||||
"tab": MessageLookupByLibrary.simpleMessage("Вкладка"),
|
||||
"tabAnimation": MessageLookupByLibrary.simpleMessage("Анимация вкладок"),
|
||||
"tabAnimationDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"При включении домашняя вкладка добавит анимацию переключения",
|
||||
),
|
||||
"tcpConcurrent": MessageLookupByLibrary.simpleMessage("TCP параллелизм"),
|
||||
"tcpConcurrentDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Включение позволит использовать параллелизм TCP",
|
||||
),
|
||||
"testUrl": MessageLookupByLibrary.simpleMessage("Тест URL"),
|
||||
"theme": MessageLookupByLibrary.simpleMessage("Тема"),
|
||||
"themeColor": MessageLookupByLibrary.simpleMessage("Цвет темы"),
|
||||
"themeDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Установить темный режим, настроить цвет",
|
||||
),
|
||||
"themeMode": MessageLookupByLibrary.simpleMessage("Режим темы"),
|
||||
"threeColumns": MessageLookupByLibrary.simpleMessage("Три столбца"),
|
||||
"tight": MessageLookupByLibrary.simpleMessage("Плотный"),
|
||||
"time": MessageLookupByLibrary.simpleMessage("Время"),
|
||||
"tip": MessageLookupByLibrary.simpleMessage("подсказка"),
|
||||
"toggle": MessageLookupByLibrary.simpleMessage("Переключить"),
|
||||
"tools": MessageLookupByLibrary.simpleMessage("Инструменты"),
|
||||
"trafficUsage": MessageLookupByLibrary.simpleMessage(
|
||||
"Использование трафика",
|
||||
),
|
||||
"tun": MessageLookupByLibrary.simpleMessage("TUN"),
|
||||
"tunDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"действительно только в режиме администратора",
|
||||
),
|
||||
"twoColumns": MessageLookupByLibrary.simpleMessage("Два столбца"),
|
||||
"unableToUpdateCurrentProfileDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"невозможно обновить текущий профиль",
|
||||
),
|
||||
"unifiedDelay": MessageLookupByLibrary.simpleMessage(
|
||||
"Унифицированная задержка",
|
||||
),
|
||||
"unifiedDelayDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Убрать дополнительные задержки, такие как рукопожатие",
|
||||
),
|
||||
"unknown": MessageLookupByLibrary.simpleMessage("Неизвестно"),
|
||||
"update": MessageLookupByLibrary.simpleMessage("Обновить"),
|
||||
"upload": MessageLookupByLibrary.simpleMessage("Загрузка"),
|
||||
"url": MessageLookupByLibrary.simpleMessage("URL"),
|
||||
"urlDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Получить профиль через URL",
|
||||
),
|
||||
"useHosts": MessageLookupByLibrary.simpleMessage("Использовать hosts"),
|
||||
"useSystemHosts": MessageLookupByLibrary.simpleMessage(
|
||||
"Использовать системные hosts",
|
||||
),
|
||||
"value": MessageLookupByLibrary.simpleMessage("Значение"),
|
||||
"view": MessageLookupByLibrary.simpleMessage("Просмотр"),
|
||||
"vpnDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Изменение настроек, связанных с VPN",
|
||||
),
|
||||
"vpnEnableDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Автоматически направляет весь системный трафик через VpnService",
|
||||
),
|
||||
"vpnSystemProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Прикрепить HTTP-прокси к VpnService",
|
||||
),
|
||||
"vpnTip": MessageLookupByLibrary.simpleMessage(
|
||||
"Изменения вступят в силу после перезапуска VPN",
|
||||
),
|
||||
"webDAVConfiguration": MessageLookupByLibrary.simpleMessage(
|
||||
"Конфигурация WebDAV",
|
||||
),
|
||||
"whitelistMode": MessageLookupByLibrary.simpleMessage(
|
||||
"Режим белого списка",
|
||||
),
|
||||
"years": MessageLookupByLibrary.simpleMessage("Лет"),
|
||||
"zh_CN": MessageLookupByLibrary.simpleMessage("Упрощенный китайский"),
|
||||
};
|
||||
}
|
||||
@@ -122,7 +122,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||
"desc": MessageLookupByLibrary.simpleMessage(
|
||||
"基于ClashMeta的多平台代理客户端,简单易用,开源无广告。",
|
||||
),
|
||||
"detectionTip": MessageLookupByLibrary.simpleMessage("依赖第三方api仅供参考"),
|
||||
"detectionTip": MessageLookupByLibrary.simpleMessage("依赖第三方api,仅供参考"),
|
||||
"direct": MessageLookupByLibrary.simpleMessage("直连"),
|
||||
"disclaimer": MessageLookupByLibrary.simpleMessage("免责声明"),
|
||||
"disclaimerDesc": MessageLookupByLibrary.simpleMessage(
|
||||
@@ -192,6 +192,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||
"ipcidr": MessageLookupByLibrary.simpleMessage("IP/掩码"),
|
||||
"ipv6Desc": MessageLookupByLibrary.simpleMessage("开启后将可以接收IPv6流量"),
|
||||
"ipv6InboundDesc": MessageLookupByLibrary.simpleMessage("允许IPv6入站"),
|
||||
"ja": MessageLookupByLibrary.simpleMessage("日语"),
|
||||
"just": MessageLookupByLibrary.simpleMessage("刚刚"),
|
||||
"keepAliveIntervalDesc": MessageLookupByLibrary.simpleMessage("TCP保持活动间隔"),
|
||||
"key": MessageLookupByLibrary.simpleMessage("键"),
|
||||
@@ -199,6 +200,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||
"layout": MessageLookupByLibrary.simpleMessage("布局"),
|
||||
"light": MessageLookupByLibrary.simpleMessage("浅色"),
|
||||
"list": MessageLookupByLibrary.simpleMessage("列表"),
|
||||
"listen": MessageLookupByLibrary.simpleMessage("监听"),
|
||||
"local": MessageLookupByLibrary.simpleMessage("本地"),
|
||||
"localBackupDesc": MessageLookupByLibrary.simpleMessage("备份数据到本地"),
|
||||
"localRecoveryDesc": MessageLookupByLibrary.simpleMessage("通过文件恢复数据"),
|
||||
@@ -304,7 +306,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||
"proxyPort": MessageLookupByLibrary.simpleMessage("代理端口"),
|
||||
"proxyPortDesc": MessageLookupByLibrary.simpleMessage("设置Clash监听端口"),
|
||||
"proxyProviders": MessageLookupByLibrary.simpleMessage("代理提供者"),
|
||||
"prueBlackMode": MessageLookupByLibrary.simpleMessage("纯黑模式"),
|
||||
"pureBlackMode": MessageLookupByLibrary.simpleMessage("纯黑模式"),
|
||||
"qrcode": MessageLookupByLibrary.simpleMessage("二维码"),
|
||||
"qrcodeDesc": MessageLookupByLibrary.simpleMessage("扫描二维码获取配置文件"),
|
||||
"recovery": MessageLookupByLibrary.simpleMessage("恢复"),
|
||||
@@ -331,6 +333,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||
"routeMode": MessageLookupByLibrary.simpleMessage("路由模式"),
|
||||
"routeMode_bypassPrivate": MessageLookupByLibrary.simpleMessage("绕过私有路由地址"),
|
||||
"routeMode_config": MessageLookupByLibrary.simpleMessage("使用配置"),
|
||||
"ru": MessageLookupByLibrary.simpleMessage("俄语"),
|
||||
"rule": MessageLookupByLibrary.simpleMessage("规则"),
|
||||
"ruleProviders": MessageLookupByLibrary.simpleMessage("规则提供者"),
|
||||
"save": MessageLookupByLibrary.simpleMessage("保存"),
|
||||
|
||||
@@ -255,6 +255,16 @@ class AppLocalizations {
|
||||
return Intl.message('English', name: 'en', desc: '', args: []);
|
||||
}
|
||||
|
||||
/// `Japanese`
|
||||
String get ja {
|
||||
return Intl.message('Japanese', name: 'ja', desc: '', args: []);
|
||||
}
|
||||
|
||||
/// `Russian`
|
||||
String get ru {
|
||||
return Intl.message('Russian', name: 'ru', desc: '', args: []);
|
||||
}
|
||||
|
||||
/// `Simplified Chinese`
|
||||
String get zh_CN {
|
||||
return Intl.message(
|
||||
@@ -1670,10 +1680,10 @@ class AppLocalizations {
|
||||
);
|
||||
}
|
||||
|
||||
/// `Auto lose connections`
|
||||
/// `Auto close connections`
|
||||
String get autoCloseConnections {
|
||||
return Intl.message(
|
||||
'Auto lose connections',
|
||||
'Auto close connections',
|
||||
name: 'autoCloseConnections',
|
||||
desc: '',
|
||||
args: [],
|
||||
@@ -1720,11 +1730,11 @@ class AppLocalizations {
|
||||
);
|
||||
}
|
||||
|
||||
/// `Prue black mode`
|
||||
String get prueBlackMode {
|
||||
/// `Pure black mode`
|
||||
String get pureBlackMode {
|
||||
return Intl.message(
|
||||
'Prue black mode',
|
||||
name: 'prueBlackMode',
|
||||
'Pure black mode',
|
||||
name: 'pureBlackMode',
|
||||
desc: '',
|
||||
args: [],
|
||||
);
|
||||
@@ -2679,6 +2689,11 @@ class AppLocalizations {
|
||||
args: [],
|
||||
);
|
||||
}
|
||||
|
||||
/// `Listen`
|
||||
String get listen {
|
||||
return Intl.message('Listen', name: 'listen', desc: '', args: []);
|
||||
}
|
||||
}
|
||||
|
||||
class AppLocalizationDelegate extends LocalizationsDelegate<AppLocalizations> {
|
||||
@@ -2687,6 +2702,8 @@ class AppLocalizationDelegate extends LocalizationsDelegate<AppLocalizations> {
|
||||
List<Locale> get supportedLocales {
|
||||
return const <Locale>[
|
||||
Locale.fromSubtags(languageCode: 'en'),
|
||||
Locale.fromSubtags(languageCode: 'ja'),
|
||||
Locale.fromSubtags(languageCode: 'ru'),
|
||||
Locale.fromSubtags(languageCode: 'zh', countryCode: 'CN'),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@ import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import '../enum/enum.dart';
|
||||
|
||||
part 'generated/clash_config.freezed.dart';
|
||||
|
||||
part 'generated/clash_config.g.dart';
|
||||
|
||||
typedef HostsMap = Map<String, String>;
|
||||
@@ -179,6 +178,7 @@ class FallbackFilter with _$FallbackFilter {
|
||||
class Dns with _$Dns {
|
||||
const factory Dns({
|
||||
@Default(true) bool enable,
|
||||
@Default("0.0.0.0:1053") String listen,
|
||||
@Default(false) @JsonKey(name: "prefer-h3") bool preferH3,
|
||||
@Default(true) @JsonKey(name: "use-hosts") bool useHosts,
|
||||
@Default(true) @JsonKey(name: "use-system-hosts") bool useSystemHosts,
|
||||
@@ -245,7 +245,7 @@ class GeoXUrl with _$GeoXUrl {
|
||||
)
|
||||
String mmdb,
|
||||
@Default(
|
||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb",
|
||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/GeoLite2-ASN.mmdb",
|
||||
)
|
||||
String asn,
|
||||
@Default(
|
||||
@@ -273,6 +273,17 @@ class GeoXUrl with _$GeoXUrl {
|
||||
}
|
||||
}
|
||||
|
||||
@freezed
|
||||
class ClashConfigSnippet with _$ClashConfigSnippet {
|
||||
const factory ClashConfigSnippet({
|
||||
@Default([]) @JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||
@Default([]) List<String> rule,
|
||||
}) = _ClashConfigSnippet;
|
||||
|
||||
factory ClashConfigSnippet.fromJson(Map<String, Object?> json) =>
|
||||
_$ClashConfigSnippetFromJson(json);
|
||||
}
|
||||
|
||||
@freezed
|
||||
class ClashConfig with _$ClashConfig {
|
||||
const factory ClashConfig({
|
||||
@@ -301,7 +312,7 @@ class ClashConfig with _$ClashConfig {
|
||||
@JsonKey(name: "geodata-loader")
|
||||
GeodataLoader geodataLoader,
|
||||
@Default([]) @JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||
@Default([]) List<String> rules,
|
||||
@Default([]) List<String> rule,
|
||||
@JsonKey(name: "global-ua") String? globalUa,
|
||||
@Default(ExternalControllerStatus.close)
|
||||
@JsonKey(name: "external-controller")
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
// ignore_for_file: invalid_annotation_target
|
||||
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:fl_clash/common/common.dart';
|
||||
import 'package:fl_clash/enum/enum.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@@ -10,7 +8,6 @@ import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'models.dart';
|
||||
|
||||
part 'generated/config.freezed.dart';
|
||||
|
||||
part 'generated/config.g.dart';
|
||||
|
||||
const defaultBypassDomain = [
|
||||
@@ -39,15 +36,10 @@ const defaultNetworkProps = NetworkProps();
|
||||
const defaultProxiesStyle = ProxiesStyle();
|
||||
const defaultWindowProps = WindowProps();
|
||||
const defaultAccessControl = AccessControl();
|
||||
final defaultThemeProps = Platform.isWindows
|
||||
? ThemeProps().copyWith(
|
||||
fontFamily: FontFamily.miSans,
|
||||
primaryColor: defaultPrimaryColor.value,
|
||||
)
|
||||
: ThemeProps().copyWith(
|
||||
primaryColor: defaultPrimaryColor.value,
|
||||
themeMode: ThemeMode.dark,
|
||||
);
|
||||
final defaultThemeProps = ThemeProps().copyWith(
|
||||
primaryColor: defaultPrimaryColor.value,
|
||||
themeMode: ThemeMode.dark,
|
||||
);
|
||||
|
||||
const List<DashboardWidget> defaultDashboardWidgets = [
|
||||
DashboardWidget.networkSpeed,
|
||||
@@ -185,8 +177,7 @@ class ThemeProps with _$ThemeProps {
|
||||
const factory ThemeProps({
|
||||
int? primaryColor,
|
||||
@Default(ThemeMode.system) ThemeMode themeMode,
|
||||
@Default(false) bool prueBlack,
|
||||
@Default(FontFamily.system) FontFamily fontFamily,
|
||||
@Default(false) bool pureBlack,
|
||||
}) = _ThemeProps;
|
||||
|
||||
factory ThemeProps.fromJson(Map<String, Object?> json) =>
|
||||
@@ -244,5 +235,4 @@ extension ConfigExt on Config {
|
||||
Profile? get currentProfile {
|
||||
return profiles.getProfile(currentProfileId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1039,6 +1039,7 @@ Dns _$DnsFromJson(Map<String, dynamic> json) {
|
||||
/// @nodoc
|
||||
mixin _$Dns {
|
||||
bool get enable => throw _privateConstructorUsedError;
|
||||
String get listen => throw _privateConstructorUsedError;
|
||||
@JsonKey(name: "prefer-h3")
|
||||
bool get preferH3 => throw _privateConstructorUsedError;
|
||||
@JsonKey(name: "use-hosts")
|
||||
@@ -1082,6 +1083,7 @@ abstract class $DnsCopyWith<$Res> {
|
||||
@useResult
|
||||
$Res call(
|
||||
{bool enable,
|
||||
String listen,
|
||||
@JsonKey(name: "prefer-h3") bool preferH3,
|
||||
@JsonKey(name: "use-hosts") bool useHosts,
|
||||
@JsonKey(name: "use-system-hosts") bool useSystemHosts,
|
||||
@@ -1116,6 +1118,7 @@ class _$DnsCopyWithImpl<$Res, $Val extends Dns> implements $DnsCopyWith<$Res> {
|
||||
@override
|
||||
$Res call({
|
||||
Object? enable = null,
|
||||
Object? listen = null,
|
||||
Object? preferH3 = null,
|
||||
Object? useHosts = null,
|
||||
Object? useSystemHosts = null,
|
||||
@@ -1136,6 +1139,10 @@ class _$DnsCopyWithImpl<$Res, $Val extends Dns> implements $DnsCopyWith<$Res> {
|
||||
? _value.enable
|
||||
: enable // ignore: cast_nullable_to_non_nullable
|
||||
as bool,
|
||||
listen: null == listen
|
||||
? _value.listen
|
||||
: listen // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
preferH3: null == preferH3
|
||||
? _value.preferH3
|
||||
: preferH3 // ignore: cast_nullable_to_non_nullable
|
||||
@@ -1214,6 +1221,7 @@ abstract class _$$DnsImplCopyWith<$Res> implements $DnsCopyWith<$Res> {
|
||||
@useResult
|
||||
$Res call(
|
||||
{bool enable,
|
||||
String listen,
|
||||
@JsonKey(name: "prefer-h3") bool preferH3,
|
||||
@JsonKey(name: "use-hosts") bool useHosts,
|
||||
@JsonKey(name: "use-system-hosts") bool useSystemHosts,
|
||||
@@ -1246,6 +1254,7 @@ class __$$DnsImplCopyWithImpl<$Res> extends _$DnsCopyWithImpl<$Res, _$DnsImpl>
|
||||
@override
|
||||
$Res call({
|
||||
Object? enable = null,
|
||||
Object? listen = null,
|
||||
Object? preferH3 = null,
|
||||
Object? useHosts = null,
|
||||
Object? useSystemHosts = null,
|
||||
@@ -1266,6 +1275,10 @@ class __$$DnsImplCopyWithImpl<$Res> extends _$DnsCopyWithImpl<$Res, _$DnsImpl>
|
||||
? _value.enable
|
||||
: enable // ignore: cast_nullable_to_non_nullable
|
||||
as bool,
|
||||
listen: null == listen
|
||||
? _value.listen
|
||||
: listen // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
preferH3: null == preferH3
|
||||
? _value.preferH3
|
||||
: preferH3 // ignore: cast_nullable_to_non_nullable
|
||||
@@ -1331,6 +1344,7 @@ class __$$DnsImplCopyWithImpl<$Res> extends _$DnsCopyWithImpl<$Res, _$DnsImpl>
|
||||
class _$DnsImpl implements _Dns {
|
||||
const _$DnsImpl(
|
||||
{this.enable = true,
|
||||
this.listen = "0.0.0.0:1053",
|
||||
@JsonKey(name: "prefer-h3") this.preferH3 = false,
|
||||
@JsonKey(name: "use-hosts") this.useHosts = true,
|
||||
@JsonKey(name: "use-system-hosts") this.useSystemHosts = true,
|
||||
@@ -1375,6 +1389,9 @@ class _$DnsImpl implements _Dns {
|
||||
@JsonKey()
|
||||
final bool enable;
|
||||
@override
|
||||
@JsonKey()
|
||||
final String listen;
|
||||
@override
|
||||
@JsonKey(name: "prefer-h3")
|
||||
final bool preferH3;
|
||||
@override
|
||||
@@ -1457,7 +1474,7 @@ class _$DnsImpl implements _Dns {
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'Dns(enable: $enable, preferH3: $preferH3, useHosts: $useHosts, useSystemHosts: $useSystemHosts, respectRules: $respectRules, ipv6: $ipv6, defaultNameserver: $defaultNameserver, enhancedMode: $enhancedMode, fakeIpRange: $fakeIpRange, fakeIpFilter: $fakeIpFilter, nameserverPolicy: $nameserverPolicy, nameserver: $nameserver, fallback: $fallback, proxyServerNameserver: $proxyServerNameserver, fallbackFilter: $fallbackFilter)';
|
||||
return 'Dns(enable: $enable, listen: $listen, preferH3: $preferH3, useHosts: $useHosts, useSystemHosts: $useSystemHosts, respectRules: $respectRules, ipv6: $ipv6, defaultNameserver: $defaultNameserver, enhancedMode: $enhancedMode, fakeIpRange: $fakeIpRange, fakeIpFilter: $fakeIpFilter, nameserverPolicy: $nameserverPolicy, nameserver: $nameserver, fallback: $fallback, proxyServerNameserver: $proxyServerNameserver, fallbackFilter: $fallbackFilter)';
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -1466,6 +1483,7 @@ class _$DnsImpl implements _Dns {
|
||||
(other.runtimeType == runtimeType &&
|
||||
other is _$DnsImpl &&
|
||||
(identical(other.enable, enable) || other.enable == enable) &&
|
||||
(identical(other.listen, listen) || other.listen == listen) &&
|
||||
(identical(other.preferH3, preferH3) ||
|
||||
other.preferH3 == preferH3) &&
|
||||
(identical(other.useHosts, useHosts) ||
|
||||
@@ -1499,6 +1517,7 @@ class _$DnsImpl implements _Dns {
|
||||
int get hashCode => Object.hash(
|
||||
runtimeType,
|
||||
enable,
|
||||
listen,
|
||||
preferH3,
|
||||
useHosts,
|
||||
useSystemHosts,
|
||||
@@ -1533,6 +1552,7 @@ class _$DnsImpl implements _Dns {
|
||||
abstract class _Dns implements Dns {
|
||||
const factory _Dns(
|
||||
{final bool enable,
|
||||
final String listen,
|
||||
@JsonKey(name: "prefer-h3") final bool preferH3,
|
||||
@JsonKey(name: "use-hosts") final bool useHosts,
|
||||
@JsonKey(name: "use-system-hosts") final bool useSystemHosts,
|
||||
@@ -1556,6 +1576,8 @@ abstract class _Dns implements Dns {
|
||||
@override
|
||||
bool get enable;
|
||||
@override
|
||||
String get listen;
|
||||
@override
|
||||
@JsonKey(name: "prefer-h3")
|
||||
bool get preferH3;
|
||||
@override
|
||||
@@ -1728,7 +1750,7 @@ class _$GeoXUrlImpl implements _GeoXUrl {
|
||||
{this.mmdb =
|
||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb",
|
||||
this.asn =
|
||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb",
|
||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/GeoLite2-ASN.mmdb",
|
||||
this.geoip =
|
||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat",
|
||||
this.geosite =
|
||||
@@ -1812,6 +1834,202 @@ abstract class _GeoXUrl implements GeoXUrl {
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
ClashConfigSnippet _$ClashConfigSnippetFromJson(Map<String, dynamic> json) {
|
||||
return _ClashConfigSnippet.fromJson(json);
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
mixin _$ClashConfigSnippet {
|
||||
@JsonKey(name: "proxy-groups")
|
||||
List<ProxyGroup> get proxyGroups => throw _privateConstructorUsedError;
|
||||
List<String> get rule => throw _privateConstructorUsedError;
|
||||
|
||||
/// Serializes this ClashConfigSnippet to a JSON map.
|
||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||
|
||||
/// Create a copy of ClashConfigSnippet
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
$ClashConfigSnippetCopyWith<ClashConfigSnippet> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class $ClashConfigSnippetCopyWith<$Res> {
|
||||
factory $ClashConfigSnippetCopyWith(
|
||||
ClashConfigSnippet value, $Res Function(ClashConfigSnippet) then) =
|
||||
_$ClashConfigSnippetCopyWithImpl<$Res, ClashConfigSnippet>;
|
||||
@useResult
|
||||
$Res call(
|
||||
{@JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||
List<String> rule});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class _$ClashConfigSnippetCopyWithImpl<$Res, $Val extends ClashConfigSnippet>
|
||||
implements $ClashConfigSnippetCopyWith<$Res> {
|
||||
_$ClashConfigSnippetCopyWithImpl(this._value, this._then);
|
||||
|
||||
// ignore: unused_field
|
||||
final $Val _value;
|
||||
// ignore: unused_field
|
||||
final $Res Function($Val) _then;
|
||||
|
||||
/// Create a copy of ClashConfigSnippet
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? proxyGroups = null,
|
||||
Object? rule = null,
|
||||
}) {
|
||||
return _then(_value.copyWith(
|
||||
proxyGroups: null == proxyGroups
|
||||
? _value.proxyGroups
|
||||
: proxyGroups // ignore: cast_nullable_to_non_nullable
|
||||
as List<ProxyGroup>,
|
||||
rule: null == rule
|
||||
? _value.rule
|
||||
: rule // ignore: cast_nullable_to_non_nullable
|
||||
as List<String>,
|
||||
) as $Val);
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class _$$ClashConfigSnippetImplCopyWith<$Res>
|
||||
implements $ClashConfigSnippetCopyWith<$Res> {
|
||||
factory _$$ClashConfigSnippetImplCopyWith(_$ClashConfigSnippetImpl value,
|
||||
$Res Function(_$ClashConfigSnippetImpl) then) =
|
||||
__$$ClashConfigSnippetImplCopyWithImpl<$Res>;
|
||||
@override
|
||||
@useResult
|
||||
$Res call(
|
||||
{@JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||
List<String> rule});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class __$$ClashConfigSnippetImplCopyWithImpl<$Res>
|
||||
extends _$ClashConfigSnippetCopyWithImpl<$Res, _$ClashConfigSnippetImpl>
|
||||
implements _$$ClashConfigSnippetImplCopyWith<$Res> {
|
||||
__$$ClashConfigSnippetImplCopyWithImpl(_$ClashConfigSnippetImpl _value,
|
||||
$Res Function(_$ClashConfigSnippetImpl) _then)
|
||||
: super(_value, _then);
|
||||
|
||||
/// Create a copy of ClashConfigSnippet
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? proxyGroups = null,
|
||||
Object? rule = null,
|
||||
}) {
|
||||
return _then(_$ClashConfigSnippetImpl(
|
||||
proxyGroups: null == proxyGroups
|
||||
? _value._proxyGroups
|
||||
: proxyGroups // ignore: cast_nullable_to_non_nullable
|
||||
as List<ProxyGroup>,
|
||||
rule: null == rule
|
||||
? _value._rule
|
||||
: rule // ignore: cast_nullable_to_non_nullable
|
||||
as List<String>,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
@JsonSerializable()
|
||||
class _$ClashConfigSnippetImpl implements _ClashConfigSnippet {
|
||||
const _$ClashConfigSnippetImpl(
|
||||
{@JsonKey(name: "proxy-groups")
|
||||
final List<ProxyGroup> proxyGroups = const [],
|
||||
final List<String> rule = const []})
|
||||
: _proxyGroups = proxyGroups,
|
||||
_rule = rule;
|
||||
|
||||
factory _$ClashConfigSnippetImpl.fromJson(Map<String, dynamic> json) =>
|
||||
_$$ClashConfigSnippetImplFromJson(json);
|
||||
|
||||
final List<ProxyGroup> _proxyGroups;
|
||||
@override
|
||||
@JsonKey(name: "proxy-groups")
|
||||
List<ProxyGroup> get proxyGroups {
|
||||
if (_proxyGroups is EqualUnmodifiableListView) return _proxyGroups;
|
||||
// ignore: implicit_dynamic_type
|
||||
return EqualUnmodifiableListView(_proxyGroups);
|
||||
}
|
||||
|
||||
final List<String> _rule;
|
||||
@override
|
||||
@JsonKey()
|
||||
List<String> get rule {
|
||||
if (_rule is EqualUnmodifiableListView) return _rule;
|
||||
// ignore: implicit_dynamic_type
|
||||
return EqualUnmodifiableListView(_rule);
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'ClashConfigSnippet(proxyGroups: $proxyGroups, rule: $rule)';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType &&
|
||||
other is _$ClashConfigSnippetImpl &&
|
||||
const DeepCollectionEquality()
|
||||
.equals(other._proxyGroups, _proxyGroups) &&
|
||||
const DeepCollectionEquality().equals(other._rule, _rule));
|
||||
}
|
||||
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
int get hashCode => Object.hash(
|
||||
runtimeType,
|
||||
const DeepCollectionEquality().hash(_proxyGroups),
|
||||
const DeepCollectionEquality().hash(_rule));
|
||||
|
||||
/// Create a copy of ClashConfigSnippet
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
@pragma('vm:prefer-inline')
|
||||
_$$ClashConfigSnippetImplCopyWith<_$ClashConfigSnippetImpl> get copyWith =>
|
||||
__$$ClashConfigSnippetImplCopyWithImpl<_$ClashConfigSnippetImpl>(
|
||||
this, _$identity);
|
||||
|
||||
@override
|
||||
Map<String, dynamic> toJson() {
|
||||
return _$$ClashConfigSnippetImplToJson(
|
||||
this,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _ClashConfigSnippet implements ClashConfigSnippet {
|
||||
const factory _ClashConfigSnippet(
|
||||
{@JsonKey(name: "proxy-groups") final List<ProxyGroup> proxyGroups,
|
||||
final List<String> rule}) = _$ClashConfigSnippetImpl;
|
||||
|
||||
factory _ClashConfigSnippet.fromJson(Map<String, dynamic> json) =
|
||||
_$ClashConfigSnippetImpl.fromJson;
|
||||
|
||||
@override
|
||||
@JsonKey(name: "proxy-groups")
|
||||
List<ProxyGroup> get proxyGroups;
|
||||
@override
|
||||
List<String> get rule;
|
||||
|
||||
/// Create a copy of ClashConfigSnippet
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@override
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
_$$ClashConfigSnippetImplCopyWith<_$ClashConfigSnippetImpl> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
ClashConfig _$ClashConfigFromJson(Map<String, dynamic> json) {
|
||||
return _ClashConfig.fromJson(json);
|
||||
}
|
||||
@@ -1844,7 +2062,7 @@ mixin _$ClashConfig {
|
||||
GeodataLoader get geodataLoader => throw _privateConstructorUsedError;
|
||||
@JsonKey(name: "proxy-groups")
|
||||
List<ProxyGroup> get proxyGroups => throw _privateConstructorUsedError;
|
||||
List<String> get rules => throw _privateConstructorUsedError;
|
||||
List<String> get rule => throw _privateConstructorUsedError;
|
||||
@JsonKey(name: "global-ua")
|
||||
String? get globalUa => throw _privateConstructorUsedError;
|
||||
@JsonKey(name: "external-controller")
|
||||
@@ -1885,7 +2103,7 @@ abstract class $ClashConfigCopyWith<$Res> {
|
||||
GeoXUrl geoXUrl,
|
||||
@JsonKey(name: "geodata-loader") GeodataLoader geodataLoader,
|
||||
@JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||
List<String> rules,
|
||||
List<String> rule,
|
||||
@JsonKey(name: "global-ua") String? globalUa,
|
||||
@JsonKey(name: "external-controller")
|
||||
ExternalControllerStatus externalController,
|
||||
@@ -1925,7 +2143,7 @@ class _$ClashConfigCopyWithImpl<$Res, $Val extends ClashConfig>
|
||||
Object? geoXUrl = null,
|
||||
Object? geodataLoader = null,
|
||||
Object? proxyGroups = null,
|
||||
Object? rules = null,
|
||||
Object? rule = null,
|
||||
Object? globalUa = freezed,
|
||||
Object? externalController = null,
|
||||
Object? hosts = null,
|
||||
@@ -1987,9 +2205,9 @@ class _$ClashConfigCopyWithImpl<$Res, $Val extends ClashConfig>
|
||||
? _value.proxyGroups
|
||||
: proxyGroups // ignore: cast_nullable_to_non_nullable
|
||||
as List<ProxyGroup>,
|
||||
rules: null == rules
|
||||
? _value.rules
|
||||
: rules // ignore: cast_nullable_to_non_nullable
|
||||
rule: null == rule
|
||||
? _value.rule
|
||||
: rule // ignore: cast_nullable_to_non_nullable
|
||||
as List<String>,
|
||||
globalUa: freezed == globalUa
|
||||
? _value.globalUa
|
||||
@@ -2062,7 +2280,7 @@ abstract class _$$ClashConfigImplCopyWith<$Res>
|
||||
GeoXUrl geoXUrl,
|
||||
@JsonKey(name: "geodata-loader") GeodataLoader geodataLoader,
|
||||
@JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||
List<String> rules,
|
||||
List<String> rule,
|
||||
@JsonKey(name: "global-ua") String? globalUa,
|
||||
@JsonKey(name: "external-controller")
|
||||
ExternalControllerStatus externalController,
|
||||
@@ -2103,7 +2321,7 @@ class __$$ClashConfigImplCopyWithImpl<$Res>
|
||||
Object? geoXUrl = null,
|
||||
Object? geodataLoader = null,
|
||||
Object? proxyGroups = null,
|
||||
Object? rules = null,
|
||||
Object? rule = null,
|
||||
Object? globalUa = freezed,
|
||||
Object? externalController = null,
|
||||
Object? hosts = null,
|
||||
@@ -2165,9 +2383,9 @@ class __$$ClashConfigImplCopyWithImpl<$Res>
|
||||
? _value._proxyGroups
|
||||
: proxyGroups // ignore: cast_nullable_to_non_nullable
|
||||
as List<ProxyGroup>,
|
||||
rules: null == rules
|
||||
? _value._rules
|
||||
: rules // ignore: cast_nullable_to_non_nullable
|
||||
rule: null == rule
|
||||
? _value._rule
|
||||
: rule // ignore: cast_nullable_to_non_nullable
|
||||
as List<String>,
|
||||
globalUa: freezed == globalUa
|
||||
? _value.globalUa
|
||||
@@ -2208,13 +2426,13 @@ class _$ClashConfigImpl implements _ClashConfig {
|
||||
this.geodataLoader = GeodataLoader.memconservative,
|
||||
@JsonKey(name: "proxy-groups")
|
||||
final List<ProxyGroup> proxyGroups = const [],
|
||||
final List<String> rules = const [],
|
||||
final List<String> rule = const [],
|
||||
@JsonKey(name: "global-ua") this.globalUa,
|
||||
@JsonKey(name: "external-controller")
|
||||
this.externalController = ExternalControllerStatus.close,
|
||||
final Map<String, String> hosts = const {}})
|
||||
: _proxyGroups = proxyGroups,
|
||||
_rules = rules,
|
||||
_rule = rule,
|
||||
_hosts = hosts;
|
||||
|
||||
factory _$ClashConfigImpl.fromJson(Map<String, dynamic> json) =>
|
||||
@@ -2268,13 +2486,13 @@ class _$ClashConfigImpl implements _ClashConfig {
|
||||
return EqualUnmodifiableListView(_proxyGroups);
|
||||
}
|
||||
|
||||
final List<String> _rules;
|
||||
final List<String> _rule;
|
||||
@override
|
||||
@JsonKey()
|
||||
List<String> get rules {
|
||||
if (_rules is EqualUnmodifiableListView) return _rules;
|
||||
List<String> get rule {
|
||||
if (_rule is EqualUnmodifiableListView) return _rule;
|
||||
// ignore: implicit_dynamic_type
|
||||
return EqualUnmodifiableListView(_rules);
|
||||
return EqualUnmodifiableListView(_rule);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -2294,7 +2512,7 @@ class _$ClashConfigImpl implements _ClashConfig {
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'ClashConfig(mixedPort: $mixedPort, mode: $mode, allowLan: $allowLan, logLevel: $logLevel, ipv6: $ipv6, findProcessMode: $findProcessMode, keepAliveInterval: $keepAliveInterval, unifiedDelay: $unifiedDelay, tcpConcurrent: $tcpConcurrent, tun: $tun, dns: $dns, geoXUrl: $geoXUrl, geodataLoader: $geodataLoader, proxyGroups: $proxyGroups, rules: $rules, globalUa: $globalUa, externalController: $externalController, hosts: $hosts)';
|
||||
return 'ClashConfig(mixedPort: $mixedPort, mode: $mode, allowLan: $allowLan, logLevel: $logLevel, ipv6: $ipv6, findProcessMode: $findProcessMode, keepAliveInterval: $keepAliveInterval, unifiedDelay: $unifiedDelay, tcpConcurrent: $tcpConcurrent, tun: $tun, dns: $dns, geoXUrl: $geoXUrl, geodataLoader: $geodataLoader, proxyGroups: $proxyGroups, rule: $rule, globalUa: $globalUa, externalController: $externalController, hosts: $hosts)';
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -2325,7 +2543,7 @@ class _$ClashConfigImpl implements _ClashConfig {
|
||||
other.geodataLoader == geodataLoader) &&
|
||||
const DeepCollectionEquality()
|
||||
.equals(other._proxyGroups, _proxyGroups) &&
|
||||
const DeepCollectionEquality().equals(other._rules, _rules) &&
|
||||
const DeepCollectionEquality().equals(other._rule, _rule) &&
|
||||
(identical(other.globalUa, globalUa) ||
|
||||
other.globalUa == globalUa) &&
|
||||
(identical(other.externalController, externalController) ||
|
||||
@@ -2351,7 +2569,7 @@ class _$ClashConfigImpl implements _ClashConfig {
|
||||
geoXUrl,
|
||||
geodataLoader,
|
||||
const DeepCollectionEquality().hash(_proxyGroups),
|
||||
const DeepCollectionEquality().hash(_rules),
|
||||
const DeepCollectionEquality().hash(_rule),
|
||||
globalUa,
|
||||
externalController,
|
||||
const DeepCollectionEquality().hash(_hosts));
|
||||
@@ -2390,7 +2608,7 @@ abstract class _ClashConfig implements ClashConfig {
|
||||
final GeoXUrl geoXUrl,
|
||||
@JsonKey(name: "geodata-loader") final GeodataLoader geodataLoader,
|
||||
@JsonKey(name: "proxy-groups") final List<ProxyGroup> proxyGroups,
|
||||
final List<String> rules,
|
||||
final List<String> rule,
|
||||
@JsonKey(name: "global-ua") final String? globalUa,
|
||||
@JsonKey(name: "external-controller")
|
||||
final ExternalControllerStatus externalController,
|
||||
@@ -2440,7 +2658,7 @@ abstract class _ClashConfig implements ClashConfig {
|
||||
@JsonKey(name: "proxy-groups")
|
||||
List<ProxyGroup> get proxyGroups;
|
||||
@override
|
||||
List<String> get rules;
|
||||
List<String> get rule;
|
||||
@override
|
||||
@JsonKey(name: "global-ua")
|
||||
String? get globalUa;
|
||||
|
||||
@@ -112,6 +112,7 @@ Map<String, dynamic> _$$FallbackFilterImplToJson(
|
||||
|
||||
_$DnsImpl _$$DnsImplFromJson(Map<String, dynamic> json) => _$DnsImpl(
|
||||
enable: json['enable'] as bool? ?? true,
|
||||
listen: json['listen'] as String? ?? "0.0.0.0:1053",
|
||||
preferH3: json['prefer-h3'] as bool? ?? false,
|
||||
useHosts: json['use-hosts'] as bool? ?? true,
|
||||
useSystemHosts: json['use-system-hosts'] as bool? ?? true,
|
||||
@@ -161,6 +162,7 @@ _$DnsImpl _$$DnsImplFromJson(Map<String, dynamic> json) => _$DnsImpl(
|
||||
|
||||
Map<String, dynamic> _$$DnsImplToJson(_$DnsImpl instance) => <String, dynamic>{
|
||||
'enable': instance.enable,
|
||||
'listen': instance.listen,
|
||||
'prefer-h3': instance.preferH3,
|
||||
'use-hosts': instance.useHosts,
|
||||
'use-system-hosts': instance.useSystemHosts,
|
||||
@@ -189,7 +191,7 @@ _$GeoXUrlImpl _$$GeoXUrlImplFromJson(Map<String, dynamic> json) =>
|
||||
mmdb: json['mmdb'] as String? ??
|
||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb",
|
||||
asn: json['asn'] as String? ??
|
||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb",
|
||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/GeoLite2-ASN.mmdb",
|
||||
geoip: json['geoip'] as String? ??
|
||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat",
|
||||
geosite: json['geosite'] as String? ??
|
||||
@@ -204,6 +206,25 @@ Map<String, dynamic> _$$GeoXUrlImplToJson(_$GeoXUrlImpl instance) =>
|
||||
'geosite': instance.geosite,
|
||||
};
|
||||
|
||||
_$ClashConfigSnippetImpl _$$ClashConfigSnippetImplFromJson(
|
||||
Map<String, dynamic> json) =>
|
||||
_$ClashConfigSnippetImpl(
|
||||
proxyGroups: (json['proxy-groups'] as List<dynamic>?)
|
||||
?.map((e) => ProxyGroup.fromJson(e as Map<String, dynamic>))
|
||||
.toList() ??
|
||||
const [],
|
||||
rule:
|
||||
(json['rule'] as List<dynamic>?)?.map((e) => e as String).toList() ??
|
||||
const [],
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$$ClashConfigSnippetImplToJson(
|
||||
_$ClashConfigSnippetImpl instance) =>
|
||||
<String, dynamic>{
|
||||
'proxy-groups': instance.proxyGroups,
|
||||
'rule': instance.rule,
|
||||
};
|
||||
|
||||
_$ClashConfigImpl _$$ClashConfigImplFromJson(Map<String, dynamic> json) =>
|
||||
_$ClashConfigImpl(
|
||||
mixedPort: (json['mixed-port'] as num?)?.toInt() ?? defaultMixedPort,
|
||||
@@ -236,8 +257,8 @@ _$ClashConfigImpl _$$ClashConfigImplFromJson(Map<String, dynamic> json) =>
|
||||
?.map((e) => ProxyGroup.fromJson(e as Map<String, dynamic>))
|
||||
.toList() ??
|
||||
const [],
|
||||
rules:
|
||||
(json['rules'] as List<dynamic>?)?.map((e) => e as String).toList() ??
|
||||
rule:
|
||||
(json['rule'] as List<dynamic>?)?.map((e) => e as String).toList() ??
|
||||
const [],
|
||||
globalUa: json['global-ua'] as String?,
|
||||
externalController: $enumDecodeNullable(
|
||||
@@ -265,7 +286,7 @@ Map<String, dynamic> _$$ClashConfigImplToJson(_$ClashConfigImpl instance) =>
|
||||
'geox-url': instance.geoXUrl,
|
||||
'geodata-loader': _$GeodataLoaderEnumMap[instance.geodataLoader]!,
|
||||
'proxy-groups': instance.proxyGroups,
|
||||
'rules': instance.rules,
|
||||
'rule': instance.rule,
|
||||
'global-ua': instance.globalUa,
|
||||
'external-controller':
|
||||
_$ExternalControllerStatusEnumMap[instance.externalController]!,
|
||||
|
||||
@@ -1725,8 +1725,7 @@ ThemeProps _$ThemePropsFromJson(Map<String, dynamic> json) {
|
||||
mixin _$ThemeProps {
|
||||
int? get primaryColor => throw _privateConstructorUsedError;
|
||||
ThemeMode get themeMode => throw _privateConstructorUsedError;
|
||||
bool get prueBlack => throw _privateConstructorUsedError;
|
||||
FontFamily get fontFamily => throw _privateConstructorUsedError;
|
||||
bool get pureBlack => throw _privateConstructorUsedError;
|
||||
|
||||
/// Serializes this ThemeProps to a JSON map.
|
||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||
@@ -1744,11 +1743,7 @@ abstract class $ThemePropsCopyWith<$Res> {
|
||||
ThemeProps value, $Res Function(ThemeProps) then) =
|
||||
_$ThemePropsCopyWithImpl<$Res, ThemeProps>;
|
||||
@useResult
|
||||
$Res call(
|
||||
{int? primaryColor,
|
||||
ThemeMode themeMode,
|
||||
bool prueBlack,
|
||||
FontFamily fontFamily});
|
||||
$Res call({int? primaryColor, ThemeMode themeMode, bool pureBlack});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
@@ -1768,8 +1763,7 @@ class _$ThemePropsCopyWithImpl<$Res, $Val extends ThemeProps>
|
||||
$Res call({
|
||||
Object? primaryColor = freezed,
|
||||
Object? themeMode = null,
|
||||
Object? prueBlack = null,
|
||||
Object? fontFamily = null,
|
||||
Object? pureBlack = null,
|
||||
}) {
|
||||
return _then(_value.copyWith(
|
||||
primaryColor: freezed == primaryColor
|
||||
@@ -1780,14 +1774,10 @@ class _$ThemePropsCopyWithImpl<$Res, $Val extends ThemeProps>
|
||||
? _value.themeMode
|
||||
: themeMode // ignore: cast_nullable_to_non_nullable
|
||||
as ThemeMode,
|
||||
prueBlack: null == prueBlack
|
||||
? _value.prueBlack
|
||||
: prueBlack // ignore: cast_nullable_to_non_nullable
|
||||
pureBlack: null == pureBlack
|
||||
? _value.pureBlack
|
||||
: pureBlack // ignore: cast_nullable_to_non_nullable
|
||||
as bool,
|
||||
fontFamily: null == fontFamily
|
||||
? _value.fontFamily
|
||||
: fontFamily // ignore: cast_nullable_to_non_nullable
|
||||
as FontFamily,
|
||||
) as $Val);
|
||||
}
|
||||
}
|
||||
@@ -1800,11 +1790,7 @@ abstract class _$$ThemePropsImplCopyWith<$Res>
|
||||
__$$ThemePropsImplCopyWithImpl<$Res>;
|
||||
@override
|
||||
@useResult
|
||||
$Res call(
|
||||
{int? primaryColor,
|
||||
ThemeMode themeMode,
|
||||
bool prueBlack,
|
||||
FontFamily fontFamily});
|
||||
$Res call({int? primaryColor, ThemeMode themeMode, bool pureBlack});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
@@ -1822,8 +1808,7 @@ class __$$ThemePropsImplCopyWithImpl<$Res>
|
||||
$Res call({
|
||||
Object? primaryColor = freezed,
|
||||
Object? themeMode = null,
|
||||
Object? prueBlack = null,
|
||||
Object? fontFamily = null,
|
||||
Object? pureBlack = null,
|
||||
}) {
|
||||
return _then(_$ThemePropsImpl(
|
||||
primaryColor: freezed == primaryColor
|
||||
@@ -1834,14 +1819,10 @@ class __$$ThemePropsImplCopyWithImpl<$Res>
|
||||
? _value.themeMode
|
||||
: themeMode // ignore: cast_nullable_to_non_nullable
|
||||
as ThemeMode,
|
||||
prueBlack: null == prueBlack
|
||||
? _value.prueBlack
|
||||
: prueBlack // ignore: cast_nullable_to_non_nullable
|
||||
pureBlack: null == pureBlack
|
||||
? _value.pureBlack
|
||||
: pureBlack // ignore: cast_nullable_to_non_nullable
|
||||
as bool,
|
||||
fontFamily: null == fontFamily
|
||||
? _value.fontFamily
|
||||
: fontFamily // ignore: cast_nullable_to_non_nullable
|
||||
as FontFamily,
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -1852,8 +1833,7 @@ class _$ThemePropsImpl implements _ThemeProps {
|
||||
const _$ThemePropsImpl(
|
||||
{this.primaryColor,
|
||||
this.themeMode = ThemeMode.system,
|
||||
this.prueBlack = false,
|
||||
this.fontFamily = FontFamily.system});
|
||||
this.pureBlack = false});
|
||||
|
||||
factory _$ThemePropsImpl.fromJson(Map<String, dynamic> json) =>
|
||||
_$$ThemePropsImplFromJson(json);
|
||||
@@ -1865,14 +1845,11 @@ class _$ThemePropsImpl implements _ThemeProps {
|
||||
final ThemeMode themeMode;
|
||||
@override
|
||||
@JsonKey()
|
||||
final bool prueBlack;
|
||||
@override
|
||||
@JsonKey()
|
||||
final FontFamily fontFamily;
|
||||
final bool pureBlack;
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'ThemeProps(primaryColor: $primaryColor, themeMode: $themeMode, prueBlack: $prueBlack, fontFamily: $fontFamily)';
|
||||
return 'ThemeProps(primaryColor: $primaryColor, themeMode: $themeMode, pureBlack: $pureBlack)';
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -1884,16 +1861,14 @@ class _$ThemePropsImpl implements _ThemeProps {
|
||||
other.primaryColor == primaryColor) &&
|
||||
(identical(other.themeMode, themeMode) ||
|
||||
other.themeMode == themeMode) &&
|
||||
(identical(other.prueBlack, prueBlack) ||
|
||||
other.prueBlack == prueBlack) &&
|
||||
(identical(other.fontFamily, fontFamily) ||
|
||||
other.fontFamily == fontFamily));
|
||||
(identical(other.pureBlack, pureBlack) ||
|
||||
other.pureBlack == pureBlack));
|
||||
}
|
||||
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
int get hashCode =>
|
||||
Object.hash(runtimeType, primaryColor, themeMode, prueBlack, fontFamily);
|
||||
Object.hash(runtimeType, primaryColor, themeMode, pureBlack);
|
||||
|
||||
/// Create a copy of ThemeProps
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@@ -1915,8 +1890,7 @@ abstract class _ThemeProps implements ThemeProps {
|
||||
const factory _ThemeProps(
|
||||
{final int? primaryColor,
|
||||
final ThemeMode themeMode,
|
||||
final bool prueBlack,
|
||||
final FontFamily fontFamily}) = _$ThemePropsImpl;
|
||||
final bool pureBlack}) = _$ThemePropsImpl;
|
||||
|
||||
factory _ThemeProps.fromJson(Map<String, dynamic> json) =
|
||||
_$ThemePropsImpl.fromJson;
|
||||
@@ -1926,9 +1900,7 @@ abstract class _ThemeProps implements ThemeProps {
|
||||
@override
|
||||
ThemeMode get themeMode;
|
||||
@override
|
||||
bool get prueBlack;
|
||||
@override
|
||||
FontFamily get fontFamily;
|
||||
bool get pureBlack;
|
||||
|
||||
/// Create a copy of ThemeProps
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
|
||||
@@ -224,18 +224,14 @@ _$ThemePropsImpl _$$ThemePropsImplFromJson(Map<String, dynamic> json) =>
|
||||
primaryColor: (json['primaryColor'] as num?)?.toInt(),
|
||||
themeMode: $enumDecodeNullable(_$ThemeModeEnumMap, json['themeMode']) ??
|
||||
ThemeMode.system,
|
||||
prueBlack: json['prueBlack'] as bool? ?? false,
|
||||
fontFamily:
|
||||
$enumDecodeNullable(_$FontFamilyEnumMap, json['fontFamily']) ??
|
||||
FontFamily.system,
|
||||
pureBlack: json['pureBlack'] as bool? ?? false,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$$ThemePropsImplToJson(_$ThemePropsImpl instance) =>
|
||||
<String, dynamic>{
|
||||
'primaryColor': instance.primaryColor,
|
||||
'themeMode': _$ThemeModeEnumMap[instance.themeMode]!,
|
||||
'prueBlack': instance.prueBlack,
|
||||
'fontFamily': _$FontFamilyEnumMap[instance.fontFamily]!,
|
||||
'pureBlack': instance.pureBlack,
|
||||
};
|
||||
|
||||
const _$ThemeModeEnumMap = {
|
||||
@@ -244,13 +240,6 @@ const _$ThemeModeEnumMap = {
|
||||
ThemeMode.dark: 'dark',
|
||||
};
|
||||
|
||||
const _$FontFamilyEnumMap = {
|
||||
FontFamily.system: 'system',
|
||||
FontFamily.miSans: 'miSans',
|
||||
FontFamily.twEmoji: 'twEmoji',
|
||||
FontFamily.icon: 'icon',
|
||||
};
|
||||
|
||||
_$ConfigImpl _$$ConfigImplFromJson(Map<String, dynamic> json) => _$ConfigImpl(
|
||||
appSetting: json['appSetting'] == null
|
||||
? defaultAppSettingProps
|
||||
|
||||
@@ -14,6 +14,153 @@ T _$identity<T>(T value) => value;
|
||||
final _privateConstructorUsedError = UnsupportedError(
|
||||
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
|
||||
|
||||
/// @nodoc
|
||||
mixin _$VM2<A, B> {
|
||||
A get a => throw _privateConstructorUsedError;
|
||||
B get b => throw _privateConstructorUsedError;
|
||||
|
||||
/// Create a copy of VM2
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
$VM2CopyWith<A, B, VM2<A, B>> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class $VM2CopyWith<A, B, $Res> {
|
||||
factory $VM2CopyWith(VM2<A, B> value, $Res Function(VM2<A, B>) then) =
|
||||
_$VM2CopyWithImpl<A, B, $Res, VM2<A, B>>;
|
||||
@useResult
|
||||
$Res call({A a, B b});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class _$VM2CopyWithImpl<A, B, $Res, $Val extends VM2<A, B>>
|
||||
implements $VM2CopyWith<A, B, $Res> {
|
||||
_$VM2CopyWithImpl(this._value, this._then);
|
||||
|
||||
// ignore: unused_field
|
||||
final $Val _value;
|
||||
// ignore: unused_field
|
||||
final $Res Function($Val) _then;
|
||||
|
||||
/// Create a copy of VM2
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? a = freezed,
|
||||
Object? b = freezed,
|
||||
}) {
|
||||
return _then(_value.copyWith(
|
||||
a: freezed == a
|
||||
? _value.a
|
||||
: a // ignore: cast_nullable_to_non_nullable
|
||||
as A,
|
||||
b: freezed == b
|
||||
? _value.b
|
||||
: b // ignore: cast_nullable_to_non_nullable
|
||||
as B,
|
||||
) as $Val);
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class _$$VM2ImplCopyWith<A, B, $Res>
|
||||
implements $VM2CopyWith<A, B, $Res> {
|
||||
factory _$$VM2ImplCopyWith(
|
||||
_$VM2Impl<A, B> value, $Res Function(_$VM2Impl<A, B>) then) =
|
||||
__$$VM2ImplCopyWithImpl<A, B, $Res>;
|
||||
@override
|
||||
@useResult
|
||||
$Res call({A a, B b});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class __$$VM2ImplCopyWithImpl<A, B, $Res>
|
||||
extends _$VM2CopyWithImpl<A, B, $Res, _$VM2Impl<A, B>>
|
||||
implements _$$VM2ImplCopyWith<A, B, $Res> {
|
||||
__$$VM2ImplCopyWithImpl(
|
||||
_$VM2Impl<A, B> _value, $Res Function(_$VM2Impl<A, B>) _then)
|
||||
: super(_value, _then);
|
||||
|
||||
/// Create a copy of VM2
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? a = freezed,
|
||||
Object? b = freezed,
|
||||
}) {
|
||||
return _then(_$VM2Impl<A, B>(
|
||||
a: freezed == a
|
||||
? _value.a
|
||||
: a // ignore: cast_nullable_to_non_nullable
|
||||
as A,
|
||||
b: freezed == b
|
||||
? _value.b
|
||||
: b // ignore: cast_nullable_to_non_nullable
|
||||
as B,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
class _$VM2Impl<A, B> implements _VM2<A, B> {
|
||||
const _$VM2Impl({required this.a, required this.b});
|
||||
|
||||
@override
|
||||
final A a;
|
||||
@override
|
||||
final B b;
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'VM2<$A, $B>(a: $a, b: $b)';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType &&
|
||||
other is _$VM2Impl<A, B> &&
|
||||
const DeepCollectionEquality().equals(other.a, a) &&
|
||||
const DeepCollectionEquality().equals(other.b, b));
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(
|
||||
runtimeType,
|
||||
const DeepCollectionEquality().hash(a),
|
||||
const DeepCollectionEquality().hash(b));
|
||||
|
||||
/// Create a copy of VM2
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
@pragma('vm:prefer-inline')
|
||||
_$$VM2ImplCopyWith<A, B, _$VM2Impl<A, B>> get copyWith =>
|
||||
__$$VM2ImplCopyWithImpl<A, B, _$VM2Impl<A, B>>(this, _$identity);
|
||||
}
|
||||
|
||||
abstract class _VM2<A, B> implements VM2<A, B> {
|
||||
const factory _VM2({required final A a, required final B b}) =
|
||||
_$VM2Impl<A, B>;
|
||||
|
||||
@override
|
||||
A get a;
|
||||
@override
|
||||
B get b;
|
||||
|
||||
/// Create a copy of VM2
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@override
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
_$$VM2ImplCopyWith<A, B, _$VM2Impl<A, B>> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
mixin _$StartButtonSelectorState {
|
||||
bool get isInit => throw _privateConstructorUsedError;
|
||||
@@ -3325,6 +3472,154 @@ abstract class _DashboardState implements DashboardState {
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
mixin _$ProxyCardState {
|
||||
String get proxyName => throw _privateConstructorUsedError;
|
||||
String? get testUrl => throw _privateConstructorUsedError;
|
||||
|
||||
/// Create a copy of ProxyCardState
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
$ProxyCardStateCopyWith<ProxyCardState> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class $ProxyCardStateCopyWith<$Res> {
|
||||
factory $ProxyCardStateCopyWith(
|
||||
ProxyCardState value, $Res Function(ProxyCardState) then) =
|
||||
_$ProxyCardStateCopyWithImpl<$Res, ProxyCardState>;
|
||||
@useResult
|
||||
$Res call({String proxyName, String? testUrl});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class _$ProxyCardStateCopyWithImpl<$Res, $Val extends ProxyCardState>
|
||||
implements $ProxyCardStateCopyWith<$Res> {
|
||||
_$ProxyCardStateCopyWithImpl(this._value, this._then);
|
||||
|
||||
// ignore: unused_field
|
||||
final $Val _value;
|
||||
// ignore: unused_field
|
||||
final $Res Function($Val) _then;
|
||||
|
||||
/// Create a copy of ProxyCardState
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? proxyName = null,
|
||||
Object? testUrl = freezed,
|
||||
}) {
|
||||
return _then(_value.copyWith(
|
||||
proxyName: null == proxyName
|
||||
? _value.proxyName
|
||||
: proxyName // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
testUrl: freezed == testUrl
|
||||
? _value.testUrl
|
||||
: testUrl // ignore: cast_nullable_to_non_nullable
|
||||
as String?,
|
||||
) as $Val);
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class _$$ProxyCardStateImplCopyWith<$Res>
|
||||
implements $ProxyCardStateCopyWith<$Res> {
|
||||
factory _$$ProxyCardStateImplCopyWith(_$ProxyCardStateImpl value,
|
||||
$Res Function(_$ProxyCardStateImpl) then) =
|
||||
__$$ProxyCardStateImplCopyWithImpl<$Res>;
|
||||
@override
|
||||
@useResult
|
||||
$Res call({String proxyName, String? testUrl});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class __$$ProxyCardStateImplCopyWithImpl<$Res>
|
||||
extends _$ProxyCardStateCopyWithImpl<$Res, _$ProxyCardStateImpl>
|
||||
implements _$$ProxyCardStateImplCopyWith<$Res> {
|
||||
__$$ProxyCardStateImplCopyWithImpl(
|
||||
_$ProxyCardStateImpl _value, $Res Function(_$ProxyCardStateImpl) _then)
|
||||
: super(_value, _then);
|
||||
|
||||
/// Create a copy of ProxyCardState
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? proxyName = null,
|
||||
Object? testUrl = freezed,
|
||||
}) {
|
||||
return _then(_$ProxyCardStateImpl(
|
||||
proxyName: null == proxyName
|
||||
? _value.proxyName
|
||||
: proxyName // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
testUrl: freezed == testUrl
|
||||
? _value.testUrl
|
||||
: testUrl // ignore: cast_nullable_to_non_nullable
|
||||
as String?,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
class _$ProxyCardStateImpl implements _ProxyCardState {
|
||||
const _$ProxyCardStateImpl({required this.proxyName, this.testUrl});
|
||||
|
||||
@override
|
||||
final String proxyName;
|
||||
@override
|
||||
final String? testUrl;
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'ProxyCardState(proxyName: $proxyName, testUrl: $testUrl)';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType &&
|
||||
other is _$ProxyCardStateImpl &&
|
||||
(identical(other.proxyName, proxyName) ||
|
||||
other.proxyName == proxyName) &&
|
||||
(identical(other.testUrl, testUrl) || other.testUrl == testUrl));
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType, proxyName, testUrl);
|
||||
|
||||
/// Create a copy of ProxyCardState
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
@pragma('vm:prefer-inline')
|
||||
_$$ProxyCardStateImplCopyWith<_$ProxyCardStateImpl> get copyWith =>
|
||||
__$$ProxyCardStateImplCopyWithImpl<_$ProxyCardStateImpl>(
|
||||
this, _$identity);
|
||||
}
|
||||
|
||||
abstract class _ProxyCardState implements ProxyCardState {
|
||||
const factory _ProxyCardState(
|
||||
{required final String proxyName,
|
||||
final String? testUrl}) = _$ProxyCardStateImpl;
|
||||
|
||||
@override
|
||||
String get proxyName;
|
||||
@override
|
||||
String? get testUrl;
|
||||
|
||||
/// Create a copy of ProxyCardState
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@override
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
_$$ProxyCardStateImplCopyWith<_$ProxyCardStateImpl> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
mixin _$VpnState {
|
||||
TunStack get stack => throw _privateConstructorUsedError;
|
||||
|
||||
@@ -7,6 +7,15 @@ import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
||||
part 'generated/selector.freezed.dart';
|
||||
|
||||
@freezed
|
||||
class VM2<A, B> with _$VM2<A, B> {
|
||||
const factory VM2({
|
||||
required A a,
|
||||
required B b,
|
||||
}) = _VM2;
|
||||
}
|
||||
|
||||
|
||||
@freezed
|
||||
class StartButtonSelectorState with _$StartButtonSelectorState {
|
||||
const factory StartButtonSelectorState({
|
||||
@@ -134,18 +143,19 @@ extension PackageListSelectorStateExt on PackageListSelectorState {
|
||||
return packages
|
||||
.where((item) => isFilterSystemApp ? item.isSystem == false : true)
|
||||
.sorted(
|
||||
(a, b) {
|
||||
(a, b) {
|
||||
return switch (sort) {
|
||||
AccessSortType.none => 0,
|
||||
AccessSortType.name => other.sortByChar(
|
||||
other.getPinyin(a.label),
|
||||
other.getPinyin(b.label),
|
||||
),
|
||||
AccessSortType.name =>
|
||||
other.sortByChar(
|
||||
other.getPinyin(a.label),
|
||||
other.getPinyin(b.label),
|
||||
),
|
||||
AccessSortType.time => b.lastUpdateTime.compareTo(a.lastUpdateTime),
|
||||
};
|
||||
},
|
||||
).sorted(
|
||||
(a, b) {
|
||||
(a, b) {
|
||||
final isSelectA = selectedList.contains(a.packageName);
|
||||
final isSelectB = selectedList.contains(b.packageName);
|
||||
if (isSelectA && isSelectB) return 0;
|
||||
@@ -200,6 +210,14 @@ class DashboardState with _$DashboardState {
|
||||
}) = _DashboardState;
|
||||
}
|
||||
|
||||
@freezed
|
||||
class ProxyCardState with _$ProxyCardState {
|
||||
const factory ProxyCardState({
|
||||
required String proxyName,
|
||||
String? testUrl,
|
||||
}) = _ProxyCardState;
|
||||
}
|
||||
|
||||
@freezed
|
||||
class VpnState with _$VpnState {
|
||||
const factory VpnState({
|
||||
|
||||
@@ -23,7 +23,7 @@ class HomePage extends StatelessWidget {
|
||||
final navigationItems = state.navigationItems;
|
||||
final pageLabel = state.pageLabel;
|
||||
final index = navigationItems.lastIndexWhere(
|
||||
(element) => element.label == pageLabel,
|
||||
(element) => element.label == pageLabel,
|
||||
);
|
||||
final currentIndex = index == -1 ? 0 : index;
|
||||
final navigationBar = CommonNavigationBar(
|
||||
@@ -32,9 +32,9 @@ class HomePage extends StatelessWidget {
|
||||
currentIndex: currentIndex,
|
||||
);
|
||||
final bottomNavigationBar =
|
||||
viewMode == ViewMode.mobile ? navigationBar : null;
|
||||
viewMode == ViewMode.mobile ? navigationBar : null;
|
||||
final sideNavigationBar =
|
||||
viewMode != ViewMode.mobile ? navigationBar : null;
|
||||
viewMode != ViewMode.mobile ? navigationBar : null;
|
||||
return CommonScaffold(
|
||||
key: globalState.homeScaffoldKey,
|
||||
title: Intl.message(
|
||||
@@ -62,7 +62,7 @@ class _HomePageViewState extends ConsumerState<_HomePageView> {
|
||||
_updatePageController(List<NavigationItem> navigationItems) {
|
||||
final pageLabel = globalState.appState.pageLabel;
|
||||
final index = navigationItems.lastIndexWhere(
|
||||
(element) => element.label == pageLabel,
|
||||
(element) => element.label == pageLabel,
|
||||
);
|
||||
final pageIndex = index == -1 ? 0 : index;
|
||||
if (globalState.pageController != null) {
|
||||
@@ -155,17 +155,20 @@ class CommonNavigationBar extends ConsumerWidget {
|
||||
Widget build(BuildContext context, ref) {
|
||||
_updateSafeMessageOffset(context);
|
||||
if (viewMode == ViewMode.mobile) {
|
||||
return NavigationBar(
|
||||
destinations: navigationItems
|
||||
.map(
|
||||
(e) => NavigationDestination(
|
||||
icon: e.icon,
|
||||
label: Intl.message(e.label.name),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
onDestinationSelected: globalState.appController.toPage,
|
||||
selectedIndex: currentIndex,
|
||||
return NavigationBarTheme(
|
||||
data: _NavigationBarDefaultsM3(context),
|
||||
child: NavigationBar(
|
||||
destinations: navigationItems
|
||||
.map(
|
||||
(e) => NavigationDestination(
|
||||
icon: e.icon,
|
||||
label: Intl.message(e.label.name),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
onDestinationSelected: globalState.appController.toPage,
|
||||
selectedIndex: currentIndex,
|
||||
),
|
||||
);
|
||||
}
|
||||
final showLabel = ref.watch(appSettingProvider).showLabel;
|
||||
@@ -185,22 +188,22 @@ class CommonNavigationBar extends ConsumerWidget {
|
||||
color: context.colorScheme.onSurfaceVariant,
|
||||
),
|
||||
selectedLabelTextStyle:
|
||||
context.textTheme.labelLarge!.copyWith(
|
||||
context.textTheme.labelLarge!.copyWith(
|
||||
color: context.colorScheme.onSurface,
|
||||
),
|
||||
unselectedLabelTextStyle:
|
||||
context.textTheme.labelLarge!.copyWith(
|
||||
context.textTheme.labelLarge!.copyWith(
|
||||
color: context.colorScheme.onSurface,
|
||||
),
|
||||
destinations: navigationItems
|
||||
.map(
|
||||
(e) => NavigationRailDestination(
|
||||
icon: e.icon,
|
||||
label: Text(
|
||||
Intl.message(e.label.name),
|
||||
),
|
||||
),
|
||||
)
|
||||
icon: e.icon,
|
||||
label: Text(
|
||||
Intl.message(e.label.name),
|
||||
),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
onDestinationSelected: globalState.appController.toPage,
|
||||
extended: false,
|
||||
@@ -219,9 +222,9 @@ class CommonNavigationBar extends ConsumerWidget {
|
||||
onPressed: () {
|
||||
ref.read(appSettingProvider.notifier).updateState(
|
||||
(state) => state.copyWith(
|
||||
showLabel: !state.showLabel,
|
||||
),
|
||||
);
|
||||
showLabel: !state.showLabel,
|
||||
),
|
||||
);
|
||||
},
|
||||
icon: const Icon(Icons.menu),
|
||||
),
|
||||
@@ -233,3 +236,59 @@ class CommonNavigationBar extends ConsumerWidget {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _NavigationBarDefaultsM3 extends NavigationBarThemeData {
|
||||
_NavigationBarDefaultsM3(this.context)
|
||||
: super(
|
||||
height: 80.0,
|
||||
elevation: 3.0,
|
||||
labelBehavior: NavigationDestinationLabelBehavior.alwaysShow,
|
||||
);
|
||||
|
||||
final BuildContext context;
|
||||
late final ColorScheme _colors = Theme.of(context).colorScheme;
|
||||
late final TextTheme _textTheme = Theme.of(context).textTheme;
|
||||
|
||||
@override
|
||||
Color? get backgroundColor => _colors.surfaceContainer;
|
||||
|
||||
@override
|
||||
Color? get shadowColor => Colors.transparent;
|
||||
|
||||
@override
|
||||
Color? get surfaceTintColor => Colors.transparent;
|
||||
|
||||
@override
|
||||
WidgetStateProperty<IconThemeData?>? get iconTheme {
|
||||
return WidgetStateProperty.resolveWith((Set<WidgetState> states) {
|
||||
return IconThemeData(
|
||||
size: 24.0,
|
||||
color: states.contains(WidgetState.disabled)
|
||||
? _colors.onSurfaceVariant.withOpacity(0.38)
|
||||
: states.contains(WidgetState.selected)
|
||||
? _colors.onSecondaryContainer
|
||||
: _colors.onSurfaceVariant,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Color? get indicatorColor => _colors.secondaryContainer;
|
||||
|
||||
@override
|
||||
ShapeBorder? get indicatorShape => const StadiumBorder();
|
||||
|
||||
@override
|
||||
WidgetStateProperty<TextStyle?>? get labelTextStyle {
|
||||
return WidgetStateProperty.resolveWith((Set<WidgetState> states) {
|
||||
final TextStyle style = _textTheme.labelMedium!;
|
||||
return style.apply(
|
||||
overflow: TextOverflow.ellipsis,
|
||||
color: states.contains(WidgetState.disabled)
|
||||
? _colors.onSurfaceVariant.withOpacity(0.38)
|
||||
: states.contains(WidgetState.selected)
|
||||
? _colors.onSurface
|
||||
: _colors.onSurfaceVariant);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
||||
part 'generated/app.g.dart';
|
||||
|
||||
|
||||
@riverpod
|
||||
class Logs extends _$Logs with AutoDisposeNotifierMixin {
|
||||
@override
|
||||
@@ -336,4 +335,3 @@ class DelayDataSource extends _$DelayDataSource with AutoDisposeNotifierMixin {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ final currentGroupsStateProvider = AutoDisposeProvider<GroupsState>.internal(
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
typedef CurrentGroupsStateRef = AutoDisposeProviderRef<GroupsState>;
|
||||
String _$navigationsStateHash() => r'3c57f9161625f0376679cfe8b1cce0beadd709a7';
|
||||
String _$navigationsStateHash() => r'802ae70cc8b7d7f5620b340911da89d74960bfbd';
|
||||
|
||||
/// See also [navigationsState].
|
||||
@ProviderFor(navigationsState)
|
||||
@@ -95,7 +95,7 @@ final clashConfigStateProvider = AutoDisposeProvider<ClashConfigState>.internal(
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
typedef ClashConfigStateRef = AutoDisposeProviderRef<ClashConfigState>;
|
||||
String _$proxyStateHash() => r'418464d2ab29bb701ff001ca80396526fd2c8d3a';
|
||||
String _$proxyStateHash() => r'22478fb593aaca11dfe2cf64472013190475a5bc';
|
||||
|
||||
/// See also [proxyState].
|
||||
@ProviderFor(proxyState)
|
||||
@@ -111,7 +111,7 @@ final proxyStateProvider = AutoDisposeProvider<ProxyState>.internal(
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
typedef ProxyStateRef = AutoDisposeProviderRef<ProxyState>;
|
||||
String _$trayStateHash() => r'06ff742a92893667a30bc6a25d13594d83dd74fc';
|
||||
String _$trayStateHash() => r'39ff84c50ad9c9cc666fa2538fe13ec0d7236b2e';
|
||||
|
||||
/// See also [trayState].
|
||||
@ProviderFor(trayState)
|
||||
@@ -292,7 +292,7 @@ final groupNamesStateProvider = AutoDisposeProvider<GroupNamesState>.internal(
|
||||
// ignore: unused_element
|
||||
typedef GroupNamesStateRef = AutoDisposeProviderRef<GroupNamesState>;
|
||||
String _$proxyGroupSelectorStateHash() =>
|
||||
r'b76f5ad536469e11a4ffa6a262dd4df61d280823';
|
||||
r'5bc86d13286c6c859f0b874235a281122cc612ba';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
@@ -766,7 +766,7 @@ class _GetRealTestUrlProviderElement extends AutoDisposeProviderElement<String>
|
||||
String? get testUrl => (origin as GetRealTestUrlProvider).testUrl;
|
||||
}
|
||||
|
||||
String _$getDelayHash() => r'dbc584d16f24abbc548d4c560ef50d172db23818';
|
||||
String _$getDelayHash() => r'b5920ac7de0aaadb8ff63fac993bd90ff87cd25a';
|
||||
|
||||
/// See also [getDelay].
|
||||
@ProviderFor(getDelay)
|
||||
@@ -1108,29 +1108,29 @@ final getProxiesColumnsProvider = AutoDisposeProvider<int>.internal(
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
typedef GetProxiesColumnsRef = AutoDisposeProviderRef<int>;
|
||||
String _$getRealProxyNameHash() => r'47be6d115aa170f9bff610ec2cf7669e168bf472';
|
||||
String _$getProxyCardStateHash() => r'0f131148cb5ed60c9c4c4f31fbe32f114ac346bb';
|
||||
|
||||
/// See also [getRealProxyName].
|
||||
@ProviderFor(getRealProxyName)
|
||||
const getRealProxyNameProvider = GetRealProxyNameFamily();
|
||||
/// See also [getProxyCardState].
|
||||
@ProviderFor(getProxyCardState)
|
||||
const getProxyCardStateProvider = GetProxyCardStateFamily();
|
||||
|
||||
/// See also [getRealProxyName].
|
||||
class GetRealProxyNameFamily extends Family<String> {
|
||||
/// See also [getRealProxyName].
|
||||
const GetRealProxyNameFamily();
|
||||
/// See also [getProxyCardState].
|
||||
class GetProxyCardStateFamily extends Family<ProxyCardState> {
|
||||
/// See also [getProxyCardState].
|
||||
const GetProxyCardStateFamily();
|
||||
|
||||
/// See also [getRealProxyName].
|
||||
GetRealProxyNameProvider call(
|
||||
/// See also [getProxyCardState].
|
||||
GetProxyCardStateProvider call(
|
||||
String proxyName,
|
||||
) {
|
||||
return GetRealProxyNameProvider(
|
||||
return GetProxyCardStateProvider(
|
||||
proxyName,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
GetRealProxyNameProvider getProviderOverride(
|
||||
covariant GetRealProxyNameProvider provider,
|
||||
GetProxyCardStateProvider getProviderOverride(
|
||||
covariant GetProxyCardStateProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.proxyName,
|
||||
@@ -1149,32 +1149,32 @@ class GetRealProxyNameFamily extends Family<String> {
|
||||
_allTransitiveDependencies;
|
||||
|
||||
@override
|
||||
String? get name => r'getRealProxyNameProvider';
|
||||
String? get name => r'getProxyCardStateProvider';
|
||||
}
|
||||
|
||||
/// See also [getRealProxyName].
|
||||
class GetRealProxyNameProvider extends AutoDisposeProvider<String> {
|
||||
/// See also [getRealProxyName].
|
||||
GetRealProxyNameProvider(
|
||||
/// See also [getProxyCardState].
|
||||
class GetProxyCardStateProvider extends AutoDisposeProvider<ProxyCardState> {
|
||||
/// See also [getProxyCardState].
|
||||
GetProxyCardStateProvider(
|
||||
String proxyName,
|
||||
) : this._internal(
|
||||
(ref) => getRealProxyName(
|
||||
ref as GetRealProxyNameRef,
|
||||
(ref) => getProxyCardState(
|
||||
ref as GetProxyCardStateRef,
|
||||
proxyName,
|
||||
),
|
||||
from: getRealProxyNameProvider,
|
||||
name: r'getRealProxyNameProvider',
|
||||
from: getProxyCardStateProvider,
|
||||
name: r'getProxyCardStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$getRealProxyNameHash,
|
||||
dependencies: GetRealProxyNameFamily._dependencies,
|
||||
: _$getProxyCardStateHash,
|
||||
dependencies: GetProxyCardStateFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
GetRealProxyNameFamily._allTransitiveDependencies,
|
||||
GetProxyCardStateFamily._allTransitiveDependencies,
|
||||
proxyName: proxyName,
|
||||
);
|
||||
|
||||
GetRealProxyNameProvider._internal(
|
||||
GetProxyCardStateProvider._internal(
|
||||
super._createNotifier, {
|
||||
required super.name,
|
||||
required super.dependencies,
|
||||
@@ -1188,12 +1188,12 @@ class GetRealProxyNameProvider extends AutoDisposeProvider<String> {
|
||||
|
||||
@override
|
||||
Override overrideWith(
|
||||
String Function(GetRealProxyNameRef provider) create,
|
||||
ProxyCardState Function(GetProxyCardStateRef provider) create,
|
||||
) {
|
||||
return ProviderOverride(
|
||||
origin: this,
|
||||
override: GetRealProxyNameProvider._internal(
|
||||
(ref) => create(ref as GetRealProxyNameRef),
|
||||
override: GetProxyCardStateProvider._internal(
|
||||
(ref) => create(ref as GetProxyCardStateRef),
|
||||
from: from,
|
||||
name: null,
|
||||
dependencies: null,
|
||||
@@ -1205,13 +1205,13 @@ class GetRealProxyNameProvider extends AutoDisposeProvider<String> {
|
||||
}
|
||||
|
||||
@override
|
||||
AutoDisposeProviderElement<String> createElement() {
|
||||
return _GetRealProxyNameProviderElement(this);
|
||||
AutoDisposeProviderElement<ProxyCardState> createElement() {
|
||||
return _GetProxyCardStateProviderElement(this);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is GetRealProxyNameProvider && other.proxyName == proxyName;
|
||||
return other is GetProxyCardStateProvider && other.proxyName == proxyName;
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -1225,17 +1225,18 @@ class GetRealProxyNameProvider extends AutoDisposeProvider<String> {
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
mixin GetRealProxyNameRef on AutoDisposeProviderRef<String> {
|
||||
mixin GetProxyCardStateRef on AutoDisposeProviderRef<ProxyCardState> {
|
||||
/// The parameter `proxyName` of this provider.
|
||||
String get proxyName;
|
||||
}
|
||||
|
||||
class _GetRealProxyNameProviderElement
|
||||
extends AutoDisposeProviderElement<String> with GetRealProxyNameRef {
|
||||
_GetRealProxyNameProviderElement(super.provider);
|
||||
class _GetProxyCardStateProviderElement
|
||||
extends AutoDisposeProviderElement<ProxyCardState>
|
||||
with GetProxyCardStateRef {
|
||||
_GetProxyCardStateProviderElement(super.provider);
|
||||
|
||||
@override
|
||||
String get proxyName => (origin as GetRealProxyNameProvider).proxyName;
|
||||
String get proxyName => (origin as GetProxyCardStateProvider).proxyName;
|
||||
}
|
||||
|
||||
String _$getProxyNameHash() => r'204a477ea18c8e1eeef55b3efd3d47e45b0d2350';
|
||||
@@ -1500,7 +1501,7 @@ class _GetSelectedProxyNameProviderElement
|
||||
String get groupName => (origin as GetSelectedProxyNameProvider).groupName;
|
||||
}
|
||||
|
||||
String _$getProxyDescHash() => r'7c06402957387c35d9dc515ca109f8f7dbb481b0';
|
||||
String _$getProxyDescHash() => r'c173fe2393d9c4f5d5d17480e69f9126bb76a17d';
|
||||
|
||||
/// See also [getProxyDesc].
|
||||
@ProviderFor(getProxyDesc)
|
||||
|
||||
@@ -29,7 +29,8 @@ GroupsState currentGroupsState(Ref ref) {
|
||||
@riverpod
|
||||
NavigationItemsState navigationsState(Ref ref) {
|
||||
final openLogs = ref.watch(appSettingProvider).openLogs;
|
||||
final hasProxies = ref.watch(currentGroupsStateProvider.select((state)=>state.value.isNotEmpty));
|
||||
final hasProxies = ref.watch(
|
||||
currentGroupsStateProvider.select((state) => state.value.isNotEmpty));
|
||||
return NavigationItemsState(
|
||||
value: navigation.getItems(
|
||||
openLogs: openLogs,
|
||||
@@ -79,22 +80,27 @@ ClashConfigState clashConfigState(Ref ref) {
|
||||
|
||||
@riverpod
|
||||
ProxyState proxyState(Ref ref) {
|
||||
final isStart = ref.watch(runTimeProvider.select((state)=>state != null));
|
||||
final networkProps = ref.watch(networkSettingProvider);
|
||||
final isStart = ref.watch(runTimeProvider.select((state) => state != null));
|
||||
final vm2 = ref.watch(networkSettingProvider.select(
|
||||
(state) => VM2(
|
||||
a: state.systemProxy,
|
||||
b: state.bypassDomain,
|
||||
),
|
||||
));
|
||||
final mixedPort = ref.watch(
|
||||
patchClashConfigProvider.select((state) => state.mixedPort),
|
||||
);
|
||||
return ProxyState(
|
||||
isStart: isStart,
|
||||
systemProxy: networkProps.systemProxy,
|
||||
bassDomain: networkProps.bypassDomain,
|
||||
systemProxy: vm2.a,
|
||||
bassDomain: vm2.b,
|
||||
port: mixedPort,
|
||||
);
|
||||
}
|
||||
|
||||
@riverpod
|
||||
TrayState trayState(Ref ref) {
|
||||
final isStart = ref.watch(runTimeProvider.select((state)=>state != null));
|
||||
final isStart = ref.watch(runTimeProvider.select((state) => state != null));
|
||||
final networkProps = ref.watch(networkSettingProvider);
|
||||
final clashConfig = ref.watch(
|
||||
patchClashConfigProvider,
|
||||
@@ -114,7 +120,7 @@ TrayState trayState(Ref ref) {
|
||||
return TrayState(
|
||||
mode: clashConfig.mode,
|
||||
port: clashConfig.mixedPort,
|
||||
autoLaunch: appSetting.autoRun,
|
||||
autoLaunch: appSetting.autoLaunch,
|
||||
systemProxy: networkProps.systemProxy,
|
||||
tunEnable: clashConfig.tun.enable,
|
||||
isStart: isStart,
|
||||
@@ -255,9 +261,6 @@ GroupNamesState groupNamesState(Ref ref) {
|
||||
|
||||
@riverpod
|
||||
ProxyGroupSelectorState proxyGroupSelectorState(Ref ref, String groupName) {
|
||||
final testUrl = ref.watch(appSettingProvider.select(
|
||||
(state) => state.testUrl,
|
||||
));
|
||||
final proxiesStyle = ref.watch(
|
||||
proxiesStyleSettingProvider,
|
||||
);
|
||||
@@ -269,7 +272,7 @@ ProxyGroupSelectorState proxyGroupSelectorState(Ref ref, String groupName) {
|
||||
final sortNum = ref.watch(sortNumProvider);
|
||||
final columns = ref.watch(getProxiesColumnsProvider);
|
||||
return ProxyGroupSelectorState(
|
||||
testUrl: testUrl,
|
||||
testUrl: group?.testUrl,
|
||||
proxiesSortType: proxiesStyle.sortType,
|
||||
proxyCardType: proxiesStyle.cardType,
|
||||
sortNum: sortNum,
|
||||
@@ -338,11 +341,21 @@ int? getDelay(
|
||||
String? testUrl,
|
||||
}) {
|
||||
final currentTestUrl = ref.watch(getRealTestUrlProvider(testUrl));
|
||||
return ref.watch(
|
||||
delayDataSourceProvider.select(
|
||||
(state) => state[currentTestUrl]?[proxyName],
|
||||
final proxyCardState = ref.watch(
|
||||
getProxyCardStateProvider(
|
||||
proxyName,
|
||||
),
|
||||
);
|
||||
final delay = ref.watch(
|
||||
delayDataSourceProvider.select(
|
||||
(state) {
|
||||
final delayMap =
|
||||
state[proxyCardState.testUrl.getSafeValue(currentTestUrl)];
|
||||
return delayMap?[proxyCardState.proxyName];
|
||||
},
|
||||
),
|
||||
);
|
||||
return delay;
|
||||
}
|
||||
|
||||
@riverpod
|
||||
@@ -392,30 +405,34 @@ int getProxiesColumns(Ref ref) {
|
||||
return other.getProxiesColumns(viewWidth, proxiesLayout);
|
||||
}
|
||||
|
||||
String _getRealProxyName(
|
||||
ProxyCardState _getProxyCardState(
|
||||
List<Group> groups,
|
||||
SelectedMap selectedMap,
|
||||
String proxyName,
|
||||
ProxyCardState proxyDelayState,
|
||||
) {
|
||||
if (proxyName.isEmpty) return proxyName;
|
||||
final index = groups.indexWhere((element) => element.name == proxyName);
|
||||
if (index == -1) return proxyName;
|
||||
if (proxyDelayState.proxyName.isEmpty) return proxyDelayState;
|
||||
final index =
|
||||
groups.indexWhere((element) => element.name == proxyDelayState.proxyName);
|
||||
if (index == -1) return proxyDelayState;
|
||||
final group = groups[index];
|
||||
final currentSelectedName =
|
||||
group.getCurrentSelectedName(selectedMap[proxyName] ?? '');
|
||||
if (currentSelectedName.isEmpty) return proxyName;
|
||||
return _getRealProxyName(
|
||||
final currentSelectedName = group
|
||||
.getCurrentSelectedName(selectedMap[proxyDelayState.proxyName] ?? '');
|
||||
return _getProxyCardState(
|
||||
groups,
|
||||
selectedMap,
|
||||
proxyName,
|
||||
proxyDelayState.copyWith(
|
||||
proxyName: currentSelectedName,
|
||||
testUrl: group.testUrl,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@riverpod
|
||||
String getRealProxyName(Ref ref, String proxyName) {
|
||||
ProxyCardState getProxyCardState(Ref ref, String proxyName) {
|
||||
final groups = ref.watch(groupsProvider);
|
||||
final selectedMap = ref.watch(selectedMapProvider);
|
||||
return _getRealProxyName(groups, selectedMap, proxyName);
|
||||
return _getProxyCardState(
|
||||
groups, selectedMap, ProxyCardState(proxyName: proxyName));
|
||||
}
|
||||
|
||||
@riverpod
|
||||
@@ -445,6 +462,7 @@ String getProxyDesc(Ref ref, Proxy proxy) {
|
||||
final groups = ref.watch(groupsProvider);
|
||||
final index = groups.indexWhere((element) => element.name == proxy.name);
|
||||
if (index == -1) return proxy.type;
|
||||
return "${proxy.type}(${groups[index].now ?? '*'})";
|
||||
final state = ref.watch(getProxyCardStateProvider(proxy.name));
|
||||
return "${proxy.type}(${state.proxyName.isNotEmpty ? state.proxyName : '*'})";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:fl_clash/common/common.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
@@ -18,6 +19,17 @@ class DonutChartData {
|
||||
String toString() {
|
||||
return 'DonutChartData{_value: $_value}';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) =>
|
||||
identical(this, other) ||
|
||||
other is DonutChartData &&
|
||||
runtimeType == other.runtimeType &&
|
||||
_value == other._value &&
|
||||
color == other.color;
|
||||
|
||||
@override
|
||||
int get hashCode => _value.hashCode ^ color.hashCode;
|
||||
}
|
||||
|
||||
class DonutChart extends StatefulWidget {
|
||||
|
||||
@@ -320,7 +320,6 @@ class ListPage<T> extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
print("daad===>$items");
|
||||
return FloatLayout(
|
||||
floatingWidget: FloatWrapper(
|
||||
child: FloatingActionButton(
|
||||
|
||||
@@ -186,48 +186,46 @@ class CommonScaffoldState extends State<CommonScaffold> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final body = SafeArea(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
ValueListenableBuilder(
|
||||
valueListenable: _keywordsNotifier,
|
||||
builder: (_, keywords, __) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
if (_onKeywordsUpdate != null) {
|
||||
_onKeywordsUpdate!(keywords);
|
||||
}
|
||||
});
|
||||
if (keywords.isEmpty) {
|
||||
return SizedBox();
|
||||
final body = Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
ValueListenableBuilder(
|
||||
valueListenable: _keywordsNotifier,
|
||||
builder: (_, keywords, __) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
if (_onKeywordsUpdate != null) {
|
||||
_onKeywordsUpdate!(keywords);
|
||||
}
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 16,
|
||||
vertical: 16,
|
||||
),
|
||||
child: Wrap(
|
||||
runSpacing: 8,
|
||||
spacing: 8,
|
||||
children: [
|
||||
for (final keyword in keywords)
|
||||
CommonChip(
|
||||
label: keyword,
|
||||
type: ChipType.delete,
|
||||
onPressed: () {
|
||||
_deleteKeyword(keyword);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
Expanded(
|
||||
child: widget.body,
|
||||
),
|
||||
],
|
||||
),
|
||||
});
|
||||
if (keywords.isEmpty) {
|
||||
return SizedBox();
|
||||
}
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 16,
|
||||
vertical: 16,
|
||||
),
|
||||
child: Wrap(
|
||||
runSpacing: 8,
|
||||
spacing: 8,
|
||||
children: [
|
||||
for (final keyword in keywords)
|
||||
CommonChip(
|
||||
label: keyword,
|
||||
type: ChipType.delete,
|
||||
onPressed: () {
|
||||
_deleteKeyword(keyword);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
Expanded(
|
||||
child: widget.body,
|
||||
),
|
||||
],
|
||||
);
|
||||
final scaffold = Scaffold(
|
||||
appBar: PreferredSize(
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class WaveView extends StatefulWidget {
|
||||
@@ -40,23 +41,25 @@ class _WaveViewState extends State<WaveView>
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return LayoutBuilder(builder: (_, container) {
|
||||
return AnimatedBuilder(
|
||||
animation: _controller,
|
||||
builder: (context, child) {
|
||||
return CustomPaint(
|
||||
painter: WavePainter(
|
||||
animationValue: _controller.value,
|
||||
waveAmplitude: widget.waveAmplitude,
|
||||
waveFrequency: widget.waveFrequency,
|
||||
waveColor: widget.waveColor,
|
||||
),
|
||||
size: Size(
|
||||
container.maxHeight,
|
||||
container.maxHeight,
|
||||
),
|
||||
);
|
||||
},
|
||||
return LayoutBuilder(builder: (_, constraints) {
|
||||
return RepaintBoundary(
|
||||
child: AnimatedBuilder(
|
||||
animation: _controller,
|
||||
builder: (context, child) {
|
||||
return CustomPaint(
|
||||
painter: WavePainter(
|
||||
animationValue: _controller.value,
|
||||
waveAmplitude: widget.waveAmplitude,
|
||||
waveFrequency: widget.waveFrequency,
|
||||
waveColor: widget.waveColor,
|
||||
),
|
||||
size: Size(
|
||||
constraints.maxWidth,
|
||||
constraints.maxHeight,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -68,41 +71,60 @@ class WavePainter extends CustomPainter {
|
||||
final double waveFrequency;
|
||||
final Color waveColor;
|
||||
|
||||
late Paint _paint;
|
||||
final Path _path = Path();
|
||||
Color _lastColor;
|
||||
|
||||
WavePainter({
|
||||
required this.animationValue,
|
||||
required this.waveAmplitude,
|
||||
required this.waveFrequency,
|
||||
required this.waveColor,
|
||||
});
|
||||
}) : _lastColor = waveColor {
|
||||
_paint = Paint()
|
||||
..color = waveColor
|
||||
..style = PaintingStyle.fill;
|
||||
}
|
||||
|
||||
@override
|
||||
void paint(Canvas canvas, Size size) {
|
||||
final paint = Paint()
|
||||
..color = waveColor
|
||||
..style = PaintingStyle.fill;
|
||||
|
||||
final path = Path();
|
||||
|
||||
final baseHeight = size.height / 3;
|
||||
|
||||
path.moveTo(0, baseHeight);
|
||||
|
||||
for (double x = 0; x <= size.width; x++) {
|
||||
final y = waveAmplitude *
|
||||
sin((x / size.width * 2 * pi * waveFrequency) +
|
||||
(animationValue * 2 * pi));
|
||||
path.lineTo(x, baseHeight + y);
|
||||
if (waveColor != _lastColor) {
|
||||
_paint = Paint()
|
||||
..color = waveColor
|
||||
..style = PaintingStyle.fill;
|
||||
_lastColor = waveColor;
|
||||
}
|
||||
|
||||
path.lineTo(size.width, size.height);
|
||||
path.lineTo(0, size.height);
|
||||
path.close();
|
||||
_path.reset();
|
||||
|
||||
canvas.drawPath(path, paint);
|
||||
final baseHeight = size.height / 3;
|
||||
final phase = animationValue * 2 * pi;
|
||||
final widthFactor = 2 * pi * waveFrequency / size.width;
|
||||
|
||||
_path.moveTo(0, baseHeight);
|
||||
|
||||
for (double x = 0; x <= size.width; x += size.width / 20) {
|
||||
final y = waveAmplitude * sin(x * widthFactor + phase);
|
||||
_path.lineTo(x, baseHeight + y);
|
||||
}
|
||||
|
||||
_path.lineTo(
|
||||
size.width,
|
||||
baseHeight + waveAmplitude * sin(size.width * widthFactor + phase),
|
||||
);
|
||||
|
||||
_path.lineTo(size.width, size.height);
|
||||
_path.lineTo(0, size.height);
|
||||
_path.close();
|
||||
|
||||
canvas.drawPath(_path, _paint);
|
||||
}
|
||||
|
||||
@override
|
||||
bool shouldRepaint(covariant CustomPainter oldDelegate) {
|
||||
return true;
|
||||
bool shouldRepaint(covariant WavePainter oldDelegate) {
|
||||
return oldDelegate.animationValue != animationValue ||
|
||||
oldDelegate.waveAmplitude != waveAmplitude ||
|
||||
oldDelegate.waveFrequency != waveFrequency ||
|
||||
oldDelegate.waveColor != waveColor;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
enableGPUValidationMode = "1"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
|
||||
106
pubspec.lock
106
pubspec.lock
@@ -5,23 +5,23 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
|
||||
sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "72.0.0"
|
||||
version: "76.0.0"
|
||||
_macros:
|
||||
dependency: transitive
|
||||
description: dart
|
||||
source: sdk
|
||||
version: "0.3.2"
|
||||
version: "0.3.3"
|
||||
analyzer:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
|
||||
sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.7.0"
|
||||
version: "6.11.0"
|
||||
analyzer_plugin:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -66,18 +66,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
|
||||
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.11.0"
|
||||
version: "2.12.0"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: boolean_selector
|
||||
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
|
||||
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
version: "2.1.2"
|
||||
build:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -170,10 +170,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: characters
|
||||
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
|
||||
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
version: "1.4.0"
|
||||
checked_yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -202,10 +202,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: clock
|
||||
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
|
||||
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
version: "1.1.2"
|
||||
code_builder:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -218,10 +218,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: collection
|
||||
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
|
||||
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.18.0"
|
||||
version: "1.19.1"
|
||||
connectivity_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -290,10 +290,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: custom_lint_visitor
|
||||
sha256: "8aeb3b6ae2bb765e7716b93d1d10e8356d04e0ff6d7592de6ee04e0dd7d6587d"
|
||||
sha256: bfe9b7a09c4775a587b58d10ebb871d4fe618237639b1e84d5ec62d7dfef25f9
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0+6.7.0"
|
||||
version: "1.0.0+6.11.0"
|
||||
dart_style:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -338,10 +338,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: dio
|
||||
sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260"
|
||||
sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.7.0"
|
||||
version: "5.8.0+1"
|
||||
dio_web_adapter:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -378,10 +378,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fake_async
|
||||
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
|
||||
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
version: "1.3.2"
|
||||
ffi:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -538,6 +538,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
google_fonts:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: google_fonts
|
||||
sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.2.1"
|
||||
graphs:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -758,18 +766,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker
|
||||
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
|
||||
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "10.0.5"
|
||||
version: "10.0.8"
|
||||
leak_tracker_flutter_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker_flutter_testing
|
||||
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
|
||||
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.5"
|
||||
version: "3.0.9"
|
||||
leak_tracker_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -806,18 +814,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: macros
|
||||
sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536"
|
||||
sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.2-main.4"
|
||||
version: "0.1.3-main.0"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: matcher
|
||||
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
|
||||
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.12.16+1"
|
||||
version: "0.12.17"
|
||||
material_color_utilities:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -838,10 +846,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
|
||||
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.15.0"
|
||||
version: "1.16.0"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -902,10 +910,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: path
|
||||
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
|
||||
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.9.0"
|
||||
version: "1.9.1"
|
||||
path_provider:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -1213,7 +1221,7 @@ packages:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.99"
|
||||
version: "0.0.0"
|
||||
source_gen:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1234,10 +1242,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
|
||||
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.10.0"
|
||||
version: "1.10.1"
|
||||
sprintf:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1290,10 +1298,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
|
||||
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.11.1"
|
||||
version: "1.12.1"
|
||||
state_notifier:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1306,10 +1314,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
|
||||
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
version: "2.1.4"
|
||||
stream_transform:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1322,10 +1330,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
|
||||
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
version: "1.4.1"
|
||||
synchronized:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1338,18 +1346,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
|
||||
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.1"
|
||||
version: "1.2.2"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
|
||||
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.2"
|
||||
version: "0.7.4"
|
||||
timing:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1466,10 +1474,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vm_service
|
||||
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
|
||||
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "14.2.5"
|
||||
version: "14.3.1"
|
||||
watcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1582,5 +1590,5 @@ packages:
|
||||
source: hosted
|
||||
version: "2.2.1"
|
||||
sdks:
|
||||
dart: ">=3.5.0 <4.0.0"
|
||||
dart: ">=3.7.0-0 <4.0.0"
|
||||
flutter: ">=3.24.0"
|
||||
|
||||
11
pubspec.yaml
11
pubspec.yaml
@@ -1,7 +1,7 @@
|
||||
name: fl_clash
|
||||
description: A multi-platform proxy client based on ClashMeta, simple and easy to use, open-source and ad-free.
|
||||
publish_to: 'none'
|
||||
version: 0.8.78+202503052
|
||||
version: 0.8.80+202503101
|
||||
environment:
|
||||
sdk: '>=3.1.0 <4.0.0'
|
||||
|
||||
@@ -10,11 +10,10 @@ dependencies:
|
||||
sdk: flutter
|
||||
flutter_localizations:
|
||||
sdk: flutter
|
||||
intl: ^0.19.0
|
||||
intl: any
|
||||
path_provider: ^2.1.0
|
||||
path: ^1.9.0
|
||||
shared_preferences: ^2.5.1
|
||||
# provider: ^6.0.5
|
||||
window_manager: ^0.4.3
|
||||
dynamic_color: ^1.7.0
|
||||
proxy:
|
||||
@@ -36,7 +35,7 @@ dependencies:
|
||||
freezed_annotation: ^2.4.1
|
||||
image_picker: ^1.1.2
|
||||
webdav_client: ^1.2.2
|
||||
dio: ^5.4.3+1
|
||||
dio: ^5.8.0+1
|
||||
win32: ^5.5.1
|
||||
ffi: ^2.1.2
|
||||
re_editor: ^0.6.0
|
||||
@@ -55,6 +54,7 @@ dependencies:
|
||||
flutter_riverpod: ^2.6.1
|
||||
riverpod_annotation: ^2.6.1
|
||||
riverpod: ^2.6.1
|
||||
google_fonts: ^6.2.1
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
@@ -79,9 +79,6 @@ flutter:
|
||||
- family: Twemoji
|
||||
fonts:
|
||||
- asset: assets/fonts/Twemoji.Mozilla.ttf
|
||||
- family: MiSans
|
||||
fonts:
|
||||
- asset: assets/fonts/MiSans-Regular.ttf
|
||||
- family: Icons
|
||||
fonts:
|
||||
- asset: assets/fonts/Icons.ttf
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
// ignore_for_file: avoid_print
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'dart:typed_data';
|
||||
|
||||
Future<void> main() async {
|
||||
// final cmdList = [];
|
||||
// final ignoreHosts = "\"ass\"";
|
||||
// cmdList.add(
|
||||
// ["gsettings", "set", "org.gnome.system.proxy", "port", ignoreHosts],
|
||||
// );
|
||||
// print(cmdList.first);
|
||||
final internetAddress = InternetAddress(
|
||||
"/tmp/FlClashSocket.sock",
|
||||
type: InternetAddressType.unix,
|
||||
);
|
||||
|
||||
final socket = await Socket.connect(internetAddress, 0);
|
||||
socket
|
||||
.transform(
|
||||
StreamTransformer<Uint8List, String>.fromHandlers(
|
||||
handleData: (Uint8List data, EventSink<String> sink) {
|
||||
sink.add(utf8.decode(data));
|
||||
},
|
||||
),
|
||||
)
|
||||
.transform(LineSplitter())
|
||||
.listen((res) {
|
||||
print(res);
|
||||
});
|
||||
}
|
||||
|
||||
startService() async {
|
||||
try {
|
||||
// 创建服务器
|
||||
final server = await HttpServer.bind("127.0.0.1", 10001);
|
||||
print('服务器正在监听 ${server.address.address}:${server.port}');
|
||||
|
||||
// 监听请求
|
||||
await for (HttpRequest request in server) {
|
||||
handleRequest(request);
|
||||
}
|
||||
} catch (e) {
|
||||
print('服务器错误: $e');
|
||||
}
|
||||
}
|
||||
|
||||
void handleRequest(HttpRequest request) {
|
||||
print(request.headers);
|
||||
// 处理请求
|
||||
request.response
|
||||
..statusCode = HttpStatus.ok
|
||||
..headers.contentType = ContentType.html
|
||||
..write('<html><body><h1>Hello, Dart Server!</h1></body></html>');
|
||||
|
||||
// 完成响应
|
||||
request.response.close();
|
||||
}
|
||||
Reference in New Issue
Block a user