Skip to content

Commit b718850

Browse files
committed
feat: automatically detect source text
1 parent 39b8612 commit b718850

File tree

5 files changed

+76
-11
lines changed

5 files changed

+76
-11
lines changed

lib/presentation/home/bloc/home_bloc.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,6 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
6464
await emit.forEach(
6565
homeRepository.translateText(
6666
sourceText,
67-
srcLanguage: 'auto',
68-
targetLanguage: 'zh',
6967
translatorSettings: settingsBloc.state.translatorSettings!,
7068
),
7169
onData: (baseTranslationDetail) {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
enum Language {
2+
english,
3+
chinese,
4+
auto,
5+
unknown,
6+
}
7+
8+
extension LanguageX on Language {
9+
String get name {
10+
switch (this) {
11+
case Language.english:
12+
return 'English';
13+
case Language.chinese:
14+
return 'Chinese';
15+
case Language.auto:
16+
return 'Automatic';
17+
case Language.unknown:
18+
return 'Unknown';
19+
}
20+
}
21+
22+
String? get code {
23+
switch (this) {
24+
case Language.english:
25+
return 'en';
26+
case Language.chinese:
27+
return 'zh';
28+
case Language.auto:
29+
return 'auto';
30+
case Language.unknown:
31+
return null;
32+
}
33+
}
34+
}

lib/presentation/home/models/models.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ export 'baidu_translation.dart';
22
export 'base_translation_details.dart';
33
export 'deepseek_chat_completion.dart';
44
export 'deepseek_message.dart';
5+
export 'languages.dart';

lib/presentation/home/repositories/home_respository.dart

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart';
66
import 'package:get_it/get_it.dart';
77
import 'package:http_client/http_client.dart';
88
import 'package:qack/constants/constants.dart';
9+
import 'package:qack/presentation/home/bloc/home_bloc.dart';
910
import 'package:qack/presentation/home/models/baidu_translation.dart';
1011
import 'package:qack/presentation/home/models/base_translation_details.dart';
1112
import 'package:qack/presentation/home/models/deepseek_chat_completion.dart';
1213
import 'package:qack/presentation/home/models/deepseek_message.dart';
14+
import 'package:qack/presentation/home/models/models.dart';
1315
import 'package:qack/presentation/settings/models/models.dart';
1416

1517
final class HomeRepository {
@@ -20,8 +22,6 @@ final class HomeRepository {
2022

2123
Stream<BaseTranslationDetails> translateText(
2224
String text, {
23-
required String srcLanguage,
24-
required String targetLanguage,
2525
required TranslatorSettings translatorSettings,
2626
}) async* {
2727
final enabledTranslators = translatorSettings.enabledTranslators;
@@ -34,6 +34,21 @@ final class HomeRepository {
3434

3535
final futures = <Future<BaseTranslationDetails>>[];
3636

37+
// Detect the source and target language
38+
final srcLanguage = _detectLanguage(text);
39+
40+
late final Language targetLanguage;
41+
42+
switch (srcLanguage) {
43+
case Language.chinese:
44+
targetLanguage = Language.english;
45+
case Language.english:
46+
targetLanguage = Language.chinese;
47+
case Language.auto:
48+
case Language.unknown:
49+
targetLanguage = Language.english;
50+
}
51+
3752
for (final translator in enabledTranslators) {
3853
switch (translator) {
3954
case Translator.google:
@@ -49,8 +64,8 @@ final class HomeRepository {
4964
text,
5065
httpClient,
5166
rootIsolateToken,
52-
srcLanguage: srcLanguage,
53-
targetLanguage: targetLanguage,
67+
srcLanguage: srcLanguage.code ?? Language.auto.code!,
68+
targetLanguage: targetLanguage.code!,
5469
translatorSettings: translatorSettings,
5570
),
5671
),
@@ -66,8 +81,8 @@ final class HomeRepository {
6681
rootIsolateToken,
6782
// src and target lang are manually set to auto
6883
// in [DeepseekChatCompletion]
69-
srcLanguage: srcLanguage,
70-
targetLanguage: targetLanguage,
84+
srcLanguage: srcLanguage.code ?? Language.auto.code!,
85+
targetLanguage: targetLanguage.code!,
7186
translatorSettings: translatorSettings,
7287
),
7388
),
@@ -179,8 +194,7 @@ final class HomeRepository {
179194
model: DeepSeekModel.chat,
180195
messages: [
181196
DeepSeekUserMessage(
182-
uContent: 'Translate to English or Chinese. '
183-
'Only translate and do nothing else.'
197+
uContent: 'Translate to ${targetLanguage.toUpperCase()}:'
184198
' $inputText',
185199
),
186200
],
@@ -204,4 +218,21 @@ final class HomeRepository {
204218
return DeepseekChatCompletion.error(e);
205219
}
206220
}
221+
222+
Language _detectLanguage(String text) {
223+
// detect chinese characters using regex
224+
final chineseRegex = RegExp(r'[\u4e00-\u9fff]');
225+
final englishRegex = RegExp('[a-zA-Z]');
226+
227+
final totalChineseMatches = chineseRegex.allMatches(text);
228+
final totalEnglishMatches = englishRegex.allMatches(text);
229+
230+
if (totalChineseMatches.length > totalEnglishMatches.length) {
231+
return Language.chinese;
232+
} else if (totalEnglishMatches.length > totalChineseMatches.length) {
233+
return Language.english;
234+
} else {
235+
return Language.unknown;
236+
}
237+
}
207238
}

lib/presentation/home/view/home_page.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class HomeView extends StatelessWidget {
5757
const AppSearchBar(),
5858
InputText(
5959
controller: textController,
60-
suffix: InkWell(
60+
/* suffix: InkWell(
6161
customBorder: RoundedRectangleBorder(
6262
borderRadius: BorderRadius.circular(8),
6363
),
@@ -75,6 +75,7 @@ class HomeView extends StatelessWidget {
7575
),
7676
),
7777
),
78+
*/
7879
maxLength: 6000,
7980
minLines: 5,
8081
maxLines: 5,

0 commit comments

Comments
 (0)