Merge branch 'main' into zh-cn-i18n-patch-2
This commit is contained in:
3
.github/workflows/build.yml
vendored
3
.github/workflows/build.yml
vendored
@@ -92,9 +92,6 @@ jobs:
|
||||
make ${{ matrix.platform }}-prepare
|
||||
tree
|
||||
|
||||
- name: Test
|
||||
run: flutter test
|
||||
|
||||
- name: Setup Android Signing Properties
|
||||
if: startsWith(matrix.platform,'android')
|
||||
run: |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Changelog
|
||||
|
||||
## Unreleased
|
||||
## [0.16.0.dev] - 2023-2-18
|
||||
|
||||
### New Features and Improvements
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
- Changed in-app icons (using [Fluent UI System Icons](https://github.com/microsoft/fluentui-system-icons))
|
||||
- Redesigned navigation flow, separating config options
|
||||
- Added haptic feedback
|
||||
- Added detailed subscription info in profile edit page
|
||||
- Added Chinese Taiwan language. [PR#410](https://github.com/hiddify/hiddify-next/pull/410) by [junlin03](https://github.com/junlin03) and [PR#491](https://github.com/hiddify/hiddify-next/pull/491) by [kouhe3](https://github.com/kouhe3)
|
||||
- Added Japanese Readme. [PR#371](https://github.com/hiddify/hiddify-next/pull/371) by [Ikko Eltociear Ashimine](https://github.com/eltociear)
|
||||
|
||||
@@ -277,6 +278,7 @@
|
||||
- Fixed localization mistakes in Russian. [PR#95](https://github.com/hiddify/hiddify-next/pull/95) by [solokot](https://github.com/solokot)
|
||||
- Fixed localization mistakes in Russian. [PR#74](https://github.com/hiddify/hiddify-next/pull/74) by [Elshad Guseynov](https://github.com/lifeindarkside)
|
||||
|
||||
[0.16.0.dev]: https://github.com/hiddify/hiddify-next/releases/tag/v0.16.0.dev
|
||||
[0.14.1.dev]: https://github.com/hiddify/hiddify-next/releases/tag/v0.14.1.dev
|
||||
[0.14.0.dev]: https://github.com/hiddify/hiddify-next/releases/tag/v0.14.0.dev
|
||||
[0.13.6]: https://github.com/hiddify/hiddify-next/releases/tag/v0.13.6
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"general": {
|
||||
"reset": "Renicio",
|
||||
"appTitle": "Hiddify",
|
||||
"reset": "Renicio",
|
||||
"toggle": {
|
||||
"enabled": "Activado",
|
||||
"disabled": "Desactivado"
|
||||
@@ -211,6 +211,10 @@
|
||||
"warp": "WARP Options",
|
||||
"misc": "Opciones varias"
|
||||
},
|
||||
"warpConsent": {
|
||||
"title": "Consentimiento WARP de Cloudflare",
|
||||
"description(rich)": "Cloudflare WARP es un proveedor de VPN WireGuard gratuito. Al habilitar esta opción, acepta los ${tos(Términos de servicio)} y ${privacy(Política de privacidad)} de Cloudflare WARP."
|
||||
},
|
||||
"pageTitle": "Opciones de configuración",
|
||||
"logLevel": "Registro del Nivel",
|
||||
"resolveDestination": "Resolver Destino",
|
||||
@@ -258,11 +262,7 @@
|
||||
"warpLicenseKey": "License Key",
|
||||
"warpCleanIp": "Clean IP",
|
||||
"warpPort": "Port",
|
||||
"warpNoise": "Noise",
|
||||
"warpConsent": {
|
||||
"title": "Consentimiento WARP de Cloudflare",
|
||||
"description(rich)": "Cloudflare WARP es un proveedor de VPN WireGuard gratuito. Al habilitar esta opción, acepta los ${tos(Términos de servicio)} y ${privacy(Política de privacidad)} de Cloudflare WARP."
|
||||
}
|
||||
"warpNoise": "Noise"
|
||||
},
|
||||
"geoAssets": {
|
||||
"pageTitle": "Activos de enrutamiento",
|
||||
|
||||
@@ -211,6 +211,10 @@
|
||||
"warp": "WARP Options",
|
||||
"misc": "تنظیمات متفرقه"
|
||||
},
|
||||
"warpConsent": {
|
||||
"title": "رضایت Cloudflare WARP",
|
||||
"description(rich)": "Cloudflare WARP یک ارائه دهنده رایگان WireGuard VPN است. با فعال کردن این گزینه، با ${tos(شرایط خدمات)} و ${privacy(خطمشی رازداری)} Cloudflare WARP موافقت میکنید."
|
||||
},
|
||||
"pageTitle": "تنظیمات کانفیگ",
|
||||
"logLevel": "سطح لاگ",
|
||||
"resolveDestination": "جایگذاری IP مقصد",
|
||||
@@ -258,11 +262,7 @@
|
||||
"warpLicenseKey": "License Key",
|
||||
"warpCleanIp": "Clean IP",
|
||||
"warpPort": "Port",
|
||||
"warpNoise": "Noise",
|
||||
"warpConsent": {
|
||||
"title": "رضایت Cloudflare WARP",
|
||||
"description(rich)": "Cloudflare WARP یک ارائه دهنده رایگان WireGuard VPN است. با فعال کردن این گزینه، با ${tos(شرایط خدمات)} و ${privacy(خطمشی رازداری)} Cloudflare WARP موافقت میکنید."
|
||||
}
|
||||
"warpNoise": "Noise"
|
||||
},
|
||||
"geoAssets": {
|
||||
"pageTitle": "فایلهای مسیریابی",
|
||||
|
||||
@@ -211,6 +211,10 @@
|
||||
"warp": "WARP Options",
|
||||
"misc": "Разные параметры"
|
||||
},
|
||||
"warpConsent": {
|
||||
"title": "Согласие Cloudflare WARP",
|
||||
"description(rich)": "Cloudflare WARP — бесплатный провайдер WireGuard VPN. Включая эту опцию, вы соглашаетесь с ${tos(Условиями обслуживания)} и ${privacy(Политикой конфиденциальности)} Cloudflare WARP."
|
||||
},
|
||||
"pageTitle": "Параметры конфигурации",
|
||||
"logLevel": "Подробность журналирования",
|
||||
"resolveDestination": "Определять назначение",
|
||||
@@ -258,11 +262,7 @@
|
||||
"warpLicenseKey": "License Key",
|
||||
"warpCleanIp": "Clean IP",
|
||||
"warpPort": "Port",
|
||||
"warpNoise": "Noise",
|
||||
"warpConsent": {
|
||||
"title": "Согласие Cloudflare WARP",
|
||||
"description(rich)": "Cloudflare WARP — бесплатный провайдер WireGuard VPN. Включая эту опцию, вы соглашаетесь с ${tos(Условиями обслуживания)} и ${privacy(Политикой конфиденциальности)} Cloudflare WARP."
|
||||
}
|
||||
"warpNoise": "Noise"
|
||||
},
|
||||
"geoAssets": {
|
||||
"pageTitle": "Активы маршрутизации",
|
||||
|
||||
@@ -211,6 +211,10 @@
|
||||
"warp": "WARP Options",
|
||||
"misc": "Çeşitli Seçenekler"
|
||||
},
|
||||
"warpConsent": {
|
||||
"title": "Cloudflare WARP Onayı",
|
||||
"description(rich)": "Cloudflare WARP ücretsiz bir WireGuard VPN sağlayıcısıdır. Bu seçeneği etkinleştirerek Cloudflare WARP'ın ${tos(Hizmet Şartları)} ve ${privacy(Gizlilik Politikası)}'nı kabul etmiş olursunuz."
|
||||
},
|
||||
"pageTitle": "Yapılandırma Seçenekleri",
|
||||
"logLevel": "Log Seviyesi",
|
||||
"resolveDestination": "Hedefi Çöz",
|
||||
@@ -258,11 +262,7 @@
|
||||
"warpLicenseKey": "License Key",
|
||||
"warpCleanIp": "Clean IP",
|
||||
"warpPort": "Port",
|
||||
"warpNoise": "Noise",
|
||||
"warpConsent": {
|
||||
"title": "Cloudflare WARP Onayı",
|
||||
"description(rich)": "Cloudflare WARP ücretsiz bir WireGuard VPN sağlayıcısıdır. Bu seçeneği etkinleştirerek Cloudflare WARP'ın ${tos(Hizmet Şartları)} ve ${privacy(Gizlilik Politikası)}'nı kabul etmiş olursunuz."
|
||||
}
|
||||
"warpNoise": "Noise"
|
||||
},
|
||||
"geoAssets": {
|
||||
"pageTitle": "Varlıkları Yönlendirme",
|
||||
|
||||
@@ -57,8 +57,8 @@
|
||||
"remainingTrafficSemanticLabel": "已使用 ${consumed} 流量,共 ${total} 流量。",
|
||||
"expired": "已过期",
|
||||
"noTraffic": "超出配额",
|
||||
"upload": "上行",
|
||||
"download": "下行",
|
||||
"upload": "上传",
|
||||
"download": "下载",
|
||||
"total": "总流量",
|
||||
"expireDate": "到期时间"
|
||||
},
|
||||
@@ -129,18 +129,18 @@
|
||||
"emptyProxiesMsg": "没有可用的代理",
|
||||
"delayTestTooltip": "测试延迟",
|
||||
"sortTooltip": "对代理进行排序",
|
||||
"checkIp": "查看IP",
|
||||
"unknownIp": "未知IP",
|
||||
"checkIp": "检测IP地址",
|
||||
"unknownIp": "未知的IP",
|
||||
"sortOptions": {
|
||||
"unsorted": "默认",
|
||||
"name": "按字母顺序",
|
||||
"delay": "按延迟顺序"
|
||||
},
|
||||
"activeProxySemanticLabel": "激活代理",
|
||||
"activeProxySemanticLabel": "活跃的代理",
|
||||
"delaySemantics": {
|
||||
"result": "延迟: ${delay}ms",
|
||||
"timeout": "测试延迟超时",
|
||||
"testing": "延迟: 测试中..."
|
||||
"result": "延迟:${delay}ms",
|
||||
"timeout": "延迟测试超时",
|
||||
"testing": "正在测试延迟"
|
||||
},
|
||||
"ipInfoSemantics": {
|
||||
"address": "IP地址",
|
||||
@@ -148,7 +148,7 @@
|
||||
},
|
||||
"statsSemantics": {
|
||||
"speed": "速度",
|
||||
"totalTransferred": "已转发流量"
|
||||
"totalTransferred": "总传输量"
|
||||
}
|
||||
},
|
||||
"logs": {
|
||||
@@ -194,7 +194,7 @@
|
||||
"ignoreBatteryOptimizationsMsg": "消除限制以获得最佳 VPN 性能",
|
||||
"dynamicNotification": "在通知中显示速度",
|
||||
"hapticFeedback": "触觉反馈",
|
||||
"autoIpCheck": "自动检查IP"
|
||||
"autoIpCheck": "自动检查连接的 IP"
|
||||
},
|
||||
"advanced": {
|
||||
"sectionTitle": "高级选项",
|
||||
@@ -224,7 +224,8 @@
|
||||
"serviceModes": {
|
||||
"proxy": "仅代理",
|
||||
"systemProxy": "系统代理",
|
||||
"tun": "VPN"
|
||||
"tun": "VPN",
|
||||
"tunService": "VPN服务"
|
||||
},
|
||||
"section": {
|
||||
"route": "路由选项",
|
||||
@@ -240,8 +241,8 @@
|
||||
"title": "Cloudflare WARP 同意",
|
||||
"description(rich)": "Cloudflare WARP 是免费的 WireGuard VPN 提供商。启用此选项即表示您同意 Cloudflare WARP 的 ${tos(服务条款)} 和 ${privacy(隐私政策)}"
|
||||
},
|
||||
"generateWarpConfig": "生成WARP配置",
|
||||
"missingWarpConfig": "缺失WARP配置",
|
||||
"generateWarpConfig": "生成WARP配置文件",
|
||||
"missingWarpConfig": "WARP配置缺失",
|
||||
"pageTitle": "配置选项",
|
||||
"logLevel": "日志级别",
|
||||
"resolveDestination": "解析目标地址",
|
||||
|
||||
@@ -1 +1 @@
|
||||
core.version=0.15.15
|
||||
core.version=0.16.0
|
||||
@@ -751,7 +751,7 @@
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1515;
|
||||
CURRENT_PROJECT_VERSION = 1600;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||
EXCLUDED_ARCHS = armv7;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||
@@ -770,7 +770,7 @@
|
||||
"@executable_path/libcore/",
|
||||
);
|
||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||
MARKETING_VERSION = 0.15.15;
|
||||
MARKETING_VERSION = 0.16.0;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
OTHER_LDFLAGS = "-lresolv";
|
||||
@@ -802,7 +802,7 @@
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1515;
|
||||
CURRENT_PROJECT_VERSION = 1600;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||
EXCLUDED_ARCHS = armv7;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||
@@ -821,7 +821,7 @@
|
||||
"@executable_path/libcore/",
|
||||
);
|
||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||
MARKETING_VERSION = 0.15.15;
|
||||
MARKETING_VERSION = 0.16.0;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = NO;
|
||||
OTHER_LDFLAGS = "-lresolv";
|
||||
@@ -851,7 +851,7 @@
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1515;
|
||||
CURRENT_PROJECT_VERSION = 1600;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||
EXCLUDED_ARCHS = armv7;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||
@@ -870,7 +870,7 @@
|
||||
"@executable_path/libcore/",
|
||||
);
|
||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||
MARKETING_VERSION = 0.15.15;
|
||||
MARKETING_VERSION = 0.16.0;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = NO;
|
||||
OTHER_LDFLAGS = "-lresolv";
|
||||
|
||||
@@ -32,4 +32,10 @@ class HapticService extends _$HapticService {
|
||||
await HapticFeedback.mediumImpact();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> heavyImpact() async {
|
||||
if (state) {
|
||||
await HapticFeedback.heavyImpact();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,17 @@ class ConnectionNotifier extends _$ConnectionNotifier with AppLogger {
|
||||
}).run();
|
||||
}
|
||||
|
||||
ref.listenSelf(
|
||||
(previous, next) async {
|
||||
if (previous == next) return;
|
||||
if (previous case AsyncData(:final value) when !value.isConnected) {
|
||||
if (next case AsyncData(value: final Connected _)) {
|
||||
await ref.read(hapticServiceProvider.notifier).heavyImpact();
|
||||
}
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
ref.listen(
|
||||
activeProfileProvider.select((value) => value.asData?.value),
|
||||
(previous, next) async {
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'dart:async';
|
||||
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
import 'package:hiddify/core/haptic/haptic_service.dart';
|
||||
import 'package:hiddify/features/profile/data/profile_data_providers.dart';
|
||||
import 'package:hiddify/features/profile/data/profile_repository.dart';
|
||||
import 'package:hiddify/features/profile/model/profile_entity.dart';
|
||||
@@ -46,6 +47,7 @@ class ProfilesOverviewNotifier extends _$ProfilesOverviewNotifier
|
||||
|
||||
Future<Unit> selectActiveProfile(String id) async {
|
||||
loggy.debug('changing active profile to: [$id]');
|
||||
await ref.read(hapticServiceProvider.notifier).lightImpact();
|
||||
return _profilesRepo.setAsActive(id).getOrElse((err) {
|
||||
loggy.warning('failed to set [$id] as active profile', err);
|
||||
throw err;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'package:circle_flags/circle_flags.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hiddify/core/haptic/haptic_service.dart';
|
||||
import 'package:hiddify/core/localization/translations.dart';
|
||||
import 'package:hiddify/core/utils/ip_utils.dart';
|
||||
import 'package:hiddify/utils/riverpod_utils.dart';
|
||||
@@ -7,6 +8,11 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
|
||||
final _showIp = StateProvider.autoDispose((ref) {
|
||||
ref.disposeDelay(const Duration(seconds: 20));
|
||||
ref.listenSelf((previous, next) {
|
||||
if (previous == false && next == true) {
|
||||
ref.read(hapticServiceProvider.notifier).mediumImpact();
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
2
libcore
2
libcore
Submodule libcore updated: 6672cd8104...6c65b73981
@@ -1,7 +1,7 @@
|
||||
name: hiddify
|
||||
description: Cross Platform Multi Protocol Proxy Frontend.
|
||||
publish_to: "none"
|
||||
version: 0.15.15+1515
|
||||
version: 0.16.0+1600
|
||||
|
||||
environment:
|
||||
sdk: ">=3.2.0 <4.0.0"
|
||||
|
||||
Reference in New Issue
Block a user