-
Notifications
You must be signed in to change notification settings - Fork 357
Output change #597
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Output change #597
Changes from 15 commits
2d07031
c1d7b8d
7afcadc
e5ff288
01eb7b6
ec60ba4
11ee681
18aa444
8d7e98f
8aab6cb
4a610ac
6fa806e
e00552f
a81921b
a6567ff
3a5f784
98d229e
a81a246
1ac8ca9
8837249
66f3c49
220d643
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,80 @@ | ||||||||||||||||||||||||||||||||||||||
| import 'dart:async'; | ||||||||||||||||||||||||||||||||||||||
| import 'dart:developer'; | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| import 'package:flutter_webrtc/flutter_webrtc.dart' as webrtc; | ||||||||||||||||||||||||||||||||||||||
| import 'package:get/get.dart'; | ||||||||||||||||||||||||||||||||||||||
| import 'package:resonate/models/audio_device.dart'; | ||||||||||||||||||||||||||||||||||||||
| import 'package:resonate/utils/enums/audio_device_enum.dart'; | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| class AudioDeviceController extends GetxController { | ||||||||||||||||||||||||||||||||||||||
| final RxList<AudioDevice> audioOutputDevices = <AudioDevice>[].obs; | ||||||||||||||||||||||||||||||||||||||
| final Rx<AudioDevice?> selectedAudioOutput = Rx<AudioDevice?>(null); | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| Timer? _deviceEnumerationTimer; | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||
| void onInit() { | ||||||||||||||||||||||||||||||||||||||
| super.onInit(); | ||||||||||||||||||||||||||||||||||||||
| enumerateDevices(); | ||||||||||||||||||||||||||||||||||||||
| _deviceEnumerationTimer = Timer.periodic( | ||||||||||||||||||||||||||||||||||||||
| const Duration(seconds: 5), | ||||||||||||||||||||||||||||||||||||||
| (_) => enumerateDevices(), | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
| ); | ||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||
|
Comment on lines
15
to
23
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Prevent overlapping polls + keep selection consistent with current device list.
Proposed fix (in-flight guard + selection reconciliation) class AudioDeviceController extends GetxController {
final RxList<AudioDevice> audioOutputDevices = <AudioDevice>[].obs;
final Rx<AudioDevice?> selectedAudioOutput = Rx<AudioDevice?>(null);
Timer? _deviceEnumerationTimer;
+ bool _isEnumerating = false;
@override
void onInit() {
super.onInit();
enumerateDevices();
_deviceEnumerationTimer = Timer.periodic(
const Duration(seconds: 5),
(_) => enumerateDevices(),
);
}
Future<void> enumerateDevices() async {
+ if (_isEnumerating) return;
+ _isEnumerating = true;
try {
final devices = await webrtc.navigator.mediaDevices.enumerateDevices();
final outputs = devices
.map((device) => AudioDevice.fromMediaDeviceInfo(device))
.where((d) => d.isAudioOutput)
.toList();
audioOutputDevices.value = outputs;
- selectedAudioOutput.value ??= outputs.firstOrNull;
+ final selectedId = selectedAudioOutput.value?.deviceId;
+ final stillPresent = selectedId != null &&
+ outputs.any((d) => d.deviceId == selectedId);
+ if (!stillPresent) {
+ selectedAudioOutput.value = outputs.firstOrNull;
+ }
log('Enumerated ${outputs.length} output devices');
} catch (e) {
log('Error enumerating devices: $e');
+ } finally {
+ _isEnumerating = false;
}
}Also applies to: 31-44 |
||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||
| void onClose() { | ||||||||||||||||||||||||||||||||||||||
| _deviceEnumerationTimer?.cancel(); | ||||||||||||||||||||||||||||||||||||||
| super.onClose(); | ||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| Future<void> enumerateDevices() async { | ||||||||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||||||||
| final devices = await webrtc.navigator.mediaDevices.enumerateDevices(); | ||||||||||||||||||||||||||||||||||||||
| final outputs = devices | ||||||||||||||||||||||||||||||||||||||
| .map((device) => AudioDevice.fromMediaDeviceInfo(device)) | ||||||||||||||||||||||||||||||||||||||
| .where((d) => d.isAudioOutput) | ||||||||||||||||||||||||||||||||||||||
| .toList(); | ||||||||||||||||||||||||||||||||||||||
| audioOutputDevices.value = outputs; | ||||||||||||||||||||||||||||||||||||||
| selectedAudioOutput.value ??= outputs.firstOrNull; | ||||||||||||||||||||||||||||||||||||||
| log('Enumerated ${outputs.length} output devices'); | ||||||||||||||||||||||||||||||||||||||
| } catch (e) { | ||||||||||||||||||||||||||||||||||||||
| log('Error enumerating devices: $e'); | ||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| Future<void> selectAudioOutput(AudioDevice device) async { | ||||||||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||||||||
| selectedAudioOutput.value = device; | ||||||||||||||||||||||||||||||||||||||
| await webrtc.Helper.selectAudioOutput(device.deviceId); | ||||||||||||||||||||||||||||||||||||||
| log('Selected audio output: ${device.label}'); | ||||||||||||||||||||||||||||||||||||||
| } catch (e) { | ||||||||||||||||||||||||||||||||||||||
| log('Error selecting audio output: $e'); | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||
|
Comment on lines
46
to
57
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: find . -name "audio_device_controller.dart" -type fRepository: AOSSIE-Org/Resonate Length of output: 109 🏁 Script executed: cat -n ./lib/controllers/audio_device_controller.dart | head -70Repository: AOSSIE-Org/Resonate Length of output: 2679 🏁 Script executed: cat -n ./lib/controllers/audio_device_controller.dart | tail -30Repository: AOSSIE-Org/Resonate Length of output: 1115 🏁 Script executed: # Search for other device selection methods in the controller
rg "selectAudio|setAudio" ./lib/controllers/audio_device_controller.dartRepository: AOSSIE-Org/Resonate Length of output: 185 🏁 Script executed: # Search for all methods that set selectedAudio* values in this file
rg "selectedAudio" ./lib/controllers/audio_device_controller.dartRepository: AOSSIE-Org/Resonate Length of output: 232 🏁 Script executed: # Check if there's a selectAudioInput method with the same pattern
rg -A 10 "selectAudioInput|inputDevice" ./lib/controllers/audio_device_controller.dartRepository: AOSSIE-Org/Resonate Length of output: 45 🏁 Script executed: # Search for webrtc.Helper.selectAudioOutput usage elsewhere
rg "selectAudioOutput" --type dartRepository: AOSSIE-Org/Resonate Length of output: 665 🏁 Script executed: cat -n ./test/controllers/audio_device_controller_test.dartRepository: AOSSIE-Org/Resonate Length of output: 6991 Move Currently, Proposed fix Future<void> selectAudioOutput(AudioDevice device) async {
try {
- selectedAudioOutput.value = device;
await webrtc.Helper.selectAudioOutput(device.deviceId);
+ selectedAudioOutput.value = device;
log('Selected audio output: ${device.label}');
} catch (e) {
log('Error selecting audio output: $e');
}
}📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| AudioDeviceType getDeviceType(AudioDevice device) { | ||||||||||||||||||||||||||||||||||||||
| return AudioDeviceType.fromLabel(device.label); | ||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| String getDeviceName(AudioDevice device) { | ||||||||||||||||||||||||||||||||||||||
| final deviceType = getDeviceType(device); | ||||||||||||||||||||||||||||||||||||||
| log('Device label: "${device.label}" -> type: ${deviceType.name}'); | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| if (deviceType == AudioDeviceType.bluetoothAudio) { | ||||||||||||||||||||||||||||||||||||||
| return device.label; | ||||||||||||||||||||||||||||||||||||||
| } else if (deviceType == AudioDeviceType.unknown && | ||||||||||||||||||||||||||||||||||||||
| device.label.isNotEmpty) { | ||||||||||||||||||||||||||||||||||||||
| return device.label; | ||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||
| return device.label.isNotEmpty ? deviceType.displayName : 'Unknown Device'; | ||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| String getDeviceIcon(AudioDevice device) { | ||||||||||||||||||||||||||||||||||||||
| return getDeviceType(device).iconName; | ||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| Future<void> refreshDevices() async { | ||||||||||||||||||||||||||||||||||||||
| await enumerateDevices(); | ||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -5,6 +5,7 @@ import 'package:resonate/controllers/friend_calling_controller.dart'; | |
| import 'package:resonate/themes/theme_controller.dart'; | ||
| import 'package:resonate/utils/ui_sizes.dart'; | ||
| import 'package:resonate/views/widgets/room_header.dart'; | ||
| import 'package:resonate/views/widgets/audio_selector_dialog.dart'; | ||
|
|
||
| import 'package:resonate/l10n/app_localizations.dart'; | ||
|
|
||
|
|
@@ -128,6 +129,15 @@ class FriendCallScreen extends StatelessWidget { | |
| : _getControlButtonBackgroundColor(currentBrightness), | ||
| heroTag: "speaker", | ||
| ), | ||
| _buildControlButton( | ||
| icon: Icons.settings_voice, | ||
| label: 'Audio Options', | ||
|
||
| onPressed: () async => await showAudioDeviceSelector(context), | ||
| backgroundColor: _getControlButtonBackgroundColor( | ||
| currentBrightness, | ||
| ), | ||
| heroTag: "audio-settings", | ||
| ), | ||
coderabbitai[bot] marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| _buildControlButton( | ||
| icon: Icons.cancel_outlined, | ||
| label: AppLocalizations.of(context)!.end, | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -200,7 +200,7 @@ class AppLocalizationsBn extends AppLocalizations { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get continueWithGitHub => 'GitHub দিয়ে সাইন ইন করুন'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get resonateLogo => 'রেজোনেট লোগো'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get resonateLogo => 'রেজোনেট লোগো'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get iAlreadyHaveAnAccount => 'আপনার ইতিমধ্যেই একটি অ্যাকাউন্ট আছে'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -591,7 +591,7 @@ class AppLocalizationsBn extends AppLocalizations { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get scheduledDateTimePast => 'নির্ধারিত তারিখ-সময় অতীতের হতে পারে না'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get joinRoom => 'রুমে যোগ দিন'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get joinRoom => 'রুমে যোগ দিন'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get unknownUser => 'অজানা'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -770,7 +770,7 @@ class AppLocalizationsBn extends AppLocalizations { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String description, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| int participants, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return '🚀এই অসাধারণ রুমটি দেখুন: $roomName!\n\n📖 বিবরণ: $description\n👥 এখনই $participants অংশগ্রহণকারীদের সাথে যোগ দিন!'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return '🚀এই অসাধারণ রুমটি দেখুন: $roomName!\n\n📖 বিবরণ: $description\n👥 এখনই $participants অংশগ্রহণকারীদের সাথে যোগ দিন!'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -813,7 +813,7 @@ class AppLocalizationsBn extends AppLocalizations { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get unableToReconnect => | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'রুমে পুনরায় সংযোগ করা সম্ভব হচ্ছে না। অনুগ্রহ করে আবার যোগ দেওয়ার চেষ্টা করুন।'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'রুমে পুনরায় সংযোগ করা সম্ভব হচ্ছে না। অনুগ্রহ করে আবার যোগ দেওয়ার চেষ্টা করুন।'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get invalidFormat => 'অবৈধ ফর্ম্যাট!'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -1354,6 +1354,21 @@ class AppLocalizationsBn extends AppLocalizations { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get noRecordingError => | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'আপনি অধ্যায়টির জন্য কিছুই রেকর্ড করোনি। রুম থেকে বের হওয়ার আগে অনুগ্রহ করে একটি অধ্যায় রেকর্ড করুন।'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get audioOutput => 'Audio Output'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get selectPreferredSpeaker => 'Select your preferred speaker'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get noAudioOutputDevices => 'No audio output devices detected'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get refresh => 'Refresh'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get done => 'Done'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+1360
to
+1374
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. English strings used instead of Bengali translations. Lines 1357-1371 contain English strings instead of proper Bengali (বাংলা) translations. This defeats the purpose of localization for Bengali users. The strings should be translated to Bengali:
Note: These keys are correctly listed in 💡 Suggested Bengali translationsHere are suggested Bengali translations (please verify with a native speaker): @override
-String get audioOutput => 'Audio Output';
+String get audioOutput => 'অডিও আউটপুট';
@override
-String get selectPreferredSpeaker => 'Select your preferred speaker';
+String get selectPreferredSpeaker => 'আপনার পছন্দের স্পিকার নির্বাচন করুন';
@override
-String get noAudioOutputDevices => 'No audio output devices detected';
+String get noAudioOutputDevices => 'কোনও অডিও আউটপুট ডিভাইস সনাক্ত করা যায়নি';
@override
-String get refresh => 'Refresh';
+String get refresh => 'রিফ্রেশ করুন';
@override
-String get done => 'Done';
+String get done => 'সম্পন্ন';📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String get deleteMessageTitle => 'বার্তা মুছে ফেলুন'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1343,6 +1343,21 @@ class AppLocalizationsGu extends AppLocalizations { | |
| String get noRecordingError => | ||
| 'તમે અધ્યાય માટે કઈ પણ રેકોર્ડિંગ નથી કર્યું. રૂમમાંથી બહાર નીકળતા પહેલાં કૃપા કરીને અધ્યાય રેકોર્ડ કરો.'; | ||
|
|
||
| @override | ||
| String get audioOutput => 'Audio Output'; | ||
|
|
||
| @override | ||
| String get selectPreferredSpeaker => 'Select your preferred speaker'; | ||
|
|
||
| @override | ||
| String get noAudioOutputDevices => 'No audio output devices detected'; | ||
|
|
||
| @override | ||
| String get refresh => 'Refresh'; | ||
|
|
||
| @override | ||
| String get done => 'Done'; | ||
|
|
||
|
Comment on lines
+1349
to
+1363
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Gujarati locale strings are left in English (likely placeholder). These new getters return English text in the |
||
| @override | ||
| String get deleteMessageTitle => 'સંદેશ કાઢી નાખો'; | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1350,6 +1350,21 @@ class AppLocalizationsKn extends AppLocalizations { | |
| String get noRecordingError => | ||
| 'ನೀವು ಅಧ್ಯಾಯಕ್ಕಾಗಿ ಏನನ್ನೂ ರೆಕಾರ್ಡ್ ಮಾಡಿಲ್ಲ. ದಯವಿಟ್ಟು ರೂಮ್ನಿಂದ ನಿರ್ಗಮಿಸುವ ಮೊದಲು ಅಧ್ಯಾಯವನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಿ'; | ||
|
|
||
| @override | ||
| String get audioOutput => 'Audio Output'; | ||
|
|
||
| @override | ||
| String get selectPreferredSpeaker => 'Select your preferred speaker'; | ||
|
|
||
| @override | ||
| String get noAudioOutputDevices => 'No audio output devices detected'; | ||
|
|
||
| @override | ||
| String get refresh => 'Refresh'; | ||
|
|
||
| @override | ||
| String get done => 'Done'; | ||
|
|
||
|
Comment on lines
+1356
to
+1370
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Missing Kannada translations for new audio output keys. The five new localization getters return English strings instead of Kannada translations, breaking the localization pattern established throughout the file. All other strings in this file are properly translated to Kannada. Expected Kannada translations for:
🤖 Prompt for AI Agents |
||
| @override | ||
| String get deleteMessageTitle => 'Delete Message'; | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1344,6 +1344,21 @@ class AppLocalizationsMr extends AppLocalizations { | |
| String get noRecordingError => | ||
| 'आपने अध्यायसाठी कोणतेही रेकॉर्डिंग केले नाही. कोठा बंद करण्यापूर्वी कृपया अध्याय रेकॉर्ड करा'; | ||
|
|
||
| @override | ||
| String get audioOutput => 'Audio Output'; | ||
|
|
||
| @override | ||
| String get selectPreferredSpeaker => 'Select your preferred speaker'; | ||
|
|
||
| @override | ||
| String get noAudioOutputDevices => 'No audio output devices detected'; | ||
|
|
||
| @override | ||
| String get refresh => 'Refresh'; | ||
|
|
||
| @override | ||
| String get done => 'Done'; | ||
|
|
||
|
Comment on lines
+1350
to
+1364
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Marathi locale strings are left in English (likely placeholder). These new getters return English text in the 🤖 Prompt for AI Agents |
||
| @override | ||
| String get deleteMessageTitle => 'संदेश हटवा'; | ||
|
|
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
await the first call as well