diff --git a/android/app/build.gradle b/android/app/build.gradle index ad1ee6c9..a8028072 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -27,8 +27,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion rootProject.ext.compileSdkVersion - ndkVersion flutter.ndkVersion + compileSdkVersion 34 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 diff --git a/lib/app/data/models/alarm_model.dart b/lib/app/data/models/alarm_model.dart index 22c97255..44e340e2 100644 --- a/lib/app/data/models/alarm_model.dart +++ b/lib/app/data/models/alarm_model.dart @@ -1,6 +1,6 @@ import 'dart:convert'; -import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:cloud_firestore/cloud_firestore.dart' as firestore; import 'package:isar/isar.dart'; import 'package:ultimate_alarm_clock/app/data/models/user_model.dart'; @@ -43,11 +43,15 @@ class AlarmModel { late String label; late bool isOneTime; late int snoozeDuration; + late int gradient; late String ringtoneName; late String note; late bool deleteAfterGoesOff; late bool showMotivationalQuote; late bool isTimer; + late double volMax; + late double volMin; + @ignore Map? offsetDetails; @@ -84,15 +88,18 @@ class AlarmModel { required this.label, required this.isOneTime, required this.snoozeDuration, + required this.gradient, required this.ringtoneName, required this.note, required this.deleteAfterGoesOff, required this.showMotivationalQuote, required this.isTimer, + required this.volMax, + required this.volMin, }); AlarmModel.fromDocumentSnapshot({ - required DocumentSnapshot documentSnapshot, + required firestore.DocumentSnapshot documentSnapshot, required UserModel? user, }) { // Making sure the alarms work with the offsets @@ -114,6 +121,7 @@ class AlarmModel { minutesSinceMidnight = documentSnapshot['minutesSinceMidnight']; } snoozeDuration = documentSnapshot['snoozeDuration']; + gradient = documentSnapshot['gradient']; label = documentSnapshot['label']; isOneTime = documentSnapshot['isOneTime']; firestoreId = documentSnapshot.id; @@ -147,11 +155,14 @@ class AlarmModel { deleteAfterGoesOff = documentSnapshot['deleteAfterGoesOff']; showMotivationalQuote = documentSnapshot['showMotivationalQuote']; isTimer = documentSnapshot['isTimer']; + volMax = documentSnapshot['volMax']; + volMin = documentSnapshot['volMin']; } AlarmModel.fromMap(Map alarmData) { // Making sure the alarms work with the offsets snoozeDuration = alarmData['snoozeDuration']; + gradient = alarmData['gradient']; isSharedAlarmEnabled = alarmData['isSharedAlarmEnabled']; minutesSinceMidnight = alarmData['minutesSinceMidnight']; alarmTime = alarmData['alarmTime']; @@ -190,6 +201,8 @@ class AlarmModel { deleteAfterGoesOff = alarmData['deleteAfterGoesOff']; showMotivationalQuote = alarmData['showMotivationalQuote']; isTimer = alarmData['isTimer']; + volMin = alarmData['volMin']; + volMax = alarmData['volMax']; } AlarmModel.fromJson(String alarmData, UserModel? user) { @@ -233,11 +246,14 @@ class AlarmModel { 'isPedometerEnabled': alarmRecord.isPedometerEnabled, 'numberOfSteps': alarmRecord.numberOfSteps, 'snoozeDuration': alarmRecord.snoozeDuration, + 'gradient': alarmRecord.gradient, 'ringtoneName': alarmRecord.ringtoneName, 'note': alarmRecord.note, 'deleteAfterGoesOff': alarmRecord.deleteAfterGoesOff, 'showMotivationalQuote': alarmRecord.showMotivationalQuote, 'isTimer': alarmRecord.isTimer, + 'volMin': alarmRecord.volMin, + 'volMax': alarmRecord.volMax, }; if (alarmRecord.isSharedAlarmEnabled) { diff --git a/lib/app/data/models/alarm_model.g.dart b/lib/app/data/models/alarm_model.g.dart index 37d450aa..452defaa 100644 --- a/lib/app/data/models/alarm_model.g.dart +++ b/lib/app/data/models/alarm_model.g.dart @@ -47,158 +47,173 @@ const AlarmModelSchema = CollectionSchema( name: r'firestoreId', type: IsarType.string, ), - r'intervalToAlarm': PropertySchema( + r'gradient': PropertySchema( id: 6, + name: r'gradient', + type: IsarType.long, + ), + r'intervalToAlarm': PropertySchema( + id: 7, name: r'intervalToAlarm', type: IsarType.long, ), r'isActivityEnabled': PropertySchema( - id: 7, + id: 8, name: r'isActivityEnabled', type: IsarType.bool, ), r'isEnabled': PropertySchema( - id: 8, + id: 9, name: r'isEnabled', type: IsarType.bool, ), r'isLocationEnabled': PropertySchema( - id: 9, + id: 10, name: r'isLocationEnabled', type: IsarType.bool, ), r'isMathsEnabled': PropertySchema( - id: 10, + id: 11, name: r'isMathsEnabled', type: IsarType.bool, ), r'isOneTime': PropertySchema( - id: 11, + id: 12, name: r'isOneTime', type: IsarType.bool, ), r'isPedometerEnabled': PropertySchema( - id: 12, + id: 13, name: r'isPedometerEnabled', type: IsarType.bool, ), r'isQrEnabled': PropertySchema( - id: 13, + id: 14, name: r'isQrEnabled', type: IsarType.bool, ), r'isShakeEnabled': PropertySchema( - id: 14, + id: 15, name: r'isShakeEnabled', type: IsarType.bool, ), r'isSharedAlarmEnabled': PropertySchema( - id: 15, + id: 16, name: r'isSharedAlarmEnabled', type: IsarType.bool, ), r'isTimer': PropertySchema( - id: 16, + id: 17, name: r'isTimer', type: IsarType.bool, ), r'isWeatherEnabled': PropertySchema( - id: 17, + id: 18, name: r'isWeatherEnabled', type: IsarType.bool, ), r'label': PropertySchema( - id: 18, + id: 19, name: r'label', type: IsarType.string, ), r'lastEditedUserId': PropertySchema( - id: 19, + id: 20, name: r'lastEditedUserId', type: IsarType.string, ), r'location': PropertySchema( - id: 20, + id: 21, name: r'location', type: IsarType.string, ), r'mainAlarmTime': PropertySchema( - id: 21, + id: 22, name: r'mainAlarmTime', type: IsarType.string, ), r'mathsDifficulty': PropertySchema( - id: 22, + id: 23, name: r'mathsDifficulty', type: IsarType.long, ), r'minutesSinceMidnight': PropertySchema( - id: 23, + id: 24, name: r'minutesSinceMidnight', type: IsarType.long, ), r'mutexLock': PropertySchema( - id: 24, + id: 25, name: r'mutexLock', type: IsarType.bool, ), r'note': PropertySchema( - id: 25, + id: 26, name: r'note', type: IsarType.string, ), r'numMathsQuestions': PropertySchema( - id: 26, + id: 27, name: r'numMathsQuestions', type: IsarType.long, ), r'numberOfSteps': PropertySchema( - id: 27, + id: 28, name: r'numberOfSteps', type: IsarType.long, ), r'ownerId': PropertySchema( - id: 28, + id: 29, name: r'ownerId', type: IsarType.string, ), r'ownerName': PropertySchema( - id: 29, + id: 30, name: r'ownerName', type: IsarType.string, ), r'qrValue': PropertySchema( - id: 30, + id: 31, name: r'qrValue', type: IsarType.string, ), r'ringtoneName': PropertySchema( - id: 31, + id: 32, name: r'ringtoneName', type: IsarType.string, ), r'shakeTimes': PropertySchema( - id: 32, + id: 33, name: r'shakeTimes', type: IsarType.long, ), r'sharedUserIds': PropertySchema( - id: 33, + id: 34, name: r'sharedUserIds', type: IsarType.stringList, ), r'showMotivationalQuote': PropertySchema( - id: 34, + id: 35, name: r'showMotivationalQuote', type: IsarType.bool, ), r'snoozeDuration': PropertySchema( - id: 35, + id: 36, name: r'snoozeDuration', type: IsarType.long, ), + r'volMax': PropertySchema( + id: 37, + name: r'volMax', + type: IsarType.double, + ), + r'volMin': PropertySchema( + id: 38, + name: r'volMin', + type: IsarType.double, + ), r'weatherTypes': PropertySchema( - id: 36, + id: 39, name: r'weatherTypes', type: IsarType.longList, ) @@ -274,37 +289,40 @@ void _alarmModelSerialize( writer.writeBoolList(offsets[3], object.days); writer.writeBool(offsets[4], object.deleteAfterGoesOff); writer.writeString(offsets[5], object.firestoreId); - writer.writeLong(offsets[6], object.intervalToAlarm); - writer.writeBool(offsets[7], object.isActivityEnabled); - writer.writeBool(offsets[8], object.isEnabled); - writer.writeBool(offsets[9], object.isLocationEnabled); - writer.writeBool(offsets[10], object.isMathsEnabled); - writer.writeBool(offsets[11], object.isOneTime); - writer.writeBool(offsets[12], object.isPedometerEnabled); - writer.writeBool(offsets[13], object.isQrEnabled); - writer.writeBool(offsets[14], object.isShakeEnabled); - writer.writeBool(offsets[15], object.isSharedAlarmEnabled); - writer.writeBool(offsets[16], object.isTimer); - writer.writeBool(offsets[17], object.isWeatherEnabled); - writer.writeString(offsets[18], object.label); - writer.writeString(offsets[19], object.lastEditedUserId); - writer.writeString(offsets[20], object.location); - writer.writeString(offsets[21], object.mainAlarmTime); - writer.writeLong(offsets[22], object.mathsDifficulty); - writer.writeLong(offsets[23], object.minutesSinceMidnight); - writer.writeBool(offsets[24], object.mutexLock); - writer.writeString(offsets[25], object.note); - writer.writeLong(offsets[26], object.numMathsQuestions); - writer.writeLong(offsets[27], object.numberOfSteps); - writer.writeString(offsets[28], object.ownerId); - writer.writeString(offsets[29], object.ownerName); - writer.writeString(offsets[30], object.qrValue); - writer.writeString(offsets[31], object.ringtoneName); - writer.writeLong(offsets[32], object.shakeTimes); - writer.writeStringList(offsets[33], object.sharedUserIds); - writer.writeBool(offsets[34], object.showMotivationalQuote); - writer.writeLong(offsets[35], object.snoozeDuration); - writer.writeLongList(offsets[36], object.weatherTypes); + writer.writeLong(offsets[6], object.gradient); + writer.writeLong(offsets[7], object.intervalToAlarm); + writer.writeBool(offsets[8], object.isActivityEnabled); + writer.writeBool(offsets[9], object.isEnabled); + writer.writeBool(offsets[10], object.isLocationEnabled); + writer.writeBool(offsets[11], object.isMathsEnabled); + writer.writeBool(offsets[12], object.isOneTime); + writer.writeBool(offsets[13], object.isPedometerEnabled); + writer.writeBool(offsets[14], object.isQrEnabled); + writer.writeBool(offsets[15], object.isShakeEnabled); + writer.writeBool(offsets[16], object.isSharedAlarmEnabled); + writer.writeBool(offsets[17], object.isTimer); + writer.writeBool(offsets[18], object.isWeatherEnabled); + writer.writeString(offsets[19], object.label); + writer.writeString(offsets[20], object.lastEditedUserId); + writer.writeString(offsets[21], object.location); + writer.writeString(offsets[22], object.mainAlarmTime); + writer.writeLong(offsets[23], object.mathsDifficulty); + writer.writeLong(offsets[24], object.minutesSinceMidnight); + writer.writeBool(offsets[25], object.mutexLock); + writer.writeString(offsets[26], object.note); + writer.writeLong(offsets[27], object.numMathsQuestions); + writer.writeLong(offsets[28], object.numberOfSteps); + writer.writeString(offsets[29], object.ownerId); + writer.writeString(offsets[30], object.ownerName); + writer.writeString(offsets[31], object.qrValue); + writer.writeString(offsets[32], object.ringtoneName); + writer.writeLong(offsets[33], object.shakeTimes); + writer.writeStringList(offsets[34], object.sharedUserIds); + writer.writeBool(offsets[35], object.showMotivationalQuote); + writer.writeLong(offsets[36], object.snoozeDuration); + writer.writeDouble(offsets[37], object.volMax); + writer.writeDouble(offsets[38], object.volMin); + writer.writeLongList(offsets[39], object.weatherTypes); } AlarmModel _alarmModelDeserialize( @@ -319,37 +337,40 @@ AlarmModel _alarmModelDeserialize( alarmTime: reader.readString(offsets[2]), days: reader.readBoolList(offsets[3]) ?? [], deleteAfterGoesOff: reader.readBool(offsets[4]), - intervalToAlarm: reader.readLong(offsets[6]), - isActivityEnabled: reader.readBool(offsets[7]), - isEnabled: reader.readBoolOrNull(offsets[8]) ?? true, - isLocationEnabled: reader.readBool(offsets[9]), - isMathsEnabled: reader.readBool(offsets[10]), - isOneTime: reader.readBool(offsets[11]), - isPedometerEnabled: reader.readBool(offsets[12]), - isQrEnabled: reader.readBool(offsets[13]), - isShakeEnabled: reader.readBool(offsets[14]), - isSharedAlarmEnabled: reader.readBool(offsets[15]), - isTimer: reader.readBool(offsets[16]), - isWeatherEnabled: reader.readBool(offsets[17]), - label: reader.readString(offsets[18]), - lastEditedUserId: reader.readString(offsets[19]), - location: reader.readString(offsets[20]), - mainAlarmTime: reader.readStringOrNull(offsets[21]), - mathsDifficulty: reader.readLong(offsets[22]), - minutesSinceMidnight: reader.readLong(offsets[23]), - mutexLock: reader.readBool(offsets[24]), - note: reader.readString(offsets[25]), - numMathsQuestions: reader.readLong(offsets[26]), - numberOfSteps: reader.readLong(offsets[27]), - ownerId: reader.readString(offsets[28]), - ownerName: reader.readString(offsets[29]), - qrValue: reader.readString(offsets[30]), - ringtoneName: reader.readString(offsets[31]), - shakeTimes: reader.readLong(offsets[32]), - sharedUserIds: reader.readStringList(offsets[33]), - showMotivationalQuote: reader.readBool(offsets[34]), - snoozeDuration: reader.readLong(offsets[35]), - weatherTypes: reader.readLongList(offsets[36]) ?? [], + gradient: reader.readLong(offsets[6]), + intervalToAlarm: reader.readLong(offsets[7]), + isActivityEnabled: reader.readBool(offsets[8]), + isEnabled: reader.readBoolOrNull(offsets[9]) ?? true, + isLocationEnabled: reader.readBool(offsets[10]), + isMathsEnabled: reader.readBool(offsets[11]), + isOneTime: reader.readBool(offsets[12]), + isPedometerEnabled: reader.readBool(offsets[13]), + isQrEnabled: reader.readBool(offsets[14]), + isShakeEnabled: reader.readBool(offsets[15]), + isSharedAlarmEnabled: reader.readBool(offsets[16]), + isTimer: reader.readBool(offsets[17]), + isWeatherEnabled: reader.readBool(offsets[18]), + label: reader.readString(offsets[19]), + lastEditedUserId: reader.readString(offsets[20]), + location: reader.readString(offsets[21]), + mainAlarmTime: reader.readStringOrNull(offsets[22]), + mathsDifficulty: reader.readLong(offsets[23]), + minutesSinceMidnight: reader.readLong(offsets[24]), + mutexLock: reader.readBool(offsets[25]), + note: reader.readString(offsets[26]), + numMathsQuestions: reader.readLong(offsets[27]), + numberOfSteps: reader.readLong(offsets[28]), + ownerId: reader.readString(offsets[29]), + ownerName: reader.readString(offsets[30]), + qrValue: reader.readString(offsets[31]), + ringtoneName: reader.readString(offsets[32]), + shakeTimes: reader.readLong(offsets[33]), + sharedUserIds: reader.readStringList(offsets[34]), + showMotivationalQuote: reader.readBool(offsets[35]), + snoozeDuration: reader.readLong(offsets[36]), + volMax: reader.readDouble(offsets[37]), + volMin: reader.readDouble(offsets[38]), + weatherTypes: reader.readLongList(offsets[39]) ?? [], ); object.firestoreId = reader.readStringOrNull(offsets[5]); object.isarId = id; @@ -378,11 +399,11 @@ P _alarmModelDeserializeProp

( case 6: return (reader.readLong(offset)) as P; case 7: - return (reader.readBool(offset)) as P; + return (reader.readLong(offset)) as P; case 8: - return (reader.readBoolOrNull(offset) ?? true) as P; - case 9: return (reader.readBool(offset)) as P; + case 9: + return (reader.readBoolOrNull(offset) ?? true) as P; case 10: return (reader.readBool(offset)) as P; case 11: @@ -400,27 +421,27 @@ P _alarmModelDeserializeProp

( case 17: return (reader.readBool(offset)) as P; case 18: - return (reader.readString(offset)) as P; + return (reader.readBool(offset)) as P; case 19: return (reader.readString(offset)) as P; case 20: return (reader.readString(offset)) as P; case 21: - return (reader.readStringOrNull(offset)) as P; + return (reader.readString(offset)) as P; case 22: - return (reader.readLong(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 23: return (reader.readLong(offset)) as P; case 24: - return (reader.readBool(offset)) as P; + return (reader.readLong(offset)) as P; case 25: - return (reader.readString(offset)) as P; + return (reader.readBool(offset)) as P; case 26: - return (reader.readLong(offset)) as P; + return (reader.readString(offset)) as P; case 27: return (reader.readLong(offset)) as P; case 28: - return (reader.readString(offset)) as P; + return (reader.readLong(offset)) as P; case 29: return (reader.readString(offset)) as P; case 30: @@ -428,14 +449,20 @@ P _alarmModelDeserializeProp

( case 31: return (reader.readString(offset)) as P; case 32: - return (reader.readLong(offset)) as P; + return (reader.readString(offset)) as P; case 33: - return (reader.readStringList(offset)) as P; + return (reader.readLong(offset)) as P; case 34: - return (reader.readBool(offset)) as P; + return (reader.readStringList(offset)) as P; case 35: - return (reader.readLong(offset)) as P; + return (reader.readBool(offset)) as P; case 36: + return (reader.readLong(offset)) as P; + case 37: + return (reader.readDouble(offset)) as P; + case 38: + return (reader.readDouble(offset)) as P; + case 39: return (reader.readLongList(offset) ?? []) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -1119,6 +1146,60 @@ extension AlarmModelQueryFilter }); } + QueryBuilder gradientEqualTo( + int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'gradient', + value: value, + )); + }); + } + + QueryBuilder + gradientGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'gradient', + value: value, + )); + }); + } + + QueryBuilder gradientLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'gradient', + value: value, + )); + }); + } + + QueryBuilder gradientBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'gradient', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder intervalToAlarmEqualTo(int value) { return QueryBuilder.apply(this, (query) { @@ -3155,6 +3236,130 @@ extension AlarmModelQueryFilter }); } + QueryBuilder volMaxEqualTo( + double value, { + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'volMax', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder volMaxGreaterThan( + double value, { + bool include = false, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'volMax', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder volMaxLessThan( + double value, { + bool include = false, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'volMax', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder volMaxBetween( + double lower, + double upper, { + bool includeLower = true, + bool includeUpper = true, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'volMax', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + epsilon: epsilon, + )); + }); + } + + QueryBuilder volMinEqualTo( + double value, { + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'volMin', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder volMinGreaterThan( + double value, { + bool include = false, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'volMin', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder volMinLessThan( + double value, { + bool include = false, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'volMin', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder volMinBetween( + double lower, + double upper, { + bool includeLower = true, + bool includeUpper = true, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'volMin', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + epsilon: epsilon, + )); + }); + } + QueryBuilder weatherTypesElementEqualTo(int value) { return QueryBuilder.apply(this, (query) { @@ -3372,6 +3577,18 @@ extension AlarmModelQuerySortBy }); } + QueryBuilder sortByGradient() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'gradient', Sort.asc); + }); + } + + QueryBuilder sortByGradientDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'gradient', Sort.desc); + }); + } + QueryBuilder sortByIntervalToAlarm() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'intervalToAlarm', Sort.asc); @@ -3737,6 +3954,30 @@ extension AlarmModelQuerySortBy return query.addSortBy(r'snoozeDuration', Sort.desc); }); } + + QueryBuilder sortByVolMax() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMax', Sort.asc); + }); + } + + QueryBuilder sortByVolMaxDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMax', Sort.desc); + }); + } + + QueryBuilder sortByVolMin() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMin', Sort.asc); + }); + } + + QueryBuilder sortByVolMinDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMin', Sort.desc); + }); + } } extension AlarmModelQuerySortThenBy @@ -3804,6 +4045,18 @@ extension AlarmModelQuerySortThenBy }); } + QueryBuilder thenByGradient() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'gradient', Sort.asc); + }); + } + + QueryBuilder thenByGradientDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'gradient', Sort.desc); + }); + } + QueryBuilder thenByIntervalToAlarm() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'intervalToAlarm', Sort.asc); @@ -4181,6 +4434,30 @@ extension AlarmModelQuerySortThenBy return query.addSortBy(r'snoozeDuration', Sort.desc); }); } + + QueryBuilder thenByVolMax() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMax', Sort.asc); + }); + } + + QueryBuilder thenByVolMaxDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMax', Sort.desc); + }); + } + + QueryBuilder thenByVolMin() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMin', Sort.asc); + }); + } + + QueryBuilder thenByVolMinDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMin', Sort.desc); + }); + } } extension AlarmModelQueryWhereDistinct @@ -4225,6 +4502,12 @@ extension AlarmModelQueryWhereDistinct }); } + QueryBuilder distinctByGradient() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'gradient'); + }); + } + QueryBuilder distinctByIntervalToAlarm() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'intervalToAlarm'); @@ -4423,6 +4706,18 @@ extension AlarmModelQueryWhereDistinct }); } + QueryBuilder distinctByVolMax() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'volMax'); + }); + } + + QueryBuilder distinctByVolMin() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'volMin'); + }); + } + QueryBuilder distinctByWeatherTypes() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'weatherTypes'); @@ -4475,6 +4770,12 @@ extension AlarmModelQueryProperty }); } + QueryBuilder gradientProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'gradient'); + }); + } + QueryBuilder intervalToAlarmProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'intervalToAlarm'); @@ -4661,6 +4962,18 @@ extension AlarmModelQueryProperty }); } + QueryBuilder volMaxProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'volMax'); + }); + } + + QueryBuilder volMinProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'volMin'); + }); + } + QueryBuilder, QQueryOperations> weatherTypesProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'weatherTypes'); diff --git a/lib/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart b/lib/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart index 1ef60922..2f79ce7e 100644 --- a/lib/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart +++ b/lib/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart @@ -82,6 +82,10 @@ class AddOrUpdateAlarmController extends GetxController { final deleteAfterGoesOff = false.obs; final RxBool showMotivationalQuote = false.obs; + final RxInt gradient = 0.obs; + final RxDouble selectedGradientDouble = 0.0.obs; + final RxDouble volMin = 0.0.obs; + final RxDouble volMax = 10.0.obs; Future> fetchUserDetailsForSharedUsers() async { List userDetails = []; @@ -96,6 +100,15 @@ class AddOrUpdateAlarmController extends GetxController { RxBool isDailySelected = false.obs; RxBool isWeekdaysSelected = false.obs; RxBool isCustomSelected = false.obs; + RxBool isPlaying = false.obs; // Observable boolean to track playing state + + void toggleIsPlaying() { + isPlaying.toggle(); + } + + void resetIsPlaying() { + isPlaying.value = false; + } void setIsDailySelected(bool value) { isDailySelected.value = value; @@ -105,6 +118,10 @@ class AddOrUpdateAlarmController extends GetxController { } } + void setGradient(int value) { + this.gradient.value = value; + } + void setIsWeekdaysSelected(bool value) { isWeekdaysSelected.value = value; if (value == true) { @@ -513,6 +530,9 @@ class AddOrUpdateAlarmController extends GetxController { if (Get.arguments != null) { snoozeDuration.value = alarmRecord!.snoozeDuration; + gradient.value = alarmRecord!.gradient; + volMin.value = alarmRecord!.volMin; + volMax.value = alarmRecord!.volMax; isOneTime.value = alarmRecord!.isOneTime; deleteAfterGoesOff.value = alarmRecord!.deleteAfterGoesOff; label.value = alarmRecord!.label; @@ -678,6 +698,9 @@ class AddOrUpdateAlarmController extends GetxController { AlarmModel updatedAlarmModel() { return AlarmModel( snoozeDuration: snoozeDuration.value, + volMax: volMax.value, + volMin: volMin.value, + gradient: gradient.value, label: label.value, isOneTime: isOneTime.value, deleteAfterGoesOff: deleteAfterGoesOff.value, diff --git a/lib/app/modules/addOrUpdateAlarm/views/add_or_update_alarm_view.dart b/lib/app/modules/addOrUpdateAlarm/views/add_or_update_alarm_view.dart index b08bcddc..fd25693a 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/add_or_update_alarm_view.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/add_or_update_alarm_view.dart @@ -8,6 +8,7 @@ import 'package:ultimate_alarm_clock/app/data/models/alarm_model.dart'; import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/controllers/input_time_controller.dart'; import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/alarm_id_tile.dart'; import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/alarm_offset_tile.dart'; +import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/ascending_volume.dart'; import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/choose_ringtone_tile.dart'; import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/delete_tile.dart'; import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/label_tile.dart'; @@ -173,6 +174,9 @@ class AddOrUpdateAlarmView extends GetView { deleteAfterGoesOff: controller.deleteAfterGoesOff.value, snoozeDuration: controller.snoozeDuration.value, + volMax: controller.volMax.value, + volMin: controller.volMin.value, + gradient: controller.gradient.value, offsetDetails: controller.offsetDetails, label: controller.label.value, note: controller.note.value, @@ -632,6 +636,20 @@ class AddOrUpdateAlarmView extends GetView { : kprimaryDisabledTextColor, ), ), + AscendingVolumeTile( + controller: controller, + themeController: themeController, + ), + Container( + color: themeController.isLightMode.value + ? kLightSecondaryBackgroundColor + : ksecondaryBackgroundColor, + child: Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + ), QuoteTile( controller: controller, themeController: themeController, diff --git a/lib/app/modules/addOrUpdateAlarm/views/ascending_volume.dart b/lib/app/modules/addOrUpdateAlarm/views/ascending_volume.dart new file mode 100644 index 00000000..604f42b9 --- /dev/null +++ b/lib/app/modules/addOrUpdateAlarm/views/ascending_volume.dart @@ -0,0 +1,148 @@ +// ignore_for_file: lines_longer_than_80_chars + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart'; +import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart'; +import 'package:ultimate_alarm_clock/app/utils/constants.dart'; +import 'package:ultimate_alarm_clock/app/utils/utils.dart'; + +class AscendingVolumeTile extends StatelessWidget { + const AscendingVolumeTile({ + Key? key, + required this.controller, + required this.themeController, + }) : super(key: key); + + final AddOrUpdateAlarmController controller; + final ThemeController themeController; + + @override + Widget build(BuildContext context) { + int gradient; + return InkWell( + onTap: () { + Utils.hapticFeedback(); + gradient = controller.gradient.value; + Get.defaultDialog( + onWillPop: () async { + Get.back(); + // Resetting the value to its initial state + controller.gradient.value = gradient; + controller.selectedGradientDouble.value = gradient.toDouble(); + + return true; + }, + titlePadding: const EdgeInsets.symmetric(vertical: 20, horizontal: 5), + backgroundColor: themeController.isLightMode.value + ? kLightSecondaryBackgroundColor + : ksecondaryBackgroundColor, + title: 'Volume will reach maximum in'.tr, + titleStyle: Theme.of(context).textTheme.displaySmall, + content: Obx( + () => Column( + children: [ + Text( + '${controller.gradient.value} seconds'.tr, + style: Theme.of(context).textTheme.displaySmall, + ), + Slider( + value: controller.selectedGradientDouble.value, + onChanged: (double value) { + controller.selectedGradientDouble.value = value; + controller.gradient.value = value.toInt(); + }, + min: 0.0, + max: 60.0, + divisions: 60, + label: controller.gradient.value.toString(), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Text( + 'Adjust the volume range:'.tr, + style: Theme.of(context).textTheme.displaySmall, + textAlign: TextAlign.center, + ), + ), + // Replace the volMin Slider with RangeSlider + RangeSlider( + labels: RangeLabels( + controller.volMin.value + .toInt() + .toString(), // Label for volMin + controller.volMax.value + .toInt() + .toString(), // Label for volMax + ), + values: RangeValues( + controller.volMin.value, + controller.volMax.value, + ), + onChanged: (RangeValues values) { + controller.volMin.value = values.start; + controller.volMax.value = values.end; + }, + min: 0.0, + max: 10.0, + divisions: 10, + ), + + ElevatedButton( + onPressed: () { + Get.back(); + }, + style: ElevatedButton.styleFrom( + backgroundColor: kprimaryColor, + ), + child: Text( + 'Apply Gradient'.tr, + style: TextStyle( + color: themeController.isLightMode.value + ? kLightSecondaryTextColor + : ksecondaryTextColor, + ), + ), + ), + ], + ), + ), + ); + }, + child: ListTile( + tileColor: themeController.isLightMode.value + ? kLightSecondaryBackgroundColor + : ksecondaryBackgroundColor, + title: Text( + 'Ascending Volume'.tr, + style: TextStyle( + color: themeController.isLightMode.value + ? kLightPrimaryTextColor + : kprimaryTextColor, + ), + ), + trailing: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Obx( + () => Text( + '${controller.gradient.value.round().toInt()} seconds', + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: themeController.isLightMode.value + ? kLightPrimaryTextColor + : kprimaryTextColor, + ), + ), + ), + Icon( + Icons.chevron_right, + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + ], + ), + ), + ); + } +} diff --git a/lib/app/modules/addOrUpdateAlarm/views/choose_ringtone_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/choose_ringtone_tile.dart index ee260abd..abf29c57 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/choose_ringtone_tile.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/choose_ringtone_tile.dart @@ -8,18 +8,33 @@ import 'package:ultimate_alarm_clock/app/utils/utils.dart'; class ChooseRingtoneTile extends StatelessWidget { const ChooseRingtoneTile({ - super.key, + Key? key, required this.controller, required this.themeController, required this.height, required this.width, - }); + }) : super(key: key); final AddOrUpdateAlarmController controller; final ThemeController themeController; final double height; final double width; + void onTapPreview(String ringtonePath) async { + Utils.hapticFeedback(); + + // Stop the currently playing audio before starting the preview for the new audio + await AudioUtils.stopPreviewCustomSound(); + + if (controller.isPlaying.value) { + // If it was playing, reset the isPlaying state to false + controller.toggleIsPlaying(); + } else { + await AudioUtils.previewCustomSound(ringtonePath); + controller.toggleIsPlaying(); // Toggle the isPlaying state + } + } + @override Widget build(BuildContext context) { return Obx( @@ -27,14 +42,12 @@ class ChooseRingtoneTile extends StatelessWidget { tileColor: themeController.isLightMode.value ? kLightSecondaryBackgroundColor : ksecondaryBackgroundColor, - title: Flexible( - child: Text( - 'Choose Ringtone'.tr, - style: TextStyle( - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - : kprimaryTextColor, - ), + title: Text( + 'Choose Ringtone'.tr, + style: TextStyle( + color: themeController.isLightMode.value + ? kLightPrimaryTextColor + : kprimaryTextColor, ), ), onTap: () async { @@ -56,91 +69,94 @@ class ChooseRingtoneTile extends StatelessWidget { () => Column( children: [ Obx( - () => Padding( - padding: EdgeInsets.all(4), - child: SizedBox( - width: width * 0.8, - height: height * 0.2, - child: Card( - elevation: 0, - color: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - child: Scrollbar( - radius: Radius.circular(5), - thumbVisibility: true, - child: Padding( - padding: EdgeInsets.only(right: 4), - child: ListView.separated( - separatorBuilder: (context, index) { - return Divider( - color: themeController.isLightMode.value - ? ksecondaryBackgroundColor - : kLightSecondaryBackgroundColor, - height: 0, - ); + () => SizedBox( + width: width * 0.8, + height: height * 0.2, + child: Scrollbar( + child: ListView.builder( + itemCount: controller.customRingtoneNames.length, + shrinkWrap: true, + itemBuilder: (context, index) { + return Obx( + () => ListTile( + onTap: () { + controller.customRingtoneName.value = + controller.customRingtoneNames[index]; }, - itemCount: - controller.customRingtoneNames.length, - shrinkWrap: true, - itemBuilder: (context, index) { - return Obx( - () => ListTile( - onTap: () { - controller.customRingtoneName.value = + tileColor: controller.customRingtoneName == + controller.customRingtoneNames[index] + ? themeController.isLightMode.value + ? kLightPrimaryBackgroundColor + : kprimaryBackgroundColor + : themeController.isLightMode.value + ? kLightSecondaryBackgroundColor + : ksecondaryBackgroundColor, + title: Text( + controller.customRingtoneNames[index], + overflow: TextOverflow.ellipsis, + ), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (controller.customRingtoneName.value == + controller.customRingtoneNames[index]) + IconButton( + onPressed: () => onTapPreview(controller + .customRingtoneNames[index]), + icon: Icon( + (controller.isPlaying.value && + controller.customRingtoneName + .value == + controller + .customRingtoneNames[ + index]) + ? Icons.stop + : Icons.play_arrow, + color: (controller.isPlaying.value && + controller.customRingtoneName + .value == + controller + .customRingtoneNames[ + index]) + ? const Color.fromARGB( + 255, + 116, + 111, + 110) // Change this color to red + : kprimaryColor, + ), + ), + if (!((controller + .customRingtoneName.value == controller - .customRingtoneNames[index]; - }, - tileColor: controller - .customRingtoneName == - controller - .customRingtoneNames[index] - ? themeController.isLightMode.value - ? kLightPrimaryBackgroundColor - : kprimaryBackgroundColor - : themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - title: Text( - controller.customRingtoneNames[index], - overflow: TextOverflow.ellipsis, + .customRingtoneNames[index]) || + (controller + .customRingtoneNames[index] == + 'Default'.tr))) + IconButton( + onPressed: () async { + await controller.deleteCustomRingtone( + ringtoneName: controller + .customRingtoneNames[index], + ringtoneIndex: index, + ); + }, + icon: const Icon( + Icons.delete, + color: Colors.red, + ), ), - trailing: (controller.customRingtoneName - .value == - controller - .customRingtoneNames[ - index]) || - (controller.customRingtoneNames[ - index] == - 'Default'.tr) - ? null - : IconButton( - onPressed: () async { - await controller - .deleteCustomRingtone( - ringtoneName: controller - .customRingtoneNames[ - index], - ringtoneIndex: index, - ); - }, - icon: const Icon( - Icons.delete, - color: Colors.red, - ), - ), - ), - ); - }, + ], + ), ), - ), - ), + ); + }, ), ), ), ), const SizedBox( - height: 20, + height: 30, ), OutlinedButton( onPressed: () async { @@ -155,17 +171,20 @@ class ChooseRingtoneTile extends StatelessWidget { ), ), const SizedBox( - height: 20, + height: 30, ), ElevatedButton( - onPressed: () async { - Utils.hapticFeedback(); - await AudioUtils.updateRingtoneCounterOfUsage( - customRingtoneName: controller.customRingtoneName.value, - counterUpdate: CounterUpdate.increment, - ); - Get.back(); - }, + onPressed: () async { + Utils.hapticFeedback(); + await AudioUtils.updateRingtoneCounterOfUsage( + customRingtoneName: controller.customRingtoneName.value, + counterUpdate: CounterUpdate.increment, + ); + await AudioUtils.stopPreviewCustomSound(); // Stop custom ringtone preview + await AudioUtils.stopDefaultAlarm(); // Stop default alarm + controller.resetIsPlaying(); // Reset the isPlaying state + Get.back(); + }, style: ElevatedButton.styleFrom( backgroundColor: kprimaryColor, ), diff --git a/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart b/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart index 506d09c3..c556fe5e 100644 --- a/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart +++ b/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart @@ -1,9 +1,11 @@ import 'dart:async'; +import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_fgbg/flutter_fgbg.dart'; +import 'package:flutter_volume_controller/flutter_volume_controller.dart'; import 'package:get/get.dart'; import 'package:ultimate_alarm_clock/app/data/models/alarm_model.dart'; @@ -33,6 +35,8 @@ class AlarmControlController extends GetxController { final timeNow = Utils.convertTo12HourFormat(Utils.timeOfDayToString(TimeOfDay.now())).obs; Timer? _currentTimeTimer; + bool isAlarmActive = true; + late double initialVolume; getCurrentlyRingingAlarm() async { UserModel? _userModel = await SecureStorageProvider().retrieveUserModel(); @@ -109,9 +113,59 @@ class AlarmControlController extends GetxController { }); } + Future _fadeInAlarmVolume() async { + await FlutterVolumeController.setVolume( + currentlyRingingAlarm.value.volMin / 10.0, + stream: AudioStream.alarm, + ); + await Future.delayed(const Duration(milliseconds: 2000)); + + double vol = currentlyRingingAlarm.value.volMin / 10.0; + double diff = (currentlyRingingAlarm.value.volMax - + currentlyRingingAlarm.value.volMin) / + 10.0; + int len = currentlyRingingAlarm.value.gradient * 1000; + double steps = (diff / 0.01).abs(); + int stepLen = max(4, (steps > 0) ? len ~/ steps : len); + int lastTick = DateTime.now().millisecondsSinceEpoch; + + Timer.periodic(Duration(milliseconds: stepLen), (Timer t) { + if (!isAlarmActive) { + t.cancel(); + return; + } + + var now = DateTime.now().millisecondsSinceEpoch; + var tick = (now - lastTick) / len; + lastTick = now; + vol += diff * tick; + + vol = max(currentlyRingingAlarm.value.volMin / 10.0, vol); + vol = min(currentlyRingingAlarm.value.volMax / 10.0, vol); + vol = (vol * 100).round() / 100; + + FlutterVolumeController.setVolume( + vol, + stream: AudioStream.alarm, + ); + + if (vol >= currentlyRingingAlarm.value.volMax / 10.0) { + t.cancel(); + } + }); + } + @override void onInit() async { super.onInit(); + initialVolume = await FlutterVolumeController.getVolume( + stream: AudioStream.alarm, + ) as double; + + FlutterVolumeController.updateShowSystemUI(false); + + _fadeInAlarmVolume(); + if (currentlyRingingAlarm.value.deleteAfterGoesOff == true) { if (currentlyRingingAlarm.value.isSharedAlarmEnabled) { FirestoreDb.deleteOneTimeAlarm( @@ -221,13 +275,15 @@ class AlarmControlController extends GetxController { @override void onClose() async { super.onClose(); - Vibration.cancel(); vibrationTimer!.cancel(); - + isAlarmActive = false; String ringtoneName = currentlyRingingAlarm.value.ringtoneName; AudioUtils.stopAlarm(ringtoneName: ringtoneName); - + await FlutterVolumeController.setVolume( + initialVolume, + stream: AudioStream.alarm, + ); _subscription.cancel(); _currentTimeTimer?.cancel(); } diff --git a/lib/app/modules/alarmRing/views/alarm_ring_view.dart b/lib/app/modules/alarmRing/views/alarm_ring_view.dart index e6cf6009..d547cf6d 100644 --- a/lib/app/modules/alarmRing/views/alarm_ring_view.dart +++ b/lib/app/modules/alarmRing/views/alarm_ring_view.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:ultimate_alarm_clock/app/data/providers/isar_provider.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart'; import 'package:ultimate_alarm_clock/app/utils/constants.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; diff --git a/lib/app/modules/home/controllers/home_controller.dart b/lib/app/modules/home/controllers/home_controller.dart index 9b3c6f64..61c61de7 100644 --- a/lib/app/modules/home/controllers/home_controller.dart +++ b/lib/app/modules/home/controllers/home_controller.dart @@ -532,9 +532,15 @@ class HomeController extends GetxController { Get.closeAllSnackbars(); } - GetSnackBar snackbar = GetSnackBar( - message: 'Alarm deleted', + Get.snackbar( + 'Alarm deleted', + 'The alarm has been deleted.', duration: const Duration(seconds: 4), + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 15, + ), mainButton: TextButton( onPressed: () async { if (alarm.isSharedAlarmEnabled == true) { @@ -546,10 +552,5 @@ class HomeController extends GetxController { child: const Text('Undo'), ), ); - - Get.showSnackbar( - snackbar, - ); } } - diff --git a/lib/app/modules/home/views/home_view.dart b/lib/app/modules/home/views/home_view.dart index fd2b0da7..56226cc2 100644 --- a/lib/app/modules/home/views/home_view.dart +++ b/lib/app/modules/home/views/home_view.dart @@ -1275,28 +1275,26 @@ class HomeView extends GetView { ), ), if (alarm - .isPedometerEnabled) - Padding( - padding: - const EdgeInsets.symmetric( - horizontal: - 3.0, - ), - child: - Icon( - Icons.directions_walk, - size: - 24, - color: alarm.isEnabled == true - ? themeController.isLightMode.value - ? kLightPrimaryTextColor.withOpacity(0.5) - : kprimaryTextColor.withOpacity(0.5) - : themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, + .isPedometerEnabled) + Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 3.0, + ), + child: + Icon( + Icons.directions_walk, + size: 24, + color: alarm.isEnabled == true + ? themeController.isLightMode.value + ? kLightPrimaryTextColor.withOpacity(0.5) + : kprimaryTextColor.withOpacity(0.5) + : themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), ), - ), - ], + ], ), ], ), @@ -1380,6 +1378,31 @@ class HomeView extends GetView { await IsarDb.deleteAlarm(alarm.isarId); } + if (Get.isSnackbarOpen) { + Get.closeAllSnackbars(); + } + + Get.snackbar( + 'Alarm deleted', + 'The alarm has been deleted.', + duration: const Duration(seconds: 4), + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 15, + ), + mainButton: TextButton( + onPressed: () async { + if (alarm.isSharedAlarmEnabled == true) { + await FirestoreDb.addAlarm(controller.userModel.value, alarm); + } else { + await IsarDb.addAlarm(alarm); + } + }, + child: const Text('Undo'), + ), + ); + String ringtoneName = alarm.ringtoneName; await AudioUtils.updateRingtoneCounterOfUsage( diff --git a/lib/app/utils/audio_utils.dart b/lib/app/utils/audio_utils.dart index 5618db8a..146866e7 100644 --- a/lib/app/utils/audio_utils.dart +++ b/lib/app/utils/audio_utils.dart @@ -14,6 +14,8 @@ class AudioUtils { static MethodChannel alarmChannel = const MethodChannel('ulticlock'); static AudioSession? audioSession; + + static bool isPreviewing = false; static Future initializeAudioSession() async { audioSession = await AudioSession.instance; @@ -38,7 +40,9 @@ class AudioUtils { ); } - static Future playCustomSound(String customRingtonePath) async { + static Future playCustomSound( + String customRingtonePath, + ) async { try { await audioPlayer.setReleaseMode(audioplayer.ReleaseMode.loop); await audioPlayer.play(audioplayer.DeviceFileSource(customRingtonePath)); @@ -88,6 +92,65 @@ class AudioUtils { } } + + + static Future stopDefaultAlarm() async { + try { + if (audioSession != null) { + await alarmChannel.invokeMethod('stopDefaultAlarm'); + await audioSession!.setActive(false); + } + } catch (e) { + debugPrint(e.toString()); + } + } + + static Future previewCustomSound(String ringtoneName) async { + try { + if (audioSession == null) { + await initializeAudioSession(); + } + + await audioSession!.setActive(true); + + if (ringtoneName == 'Default') { + await alarmChannel.invokeMethod('playDefaultAlarm'); + } else { + int customRingtoneId = fastHash(ringtoneName); + RingtoneModel? customRingtone = await IsarDb.getCustomRingtone( + customRingtoneId: customRingtoneId, + ); + + if (customRingtone != null) { + String customRingtonePath = customRingtone.ringtonePath; + await alarmChannel.invokeMethod('stopDefaultAlarm'); + await audioSession!.setActive(false); + await audioSession!.setActive(true); + await playCustomSound(customRingtonePath); + isPreviewing = true; + } else { + await alarmChannel.invokeMethod('playDefaultAlarm'); + isPreviewing = true; + } + } + } catch (e) { + debugPrint(e.toString()); + } + } + + static Future stopPreviewCustomSound() async { + try { + if (audioSession != null && isPreviewing) { + await audioPlayer.stop(); + await alarmChannel.invokeMethod('stopDefaultAlarm'); + await audioSession!.setActive(false); + isPreviewing = false; + } + } catch (e) { + debugPrint(e.toString()); + } + } + static void stopAlarm({ required String ringtoneName, }) async { diff --git a/lib/app/utils/language.dart b/lib/app/utils/language.dart index f124dbd4..ebd89ef8 100644 --- a/lib/app/utils/language.dart +++ b/lib/app/utils/language.dart @@ -8,210 +8,234 @@ import 'package:ultimate_alarm_clock/app/utils/languages/spanish_translations.da //this is the dictionary for every text shown in app in 5 languages // english, german, russian, french, spanish -class AppTranslations extends Translations{ +class AppTranslations extends Translations { @override Map> get keys => { - 'en_US' : { - 'Alarm' : 'Alarm', - 'Timer' : 'Timer', - 'Enable 24 Hour Format' : 'Enable 24 Hour Format', - 'Enable Haptic Feedback' : 'Enable Haptic Feedback', - 'Enable Sorted Alarm List' : 'Enable Sorted Alarm List', - //google_sign_in.dart - 'Your account is now linked!' : 'Your account is now linked!', - 'Are you sure?' : 'Are you sure?', - 'unlinkAccount' : 'Do you want to unlink your Google account?', - 'Unlink' : 'Unlink', - 'Sign-In with Google' : 'Sign-In with Google', - 'Unlink @usermail' : 'Unlink @usermail', - 'Why do I have to sign in with Google?' : 'Why do I have to sign in with Google?', - 'Sign-inDescription' : 'Signing in is optional. It is only required for the functionalities that use cloud services to work such as:', - 'CollabDescription' : 'Collaborate with friends, family members, or colleagues to ensure that they wake up on time using shared alarms.', - 'Syncing Across Devices' : 'Syncing Across Devices', - 'AccessMultiple' : 'Access your alarms across multiple devices where the alarms are updated in real-time.', - 'Your privacy' : 'Your privacy', - 'NoAccessInfo' : 'We do not access, use or sell any information, which you can verify by inspecting the source code.', - 'LimitedAccess' : 'All access is limited exclusively to provide the functionalities described above.', - 'Enable Light Mode' : 'Enable Light Mode', + 'en_US': { + 'Alarm': 'Alarm', + 'Timer': 'Timer', + 'Enable 24 Hour Format': 'Enable 24 Hour Format', + 'Enable Haptic Feedback': 'Enable Haptic Feedback', + 'Enable Sorted Alarm List': 'Enable Sorted Alarm List', + //google_sign_in.dart + 'Your account is now linked!': 'Your account is now linked!', + 'Are you sure?': 'Are you sure?', + 'unlinkAccount': 'Do you want to unlink your Google account?', + 'Unlink': 'Unlink', + 'Sign-In with Google': 'Sign-In with Google', + 'Unlink @usermail': 'Unlink @usermail', + 'Why do I have to sign in with Google?': + 'Why do I have to sign in with Google?', + 'Sign-inDescription': + 'Signing in is optional. It is only required for the functionalities that use cloud services to work such as:', + 'CollabDescription': + 'Collaborate with friends, family members, or colleagues to ensure that they wake up on time using shared alarms.', + 'Syncing Across Devices': 'Syncing Across Devices', + 'AccessMultiple': + 'Access your alarms across multiple devices where the alarms are updated in real-time.', + 'Your privacy': 'Your privacy', + 'NoAccessInfo': + 'We do not access, use or sell any information, which you can verify by inspecting the source code.', + 'LimitedAccess': + 'All access is limited exclusively to provide the functionalities described above.', + 'Enable Light Mode': 'Enable Light Mode', - //home_view.dart texts - 'No upcoming alarms!' : 'No upcoming alarms!', - 'Rings in @timeToAlarm' : 'Rings in @timeToAlarm', - 'Show Motivational Quote' : 'Show Motivational Quote', - 'Location Based' : 'Location Based', - 'Next alarm' : 'Next alarm', - 'About' : 'About', - 'Settings' : 'Settings', - 'v0.5.0' : 'v0.5.0', - 'Ultimate Alarm Clock' : 'Ultimate Alarm Clock', - 'Create alarm' : 'Create alarm', - 'Join alarm' : 'Join alarm', - 'Okay' : 'Okay', - 'You cannot join your own alarm!' : 'You cannot join your own alarm!', - 'An alarm with this ID doesn\'t exist!' : 'An alarm with this ID doesn\'t exist!', - 'Error!' : 'Error!', - 'Join' : 'Join', - 'Enter Alarm ID' : 'Enter Alarm ID', - 'Join an alarm' : 'Join an alarm', - 'Select alarms to delete' : 'Select alarms to delete', - 'No alarm selected' : 'No alarm selected', - '@noofAlarm alarms selected' : '@noofAlarm alarms selected', - 'Add an alarm to get started!' : 'Add an alarm to get started!', - 'Never' : 'Never', - 'One Time' : 'One Time', - 'Preview Alarm' : 'Preview Alarm', - 'Delete Alarm' : 'Delete Alarm', - //about_view.dart texts - 'This project was originally developed as part of Google Summer of code under the CCExtractor organization. It\'s free, the source code is available, and we encourage programmers to contribute' : 'This project was originally developed as part of Google Summer of code under the CCExtractor organization. It\'s free, the source code is available, and we encourage programmers to contribute', - 'Could not launch' : 'Could not launch', - //add_or_update_alarm_view.dart - 'Discard Changes?' : 'Discard Changes?', - 'unsavedChanges' : 'You have unsaved changes. Are you sure you want to leave this ' - 'page?', - 'Cancel' : 'Cancel', - 'Leave' : 'Leave', - 'Save' : 'Save', - 'Update' : 'Update', - 'Rings in @timeToAlarm' : 'Rings in @timeToAlarm', - 'Uh-oh!' : 'Uh-oh!', - 'alarmEditing' : 'This alarm is currently being edited!', - 'Go back' : 'Go back', - 'Automatic Cancellation' : 'Automatic Cancellation', - 'Challenges' : 'Challenges', - 'Shared Alarm' : 'Shared Alarm', - //alarm_id_tile.dart - 'Success!' : 'Success!', - 'Alarm ID has been copied!' : 'Alarm ID has been copied!', - 'Alarm ID' : 'Alarm ID', - 'Disabled!' : 'Disabled!', - 'toCopyAlarm' : 'To copy Alarm ID you have enable shared alarm!', - 'Choose duration' : 'Choose duration', - 'minutes' : 'minutes', - 'minute' : 'minute', - 'Before' : 'Before', - 'After' : 'After', - 'Ring before / after ' : 'Ring before / after ', - 'Enabled' : 'Enabled', - 'Off' : 'Off', - //choose_ringtone_tile.dart - 'Choose Ringtone' : 'Choose Ringtone', - 'Default' : 'Default', - 'Upload Ringtone' : 'Upload Ringtone', - 'Done' : 'Done', - //label_tile.dart - 'Label' : 'Label', - 'Enter a name' : 'Enter a name', - 'Note' : 'Note', - 'noWhitespace' : 'Please don\'t enter whitespace as first character!', - //maths_challenge_tile.dart - 'Maths' : 'Maths', - 'Math problems' : 'Math problems', - 'mathDescription' : 'You will have to solve simple math problems of the chosen difficulty level to dismiss the alarm.', - 'Solve Maths questions' : 'Solve Maths questions', - 'questions' : 'questions', - 'question' : 'question', - //note.dart - 'Enter a note' : 'Enter a note', - // qr_bar_code_tile.dart - 'QR/Bar Code' : 'QR/Bar Code', - 'qrDescription' : 'Scan the QR/Bar code on any object, like a book, and relocate it to a different room. To deactivate the alarm, simply rescan the same QR/Bar code.', - //repeat_once_tile.dart - 'Repeat only once' : 'Repeat only once', - //repeat_tile.dart - 'Repeat' : 'Repeat', - 'Days of the week' : 'Days of the week', - 'Monday' : 'Monday', 'Tuesday' : 'Tuesday', 'Wednesday' : 'Wednesday', - 'Thursday' : 'Thursday', 'Friday' : 'Friday', 'Saturday' : 'Saturday', - 'Sunday' : 'Sunday', - //screen_activity_tile.dart - 'Timeout Duration' : 'Timeout Duration', - 'Screen Activity' : 'Screen Activity', - 'Screen activity based cancellation' : 'Screen activity based cancellation', - 'screenDescription' : 'This feature will automatically cancel the alarm if you\'ve been using your device for a set number of minutes.', - //shake_to_dismiss_tile.dart - 'Shake to dismiss' : 'Shake to dismiss', - 'shakeDescription' : 'You will have to shake your phone a set number of times to dismiss the alarm - no more lazy snoozing :)', - 'Number of shakes' : 'Number of shakes', - 'times' : 'times', - 'time' : 'time', - //'shared_alarm_tile.dart - 'Shared Alarm' : 'Shared Alarm', - 'Shared alarms' : 'Shared alarms', - 'sharedDescription' : 'Share alarms with others using the Alarm ID. Each shared user can choose to have their alarm ring before or after the set time.', - 'Understood' : 'Understood', - 'To use this feature, you have to link your Google account!' : 'To use this feature, you have to link your Google account!', - 'Go to settings' : 'Go to settings', - 'Enable Shared Alarm' : 'Enable Shared Alarm', - //shared_users_tile.dart - 'Alarm Owner' : 'Alarm Owner', - 'Shared Users' : 'Shared Users', - 'No shared users!' : 'No shared users!', - 'Remove' : 'Remove', - 'Select duration' : 'Select duration', - //snooze_duration_tile.dart - 'Snooze Duration' : 'Snooze Duration', - //weather_tile.dart - 'Select weather types' : 'Select weather types', - 'Sunny' : 'Sunny', - 'Cloudy' : 'Cloudy', - 'Rainy' : 'Rainy', - 'Windy' : 'Windy', - 'Stormy' : 'Stormy', - 'Weather Condition' : 'Weather Condition', - 'Weather based cancellation' : 'Weather based cancellation', - 'weatherDescription' : 'This feature will automatically cancel the alarm if the current weather matches your chosen weather conditions, allowing you to sleep better!', - 'To use this feature, you have to add an OpenWeatherMap API key!' : 'To use this feature, you have to add an OpenWeatherMap API key!', - //alarm_challenge_view.dart - 'Shake Challenge' : 'Shake Challenge', - 'Maths Challenge' : 'Maths Challenge', - 'QR/Bar Code Challenge' : 'QR/Bar Code Challenge', - //maths_challenge_view.dart - 'Question @noMathQ' : 'Question @noMathQ', - //qr_challenge_view.dart - 'Scan your QR/Bar Code!' : 'Scan your QR/Bar Code!', - 'Wrong Code Scanned!' : 'Wrong Code Scanned!', - 'Retake' : 'Retake', - //shake_challenge_view.dart - 'Shake your phone!' : 'Shake your phone!', - //alarm_ring_view.dart - "You can't go back while the alarm is ringing" : "You can't go back while the alarm is ringing", - 'Start Challenge' : 'Start Challenge', - 'Dismiss' : 'Dismiss', - 'Exit Preview' : 'Exit Preview', - 'Snooze' : 'Snooze', - //util.dart - 'Everyday' : 'Everyday', - 'Weekdays' : 'Weekdays', - 'Weekends' : 'Weekends', - 'Mon' : 'Mon' , 'Tue' : 'Tue', 'Wed' : 'Wed', 'Thur' : 'Thur', - 'Fri' : 'Fri', 'Sat' : 'Sat', 'Sun' : 'Sun', - //OpenWeatherMap - 'onenweathermap_title1.1': 'Steps to get ', - 'onenweathermap_title1.2': 'OpenWeatherMap API', - 'step1.1':'Go to ', - 'step1.2':'openweathermap.org', - 'step1.3':', click on the ', - 'step1.4':'SignIn', - 'step1.5':' button(top right corner) then it ask for login credentials.', - 'step2.1':'If you already have an account then enter your credentials. Otherwise, click on ', - 'step2.2':'Create an Account', - 'step2.3':' option. It asks you to Enter your username, email, and password. Make sure entered details are correct.', - 'step3':'Once your account is created, you are automatically directed to the OpenWeather page. It asks you about your company and the purpose of using the platform, fill this details accordingly.', - 'step4.1':'Click on your ', - 'step4.2':'Username', - 'step4.3':'(top right corner). A dropdown menu appears. Click on ', - 'step4.4':'My API', - 'step4.5':' option.', - 'step5':'Now you have the API key. Select the key and copy it.', -}, - - 'de_DE' : GermanTranslations().keys['de_DE']!, - - 'ru_RU' : RussianTranslations().keys['ru_RU']!, - - 'fr_FR' : FrenchTranslations().keys['fr_FR']!, - - 'es_ES' : SpanishTranslations().keys['es_ES']!, - - }; + //home_view.dart texts + 'No upcoming alarms!': 'No upcoming alarms!', + 'Rings in @timeToAlarm': 'Rings in @timeToAlarm', + 'Show Motivational Quote': 'Show Motivational Quote', + 'Location Based': 'Location Based', + 'Next alarm': 'Next alarm', + 'About': 'About', + 'Settings': 'Settings', + 'v0.5.0': 'v0.5.0', + 'Ultimate Alarm Clock': 'Ultimate Alarm Clock', + 'Create alarm': 'Create alarm', + 'Join alarm': 'Join alarm', + 'Okay': 'Okay', + 'You cannot join your own alarm!': 'You cannot join your own alarm!', + 'An alarm with this ID doesn\'t exist!': + 'An alarm with this ID doesn\'t exist!', + 'Error!': 'Error!', + 'Join': 'Join', + 'Enter Alarm ID': 'Enter Alarm ID', + 'Join an alarm': 'Join an alarm', + 'Select alarms to delete': 'Select alarms to delete', + 'No alarm selected': 'No alarm selected', + '@noofAlarm alarms selected': '@noofAlarm alarms selected', + 'Add an alarm to get started!': 'Add an alarm to get started!', + 'Never': 'Never', + 'One Time': 'One Time', + 'Preview Alarm': 'Preview Alarm', + 'Delete Alarm': 'Delete Alarm', + //about_view.dart texts + 'This project was originally developed as part of Google Summer of code under the CCExtractor organization. It\'s free, the source code is available, and we encourage programmers to contribute': + 'This project was originally developed as part of Google Summer of code under the CCExtractor organization. It\'s free, the source code is available, and we encourage programmers to contribute', + 'Could not launch': 'Could not launch', + //add_or_update_alarm_view.dart + 'Discard Changes?': 'Discard Changes?', + 'unsavedChanges': + 'You have unsaved changes. Are you sure you want to leave this ' + 'page?', + 'Cancel': 'Cancel', + 'Leave': 'Leave', + 'Save': 'Save', + 'Update': 'Update', + 'Rings in @timeToAlarm': 'Rings in @timeToAlarm', + 'Uh-oh!': 'Uh-oh!', + 'alarmEditing': 'This alarm is currently being edited!', + 'Go back': 'Go back', + 'Automatic Cancellation': 'Automatic Cancellation', + 'Challenges': 'Challenges', + 'Shared Alarm': 'Shared Alarm', + //alarm_id_tile.dart + 'Success!': 'Success!', + 'Alarm ID has been copied!': 'Alarm ID has been copied!', + 'Alarm ID': 'Alarm ID', + 'Disabled!': 'Disabled!', + 'toCopyAlarm': 'To copy Alarm ID you have enable shared alarm!', + 'Choose duration': 'Choose duration', + 'minutes': 'minutes', + 'minute': 'minute', + 'Before': 'Before', + 'After': 'After', + 'Ring before / after ': 'Ring before / after ', + 'Enabled': 'Enabled', + 'Off': 'Off', + //choose_ringtone_tile.dart + 'Choose Ringtone': 'Choose Ringtone', + 'Default': 'Default', + 'Upload Ringtone': 'Upload Ringtone', + 'Done': 'Done', + //label_tile.dart + 'Label': 'Label', + 'Enter a name': 'Enter a name', + 'Note': 'Note', + 'noWhitespace': 'Please don\'t enter whitespace as first character!', + //maths_challenge_tile.dart + 'Maths': 'Maths', + 'Math problems': 'Math problems', + 'mathDescription': + 'You will have to solve simple math problems of the chosen difficulty level to dismiss the alarm.', + 'Solve Maths questions': 'Solve Maths questions', + 'questions': 'questions', + 'question': 'question', + //note.dart + 'Enter a note': 'Enter a note', + // qr_bar_code_tile.dart + 'QR/Bar Code': 'QR/Bar Code', + 'qrDescription': + 'Scan the QR/Bar code on any object, like a book, and relocate it to a different room. To deactivate the alarm, simply rescan the same QR/Bar code.', + //repeat_once_tile.dart + 'Repeat only once': 'Repeat only once', + //repeat_tile.dart + 'Repeat': 'Repeat', + 'Days of the week': 'Days of the week', + 'Monday': 'Monday', 'Tuesday': 'Tuesday', 'Wednesday': 'Wednesday', + 'Thursday': 'Thursday', 'Friday': 'Friday', 'Saturday': 'Saturday', + 'Sunday': 'Sunday', + //screen_activity_tile.dart + 'Timeout Duration': 'Timeout Duration', + 'Screen Activity': 'Screen Activity', + 'Screen activity based cancellation': + 'Screen activity based cancellation', + 'screenDescription': + 'This feature will automatically cancel the alarm if you\'ve been using your device for a set number of minutes.', + //shake_to_dismiss_tile.dart + 'Shake to dismiss': 'Shake to dismiss', + 'shakeDescription': + 'You will have to shake your phone a set number of times to dismiss the alarm - no more lazy snoozing :)', + 'Number of shakes': 'Number of shakes', + 'times': 'times', + 'time': 'time', + //'shared_alarm_tile.dart + 'Shared Alarm': 'Shared Alarm', + 'Shared alarms': 'Shared alarms', + 'sharedDescription': + 'Share alarms with others using the Alarm ID. Each shared user can choose to have their alarm ring before or after the set time.', + 'Understood': 'Understood', + 'To use this feature, you have to link your Google account!': + 'To use this feature, you have to link your Google account!', + 'Go to settings': 'Go to settings', + 'Enable Shared Alarm': 'Enable Shared Alarm', + //shared_users_tile.dart + 'Alarm Owner': 'Alarm Owner', + 'Shared Users': 'Shared Users', + 'No shared users!': 'No shared users!', + 'Remove': 'Remove', + 'Select duration': 'Select duration', + //snooze_duration_tile.dart + 'Snooze Duration': 'Snooze Duration', + //weather_tile.dart + 'Select weather types': 'Select weather types', + 'Sunny': 'Sunny', + 'Cloudy': 'Cloudy', + 'Rainy': 'Rainy', + 'Windy': 'Windy', + 'Stormy': 'Stormy', + 'Weather Condition': 'Weather Condition', + 'Weather based cancellation': 'Weather based cancellation', + 'weatherDescription': + 'This feature will automatically cancel the alarm if the current weather matches your chosen weather conditions, allowing you to sleep better!', + 'To use this feature, you have to add an OpenWeatherMap API key!': + 'To use this feature, you have to add an OpenWeatherMap API key!', + //alarm_challenge_view.dart + 'Shake Challenge': 'Shake Challenge', + 'Maths Challenge': 'Maths Challenge', + 'QR/Bar Code Challenge': 'QR/Bar Code Challenge', + //maths_challenge_view.dart + 'Question @noMathQ': 'Question @noMathQ', + //qr_challenge_view.dart + 'Scan your QR/Bar Code!': 'Scan your QR/Bar Code!', + 'Wrong Code Scanned!': 'Wrong Code Scanned!', + 'Retake': 'Retake', + //shake_challenge_view.dart + 'Shake your phone!': 'Shake your phone!', + //alarm_ring_view.dart + "You can't go back while the alarm is ringing": + "You can't go back while the alarm is ringing", + 'Start Challenge': 'Start Challenge', + 'Dismiss': 'Dismiss', + 'Exit Preview': 'Exit Preview', + 'Snooze': 'Snooze', + //util.dart + 'Everyday': 'Everyday', + 'Weekdays': 'Weekdays', + 'Weekends': 'Weekends', + 'Mon': 'Mon', 'Tue': 'Tue', 'Wed': 'Wed', 'Thur': 'Thur', + 'Fri': 'Fri', 'Sat': 'Sat', 'Sun': 'Sun', + //OpenWeatherMap + 'onenweathermap_title1.1': 'Steps to get ', + 'onenweathermap_title1.2': 'OpenWeatherMap API', + 'step1.1': 'Go to ', + 'step1.2': 'openweathermap.org', + 'step1.3': ', click on the ', + 'step1.4': 'SignIn', + 'step1.5': + ' button(top right corner) then it ask for login credentials.', + 'step2.1': + 'If you already have an account then enter your credentials. Otherwise, click on ', + 'step2.2': 'Create an Account', + 'step2.3': + ' option. It asks you to Enter your username, email, and password. Make sure entered details are correct.', + 'step3': + 'Once your account is created, you are automatically directed to the OpenWeather page. It asks you about your company and the purpose of using the platform, fill this details accordingly.', + 'step4.1': 'Click on your ', + 'step4.2': 'Username', + 'step4.3': '(top right corner). A dropdown menu appears. Click on ', + 'step4.4': 'My API', + 'step4.5': ' option.', + 'step5': 'Now you have the API key. Select the key and copy it.', + //ascending_volume.dart + 'Volume will reach maximum in': 'Volume will reach maximum in', + 'seconds': 'seconds', + 'Adjust the volume range:': 'Adjust the volume range:', + 'Apply Gradient': 'Apply Gradient', + 'Ascending Volume': 'Ascending Volume', + }, + 'de_DE': GermanTranslations().keys['de_DE']!, + 'ru_RU': RussianTranslations().keys['ru_RU']!, + 'fr_FR': FrenchTranslations().keys['fr_FR']!, + 'es_ES': SpanishTranslations().keys['es_ES']!, + }; } diff --git a/lib/app/utils/languages/french_translations.dart b/lib/app/utils/languages/french_translations.dart index ff894214..9936cc14 100644 --- a/lib/app/utils/languages/french_translations.dart +++ b/lib/app/utils/languages/french_translations.dart @@ -1,201 +1,236 @@ +// ignore_for_file: lines_longer_than_80_chars + import 'package:get/get.dart'; class FrenchTranslations extends Translations { @override - Map> get keys => - { - 'fr_FR' : { - 'Alarm' : 'Réveil', - 'Timer' : 'Minuteur', - - 'Enable 24 Hour Format' : 'Activer le format 24 heures', - 'Enable Haptic Feedback' : 'Activer les commentaires haptiques', - 'Enable Sorted Alarm List' : 'Activer la liste de réveils triée', - // google_sign_in.dart - 'Your account is now linked!' : 'Votre compte est maintenant lié !', - 'Are you sure?' : 'Êtes-vous sûr ?', - 'unlinkAccount' : 'Voulez-vous vraiment délier votre compte Google ?', - 'Unlink' : 'Délier', - 'Sign-In with Google' : 'Connexion avec Google', - 'Unlink @usermail' : 'Délier @usermail', - 'Why do I have to sign in with Google?' : 'Pourquoi dois-je me connecter avec Google ?', - 'Sign-inDescription' : 'La connexion est facultative. Elle est uniquement nécessaire pour les fonctionnalités qui utilisent des services cloud, tels que :', - 'CollabDescription' : 'Collaborez avec des amis, des membres de la famille ou des collègues pour vous assurer qu\'ils se réveillent à temps à l\'aide d\'alarmes partagées.', - 'Syncing Across Devices' : 'Synchronisation entre les appareils', - 'AccessMultiple' : 'Accédez à vos alarmes sur plusieurs appareils où les alarmes sont mises à jour en temps réel.', - 'Your privacy' : 'Votre vie privée', - 'NoAccessInfo' : 'Nous n\'accédons pas, n\'utilisons pas et ne vendons aucune information, ce que vous pouvez vérifier en inspectant le code source.', - 'LimitedAccess' : 'Tout accès est limité exclusivement à la fourniture des fonctionnalités décrites ci-dessus.', - 'Enable Light Mode' : 'Activer le mode clair', + Map> get keys => { + 'fr_FR': { + 'Alarm': 'Réveil', + 'Timer': 'Minuteur', + 'Enable 24 Hour Format': 'Activer le format 24 heures', + 'Enable Haptic Feedback': 'Activer les commentaires haptiques', + 'Enable Sorted Alarm List': 'Activer la liste de réveils triée', + // google_sign_in.dart + 'Your account is now linked!': 'Votre compte est maintenant lié !', + 'Are you sure?': 'Êtes-vous sûr ?', + 'unlinkAccount': 'Voulez-vous vraiment délier votre compte Google ?', + 'Unlink': 'Délier', + 'Sign-In with Google': 'Connexion avec Google', + 'Unlink @usermail': 'Délier @usermail', + 'Why do I have to sign in with Google?': + 'Pourquoi dois-je me connecter avec Google ?', + 'Sign-inDescription': + 'La connexion est facultative. Elle est uniquement nécessaire pour les fonctionnalités qui utilisent des services cloud, tels que :', + 'CollabDescription': + 'Collaborez avec des amis, des membres de la famille ou des collègues pour vous assurer qu\'ils se réveillent à temps à l\'aide d\'alarmes partagées.', + 'Syncing Across Devices': 'Synchronisation entre les appareils', + 'AccessMultiple': + 'Accédez à vos alarmes sur plusieurs appareils où les alarmes sont mises à jour en temps réel.', + 'Your privacy': 'Votre vie privée', + 'NoAccessInfo': + 'Nous n\'accédons pas, n\'utilisons pas et ne vendons aucune information, ce que vous pouvez vérifier en inspectant le code source.', + 'LimitedAccess': + 'Tout accès est limité exclusivement à la fourniture des fonctionnalités décrites ci-dessus.', + 'Enable Light Mode': 'Activer le mode clair', - 'No upcoming alarms!' : 'Pas d\'alarmes à venir !', - 'Next alarm' : 'Prochain réveil', - 'Show Motivational Quote' : 'Afficher une citation motivante', - //home_view.dart - 'About' : 'À propos', - 'Settings' : 'Paramètres', - 'v0.5.0' : 'v0.5.0', - 'Ultimate Alarm Clock' : 'Réveil Ultime', - 'Create alarm' : 'Créer un réveil', - 'Join alarm' : 'Rejoindre un réveil', - 'Okay' : 'D\'accord', - 'You cannot join your own alarm!' : 'Vous ne pouvez pas rejoindre votre propre réveil !', - 'An alarm with this ID doesn\'t exist!' : 'Un réveil avec cet identifiant n\'existe pas !', - 'Error!' : 'Erreur !', - 'Join' : 'Rejoindre', - 'Enter Alarm ID' : 'Entrer l\'identifiant du réveil', - 'Join an alarm' : 'Rejoindre un réveil', - 'Select alarms to delete' : 'Sélectionnez les réveils à supprimer', - 'No alarm selected' : 'Aucun réveil sélectionné', - '1 alarm selected' : '1 réveil sélectionné', - ' alarms selected' : ' réveils sélectionnés', - 'Add an alarm to get started!' : 'Ajoutez un réveil pour commencer !', - 'Never' : 'Jamais', - 'One Time' : 'Une fois', - 'Preview Alarm' : 'Aperçu du réveil', - 'Delete Alarm' : 'Supprimer le réveil', - //about_view.dart texts - 'This project was originally developed as part of Google Summer of code under the CCExtractor organization. It\'s free, the source code is available, and we encourage programmers to contribute' : 'Ce projet a été initialement développé dans le cadre du Google Summer of Code sous l\'organisation CCExtractor. Il est gratuit, le code source est disponible et nous encourageons les programmeurs à contribuer.', - 'Could not launch' : 'Impossible de lancer', + 'No upcoming alarms!': 'Pas d\'alarmes à venir !', + 'Next alarm': 'Prochain réveil', + 'Show Motivational Quote': 'Afficher une citation motivante', + //home_view.dart + 'About': 'À propos', + 'Settings': 'Paramètres', + 'v0.5.0': 'v0.5.0', + 'Ultimate Alarm Clock': 'Réveil Ultime', + 'Create alarm': 'Créer un réveil', + 'Join alarm': 'Rejoindre un réveil', + 'Okay': 'D\'accord', + 'You cannot join your own alarm!': + 'Vous ne pouvez pas rejoindre votre propre réveil !', + 'An alarm with this ID doesn\'t exist!': + 'Un réveil avec cet identifiant n\'existe pas !', + 'Error!': 'Erreur !', + 'Join': 'Rejoindre', + 'Enter Alarm ID': 'Entrer l\'identifiant du réveil', + 'Join an alarm': 'Rejoindre un réveil', + 'Select alarms to delete': 'Sélectionnez les réveils à supprimer', + 'No alarm selected': 'Aucun réveil sélectionné', + '1 alarm selected': '1 réveil sélectionné', + ' alarms selected': ' réveils sélectionnés', + 'Add an alarm to get started!': 'Ajoutez un réveil pour commencer !', + 'Never': 'Jamais', + 'One Time': 'Une fois', + 'Preview Alarm': 'Aperçu du réveil', + 'Delete Alarm': 'Supprimer le réveil', + //about_view.dart texts + 'This project was originally developed as part of Google Summer of code under the CCExtractor organization. It\'s free, the source code is available, and we encourage programmers to contribute': + 'Ce projet a été initialement développé dans le cadre du Google Summer of Code sous l\'organisation CCExtractor. Il est gratuit, le code source est disponible et nous encourageons les programmeurs à contribuer.', + 'Could not launch': 'Impossible de lancer', //add_or_update_alarm_view.dart - 'Discard Changes?' : 'Ignorer les modifications ?', - 'unsavedChanges' : 'Vous avez des modifications non enregistrées. Êtes-vous sûr de vouloir quitter cette page ?', - 'Cancel' : 'Annuler', - 'Leave' : 'Quitter', - 'Save' : 'Enregistrer', - 'Update' : 'Mettre à jour', - 'Rings in @timeToAlarm' : 'Sonner dans @timeToAlarm', - 'Uh-oh!' : 'Oups !', - 'alarmEditing' : "Cet alarme est actuellement en cours d'édition !", - 'Go back' : 'Retour', - 'Automatic Cancellation' : 'Annulation automatique', - 'Challenges' : 'Défis', - 'Shared Alarm' : 'Alarme partagée', + 'Discard Changes?': 'Ignorer les modifications ?', + 'unsavedChanges': + 'Vous avez des modifications non enregistrées. Êtes-vous sûr de vouloir quitter cette page ?', + 'Cancel': 'Annuler', + 'Leave': 'Quitter', + 'Save': 'Enregistrer', + 'Update': 'Mettre à jour', + 'Rings in @timeToAlarm': 'Sonner dans @timeToAlarm', + 'Uh-oh!': 'Oups !', + 'alarmEditing': "Cet alarme est actuellement en cours d'édition !", + 'Go back': 'Retour', + 'Automatic Cancellation': 'Annulation automatique', + 'Challenges': 'Défis', + 'Shared Alarm': 'Alarme partagée', //alarm_id_tile.dart - 'Success!' : 'Succès !', - 'Alarm ID has been copied!' : "L'ID de l'alarme a été copié !", - 'Alarm ID' : "ID de l'alarme", - 'Disabled!' : 'Désactivé !', - 'toCopyAlarm' : "Pour copier l'ID de l'alarme, vous devez activer l'alarme partagée !", - 'Choose duration' : 'Choisir la durée', - 'minutes' : 'minutes', - 'minute' : 'minute', - 'Before' : 'Avant', - 'After' : 'Après', - 'Ring before / after ' : 'Sonner avant / après ', - 'Enabled' : 'Activé', - 'Off' : 'Désactivé', + 'Success!': 'Succès !', + 'Alarm ID has been copied!': "L'ID de l'alarme a été copié !", + 'Alarm ID': "ID de l'alarme", + 'Disabled!': 'Désactivé !', + 'toCopyAlarm': + "Pour copier l'ID de l'alarme, vous devez activer l'alarme partagée !", + 'Choose duration': 'Choisir la durée', + 'minutes': 'minutes', + 'minute': 'minute', + 'Before': 'Avant', + 'After': 'Après', + 'Ring before / after ': 'Sonner avant / après ', + 'Enabled': 'Activé', + 'Off': 'Désactivé', //choose_ringtone_tile.dart - 'Choose Ringtone' : 'Choisir une sonnerie', - 'Default' : 'Par défaut', - 'Upload Ringtone' : 'Télécharger une sonnerie', - 'Done' : 'Terminé', + 'Choose Ringtone': 'Choisir une sonnerie', + 'Default': 'Par défaut', + 'Upload Ringtone': 'Télécharger une sonnerie', + 'Done': 'Terminé', //label_tile.dart - 'Label' : 'Étiquette', - 'Enter a name' : 'Entrez un nom', - 'Note' : 'Note', - 'noWhitespace' : 'Veuillez ne pas entrer d\'espace en tant que premier caractère !', + 'Label': 'Étiquette', + 'Enter a name': 'Entrez un nom', + 'Note': 'Note', + 'noWhitespace': + 'Veuillez ne pas entrer d\'espace en tant que premier caractère !', //maths_challenge_tile.dart - 'Maths' : 'Mathématiques', - 'Math problems' : 'Problèmes mathématiques', - 'mathDescription' : 'Vous devrez résoudre des problèmes mathématiques simples du niveau de difficulté choisi pour désactiver l\'alarme.', - 'Solve Maths questions' : 'Résoudre des questions de mathématiques', - 'questions' : 'questions', - 'question' : 'question', + 'Maths': 'Mathématiques', + 'Math problems': 'Problèmes mathématiques', + 'mathDescription': + 'Vous devrez résoudre des problèmes mathématiques simples du niveau de difficulté choisi pour désactiver l\'alarme.', + 'Solve Maths questions': 'Résoudre des questions de mathématiques', + 'questions': 'questions', + 'question': 'question', //note.dart - 'Enter a note' : 'Entrer une note', + 'Enter a note': 'Entrer une note', // qr_bar_code_tile.dart - 'QR/Bar Code' : 'QR/Code-barres', - 'qrDescription' : 'Scannez le QR/Code-barres sur n\'importe quel objet, comme un livre, et déplacez-le dans une pièce différente. Pour désactiver l\'alarme, scannez à nouveau le même QR/Code-barres.', + 'QR/Bar Code': 'QR/Code-barres', + 'qrDescription': + 'Scannez le QR/Code-barres sur n\'importe quel objet, comme un livre, et déplacez-le dans une pièce différente. Pour désactiver l\'alarme, scannez à nouveau le même QR/Code-barres.', //repeat_once_tile.dart - 'Repeat only once' : 'Répéter une seule fois', + 'Repeat only once': 'Répéter une seule fois', //repeat_tile.dart - 'Repeat' : 'Répéter', - 'Days of the week' : 'Jours de la semaine', - 'Monday' : 'Lundi', 'Tuesday' : 'Mardi', 'Wednesday' : 'Mercredi', - 'Thursday' : 'Jeudi', 'Friday' : 'Vendredi', 'Saturday' : 'Samedi', - 'Sunday' : 'Dimanche', + 'Repeat': 'Répéter', + 'Days of the week': 'Jours de la semaine', + 'Monday': 'Lundi', 'Tuesday': 'Mardi', 'Wednesday': 'Mercredi', + 'Thursday': 'Jeudi', 'Friday': 'Vendredi', 'Saturday': 'Samedi', + 'Sunday': 'Dimanche', //screen_activity_tile.dart - 'Timeout Duration' : 'Durée d\'expiration', - 'Screen Activity' : 'Activité de l\'écran', - 'Screen activity based cancellation' : 'Annulation basée sur l\'activité de l\'écran', - 'screenDescription' : "Cette fonction annulera automatiquement l'alarme si vous utilisez votre appareil pendant un certain nombre de minutes.", + 'Timeout Duration': 'Durée d\'expiration', + 'Screen Activity': 'Activité de l\'écran', + 'Screen activity based cancellation': + 'Annulation basée sur l\'activité de l\'écran', + 'screenDescription': + "Cette fonction annulera automatiquement l'alarme si vous utilisez votre appareil pendant un certain nombre de minutes.", //shake_to_dismiss_tile.dart - 'Shake to dismiss' : 'Secouez pour rejeter', - 'shakeDescription' : 'Vous devrez secouer votre téléphone un certain nombre de fois pour rejeter l\'alarme - fini la procrastination :)', - 'Number of shakes' : 'Nombre de secousses', - 'times' : 'fois', - 'time' : 'fois', + 'Shake to dismiss': 'Secouez pour rejeter', + 'shakeDescription': + 'Vous devrez secouer votre téléphone un certain nombre de fois pour rejeter l\'alarme - fini la procrastination :)', + 'Number of shakes': 'Nombre de secousses', + 'times': 'fois', + 'time': 'fois', //'shared_alarm_tile.dart - 'Shared Alarm' : 'Alarme partagée', - 'Shared alarms' : 'Alarmes partagées', - 'sharedDescription' : 'Partagez des alarmes avec d\'autres en utilisant l\'ID de l\'alarme. Chaque utilisateur partagé peut choisir de faire sonner son alarme avant ou après l\'heure définie.', - 'Understood' : 'Compris', - 'To use this feature, you have to link your Google account!' : 'Pour utiliser cette fonctionnalité, vous devez lier votre compte Google !', - 'Go to settings' : 'Aller aux paramètres', - 'Enable Shared Alarm' : 'Activer l\'alarme partagée', + 'Shared Alarm': 'Alarme partagée', + 'Shared alarms': 'Alarmes partagées', + 'sharedDescription': + 'Partagez des alarmes avec d\'autres en utilisant l\'ID de l\'alarme. Chaque utilisateur partagé peut choisir de faire sonner son alarme avant ou après l\'heure définie.', + 'Understood': 'Compris', + 'To use this feature, you have to link your Google account!': + 'Pour utiliser cette fonctionnalité, vous devez lier votre compte Google !', + 'Go to settings': 'Aller aux paramètres', + 'Enable Shared Alarm': 'Activer l\'alarme partagée', //shared_users_tile.dart - 'Alarm Owner' : 'Propriétaire de l\'alarme', - 'Shared Users' : 'Utilisateurs partagés', - 'No shared users!' : 'Aucun utilisateur partagé !', - 'Remove' : 'Supprimer', - 'Select duration' : 'Sélectionner la durée', + 'Alarm Owner': 'Propriétaire de l\'alarme', + 'Shared Users': 'Utilisateurs partagés', + 'No shared users!': 'Aucun utilisateur partagé !', + 'Remove': 'Supprimer', + 'Select duration': 'Sélectionner la durée', //snooze_duration_tile.dart - 'Snooze Duration' : 'Durée de l\'hibernation', + 'Snooze Duration': 'Durée de l\'hibernation', //weather_tile.dart - 'Select weather types' : 'Sélectionner les types de temps', - 'Sunny' : 'Ensoleillé', - 'Cloudy' : 'Nuageux', - 'Rainy' : 'Pluvieux', - 'Windy' : 'Venteux', - 'Stormy' : 'Orageux', - 'Weather Condition' : 'Conditions météorologiques', - 'Weather based cancellation' : 'Annulation basée sur la météo', - 'weatherDescription' : 'Cette fonction annulera automatiquement l\'alarme si la météo actuelle correspond à vos conditions météorologiques choisies, vous permettant de mieux dormir !', - 'To use this feature, you have to add an OpenWeatherMap API key!' : 'Pour utiliser cette fonction, vous devez ajouter une clé API OpenWeatherMap !', + 'Select weather types': 'Sélectionner les types de temps', + 'Sunny': 'Ensoleillé', + 'Cloudy': 'Nuageux', + 'Rainy': 'Pluvieux', + 'Windy': 'Venteux', + 'Stormy': 'Orageux', + 'Weather Condition': 'Conditions météorologiques', + 'Weather based cancellation': 'Annulation basée sur la météo', + 'weatherDescription': + 'Cette fonction annulera automatiquement l\'alarme si la météo actuelle correspond à vos conditions météorologiques choisies, vous permettant de mieux dormir !', + 'To use this feature, you have to add an OpenWeatherMap API key!': + 'Pour utiliser cette fonction, vous devez ajouter une clé API OpenWeatherMap !', //alarm_challenge_view.dart - 'Shake Challenge' : 'Défi de secousses', - 'Maths Challenge' : 'Défi mathématique', - 'QR/Bar Code Challenge' : 'Défi QR/Code-barres', + 'Shake Challenge': 'Défi de secousses', + 'Maths Challenge': 'Défi mathématique', + 'QR/Bar Code Challenge': 'Défi QR/Code-barres', //maths_challenge_view.dart - 'Question @noMathQ' : 'Question @noMathQ', + 'Question @noMathQ': 'Question @noMathQ', //qr_challenge_view.dart - 'Scan your QR/Bar Code!' : 'Scannez votre QR/Code-barres !', - 'Wrong Code Scanned!' : 'Code incorrect scanné !', - 'Retake' : 'Recommencer', + 'Scan your QR/Bar Code!': 'Scannez votre QR/Code-barres !', + 'Wrong Code Scanned!': 'Code incorrect scanné !', + 'Retake': 'Recommencer', //shake_challenge_view.dart - 'Shake your phone!' : 'Secouez votre téléphone !', + 'Shake your phone!': 'Secouez votre téléphone !', //alarm_ring_view.dart - "You can't go back while the alarm is ringing" : "Vous ne pouvez pas revenir tant que l'alarme sonne", - 'Start Challenge' : 'Commencer le défi', - 'Dismiss' : 'Rejeter', - 'Exit Preview' : 'Quitter l\'aperçu', - 'Snooze' : 'Hibernation', - //utils.dart - 'Location Based': 'Basé sur la localisation', - 'Everyday': 'Tous les jours', - 'Weekdays': 'Jours de la semaine', - 'Weekends': 'Week-ends', - 'Mon': 'Lun', 'Tue': 'Mar', 'Wed': 'Mer', 'Thur': 'Jeu', - 'Fri': 'Ven', 'Sat': 'Sam', 'Sun': 'Dim', - //OpenWeatherMap - 'onenweathermap_title1.1': 'Étapes pour obtenir ', - 'onenweathermap_title1.2': 'OpenWeatherMap API', - 'step1.1':'Aller à ', - 'step1.2':'openweathermap.org', - 'step1.3':', cliquez sur le bouton ', - 'step1.4':'SignIn', - 'step1.5':' (le coin supérieur droit) puis il demande les informations de connexion.', - 'step2.1':"Si vous avez déjà un compte, entrez vos identifiants. Sinon, cliquez sur l'option ", - 'step2.2':'Create an Account', - 'step2.3':". Il vous demande de saisir votre nom d'utilisateur, votre e-mail et votre mot de passe. Assurez-vous que les détails sont corrects.", - 'step3':"Une fois votre compte prêt, vous êtes automatiquement dirigé vers la page OpenWeather. Il vous pose des questions sur votre entreprise et le but de l'utilisation de la plateforme, remplissez ces informations en conséquence.", - 'step4.1':'Cliquez sur votre ', - 'step4.2':'Username', - 'step4.3':"(le coin supérieur droit). Un menu déroulant apparaît. cliquez sur l'option ", - 'step4.4':'My API', - 'step4.5':'.', - 'step5':'Vous disposez désormais de la clé API Météo. Sélectionnez la clé et copiez-la.', - }, -}; + "You can't go back while the alarm is ringing": + "Vous ne pouvez pas revenir tant que l'alarme sonne", + 'Start Challenge': 'Commencer le défi', + 'Dismiss': 'Rejeter', + 'Exit Preview': 'Quitter l\'aperçu', + 'Snooze': 'Hibernation', + //utils.dart + 'Location Based': 'Basé sur la localisation', + 'Everyday': 'Tous les jours', + 'Weekdays': 'Jours de la semaine', + 'Weekends': 'Week-ends', + 'Mon': 'Lun', 'Tue': 'Mar', 'Wed': 'Mer', 'Thur': 'Jeu', + 'Fri': 'Ven', 'Sat': 'Sam', 'Sun': 'Dim', + //OpenWeatherMap + 'onenweathermap_title1.1': 'Étapes pour obtenir ', + 'onenweathermap_title1.2': 'OpenWeatherMap API', + 'step1.1': 'Aller à ', + 'step1.2': 'openweathermap.org', + 'step1.3': ', cliquez sur le bouton ', + 'step1.4': 'SignIn', + 'step1.5': + ' (le coin supérieur droit) puis il demande les informations de connexion.', + 'step2.1': + "Si vous avez déjà un compte, entrez vos identifiants. Sinon, cliquez sur l'option ", + 'step2.2': 'Create an Account', + 'step2.3': + ". Il vous demande de saisir votre nom d'utilisateur, votre e-mail et votre mot de passe. Assurez-vous que les détails sont corrects.", + 'step3': + "Une fois votre compte prêt, vous êtes automatiquement dirigé vers la page OpenWeather. Il vous pose des questions sur votre entreprise et le but de l'utilisation de la plateforme, remplissez ces informations en conséquence.", + 'step4.1': 'Cliquez sur votre ', + 'step4.2': 'Username', + 'step4.3': + "(le coin supérieur droit). Un menu déroulant apparaît. cliquez sur l'option ", + 'step4.4': 'My API', + 'step4.5': '.', + 'step5': + 'Vous disposez désormais de la clé API Météo. Sélectionnez la clé et copiez-la.', + //ascending_volume.dart + 'Volume will reach maximum in': + 'Le volume atteindra son maximum dans', + 'seconds': 'secondes', + 'Adjust the volume range:': 'Ajustez la plage de volume:', + 'Apply Gradient': 'Appliquer un dégradé', + 'Ascending Volume': 'Volume croissant', + }, + }; } diff --git a/lib/app/utils/languages/german_translations.dart b/lib/app/utils/languages/german_translations.dart index 2c29d6bc..51a35cb4 100644 --- a/lib/app/utils/languages/german_translations.dart +++ b/lib/app/utils/languages/german_translations.dart @@ -3,197 +3,234 @@ import 'package:get/get.dart'; class GermanTranslations extends Translations { @override Map> get keys => { - 'de_DE' : { - 'Alarm' : 'Wecker', - 'Timer' : 'Schaltuhr', + 'de_DE': { + 'Alarm': 'Wecker', + 'Timer': 'Schaltuhr', - 'Enable 24 Hour Format' : '24-Stunden-Format aktivieren', - 'Enable Haptic Feedback' : 'Haptisches Feedback aktivieren', - 'Enable Sorted Alarm List' : 'Sortierte Weckerliste aktivieren', - // google_sign_in.dart - 'Your account is now linked!' : 'Ihr Konto ist jetzt verknüpft!', - 'Are you sure?' : 'Sind Sie sicher?', - 'unlinkAccount' : 'Möchten Sie Ihr Google-Konto wirklich entknüpfen?', - 'Unlink' : 'Entknüpfen', - 'Sign-In with Google' : 'Mit Google anmelden', - 'Unlink @usermail' : 'Entknüpfen von @usermail', - 'Why do I have to sign in with Google?' : 'Warum muss ich mich bei Google anmelden?', - 'Sign-inDescription' : 'Die Anmeldung ist optional. Sie ist nur erforderlich für Funktionen, die Cloud-Dienste nutzen, wie zum Beispiel:', - 'CollabDescription' : 'Zusammenarbeit mit Freunden, Familienmitgliedern oder Kollegen, um sicherzustellen, dass sie rechtzeitig aufwachen, indem geteilte Wecker verwendet werden.', - 'Syncing Across Devices' : 'Synchronisation über Geräte hinweg', - 'AccessMultiple' : 'Greifen Sie auf Ihre Wecker von mehreren Geräten aus zu, wo die Wecker in Echtzeit aktualisiert werden.', - 'Your privacy' : 'Ihre Privatsphäre', - 'NoAccessInfo' : 'Wir greifen nicht auf Informationen zu, verwenden sie nicht und verkaufen sie nicht, was Sie durch Überprüfen des Quellcodes überprüfen können.', - 'LimitedAccess' : 'Alle Zugriffe sind ausschließlich darauf beschränkt, die oben beschriebenen Funktionen bereitzustellen.', - 'Enable Light Mode' : 'Lichtmodus aktivieren', + 'Enable 24 Hour Format': '24-Stunden-Format aktivieren', + 'Enable Haptic Feedback': 'Haptisches Feedback aktivieren', + 'Enable Sorted Alarm List': 'Sortierte Weckerliste aktivieren', + // google_sign_in.dart + 'Your account is now linked!': 'Ihr Konto ist jetzt verknüpft!', + 'Are you sure?': 'Sind Sie sicher?', + 'unlinkAccount': 'Möchten Sie Ihr Google-Konto wirklich entknüpfen?', + 'Unlink': 'Entknüpfen', + 'Sign-In with Google': 'Mit Google anmelden', + 'Unlink @usermail': 'Entknüpfen von @usermail', + 'Why do I have to sign in with Google?': + 'Warum muss ich mich bei Google anmelden?', + 'Sign-inDescription': + 'Die Anmeldung ist optional. Sie ist nur erforderlich für Funktionen, die Cloud-Dienste nutzen, wie zum Beispiel:', + 'CollabDescription': + 'Zusammenarbeit mit Freunden, Familienmitgliedern oder Kollegen, um sicherzustellen, dass sie rechtzeitig aufwachen, indem geteilte Wecker verwendet werden.', + 'Syncing Across Devices': 'Synchronisation über Geräte hinweg', + 'AccessMultiple': + 'Greifen Sie auf Ihre Wecker von mehreren Geräten aus zu, wo die Wecker in Echtzeit aktualisiert werden.', + 'Your privacy': 'Ihre Privatsphäre', + 'NoAccessInfo': + 'Wir greifen nicht auf Informationen zu, verwenden sie nicht und verkaufen sie nicht, was Sie durch Überprüfen des Quellcodes überprüfen können.', + 'LimitedAccess': + 'Alle Zugriffe sind ausschließlich darauf beschränkt, die oben beschriebenen Funktionen bereitzustellen.', + 'Enable Light Mode': 'Lichtmodus aktivieren', - 'No upcoming alarms!' : 'Keine bevorstehenden Alarme', - 'Next alarm' : 'Nächster Alarm', - 'Show Motivational Quote' : 'Zeige motivierendes Zitat', - //home_view.dart - 'About' : 'Um', - 'Settings' : 'Einstellungen', - 'v0.5.0' : 'v0.5.0', - 'Ultimate Alarm Clock' : 'Ultimativer Wecker', - 'Create alarm' : 'Alarm erstellen', - 'Join alarm' : 'Alarm beitreten', - 'Okay' : 'Okay', - 'You cannot join your own alarm!' : 'Sie können Ihrem eigenen Alarm nicht beitreten!', - 'An alarm with this ID doesn\'t exist!' : 'Ein Alarm mit dieser ID existiert nicht!', - 'Error!' : 'Fehler!', - 'Join' : 'Verbinden', - 'Enter Alarm ID' : 'Alarm-ID eingeben.', - 'Join an alarm' : 'Alarm beitreten', - 'Select alarms to delete' : 'Wählen Sie zu löschende Wecker aus', - 'No alarm selected' : 'Kein Alarm ausgewählt', - '1 alarm selected' : '1 Alarm ausgewählt', - ' alarms selected' : 'Alarm ausgewählt', - 'Add an alarm to get started!' : 'Fügen Sie einen Alarm hinzu, um loszulegen!', - 'Never' : 'Niemals', - 'One Time' : 'Einmal', - 'Preview Alarm' : 'Vorschaualarm', - 'Delete Alarm' : 'Alarm löschen', - //about_view.dart texts - 'This project was originally developed as part of Google Summer of code under the CCExtractor organization. It\'s free, the source code is available, and we encourage programmers to contribute' : 'Dieses Projekt wurde ursprünglich im Rahmen des Google Summer of Code unter der Organisation CCExtractor entwickelt. Es ist kostenlos, der Quellcode ist verfügbar, und wir ermutigen Programmierer zur Mitarbeit.', - 'Could not launch' : 'Konnte nicht starten', + 'No upcoming alarms!': 'Keine bevorstehenden Alarme', + 'Next alarm': 'Nächster Alarm', + 'Show Motivational Quote': 'Zeige motivierendes Zitat', + //home_view.dart + 'About': 'Um', + 'Settings': 'Einstellungen', + 'v0.5.0': 'v0.5.0', + 'Ultimate Alarm Clock': 'Ultimativer Wecker', + 'Create alarm': 'Alarm erstellen', + 'Join alarm': 'Alarm beitreten', + 'Okay': 'Okay', + 'You cannot join your own alarm!': + 'Sie können Ihrem eigenen Alarm nicht beitreten!', + 'An alarm with this ID doesn\'t exist!': + 'Ein Alarm mit dieser ID existiert nicht!', + 'Error!': 'Fehler!', + 'Join': 'Verbinden', + 'Enter Alarm ID': 'Alarm-ID eingeben.', + 'Join an alarm': 'Alarm beitreten', + 'Select alarms to delete': 'Wählen Sie zu löschende Wecker aus', + 'No alarm selected': 'Kein Alarm ausgewählt', + '1 alarm selected': '1 Alarm ausgewählt', + ' alarms selected': 'Alarm ausgewählt', + 'Add an alarm to get started!': + 'Fügen Sie einen Alarm hinzu, um loszulegen!', + 'Never': 'Niemals', + 'One Time': 'Einmal', + 'Preview Alarm': 'Vorschaualarm', + 'Delete Alarm': 'Alarm löschen', + //about_view.dart texts + 'This project was originally developed as part of Google Summer of code under the CCExtractor organization. It\'s free, the source code is available, and we encourage programmers to contribute': + 'Dieses Projekt wurde ursprünglich im Rahmen des Google Summer of Code unter der Organisation CCExtractor entwickelt. Es ist kostenlos, der Quellcode ist verfügbar, und wir ermutigen Programmierer zur Mitarbeit.', + 'Could not launch': 'Konnte nicht starten', //add_or_update_alarm_view.dart - 'Discard Changes?' : 'Änderungen verwerfen?', - 'unsavedChanges' : 'Sie haben ungespeicherte Änderungen. Möchten Sie diese Seite wirklich verlassen?', - 'Cancel' : 'Abbrechen', - 'Leave' : 'Verlassen', - 'Save' : 'Speichern', - 'Update' : 'Aktualisieren', - 'Rings in @timeToAlarm' : 'Klingelt in @timeToAlarm', - 'Uh-oh!' : 'Oh-oh!', - 'alarmEditing' : 'Dieser Alarm wird gerade bearbeitet!', - 'Go back' : 'Zurück gehen', - 'Automatic Cancellation' : 'Automatische Stornierung', - 'Challenges' : 'Herausforderungen', - 'Shared Alarm' : 'Geteilter Alarm', + 'Discard Changes?': 'Änderungen verwerfen?', + 'unsavedChanges': + 'Sie haben ungespeicherte Änderungen. Möchten Sie diese Seite wirklich verlassen?', + 'Cancel': 'Abbrechen', + 'Leave': 'Verlassen', + 'Save': 'Speichern', + 'Update': 'Aktualisieren', + 'Rings in @timeToAlarm': 'Klingelt in @timeToAlarm', + 'Uh-oh!': 'Oh-oh!', + 'alarmEditing': 'Dieser Alarm wird gerade bearbeitet!', + 'Go back': 'Zurück gehen', + 'Automatic Cancellation': 'Automatische Stornierung', + 'Challenges': 'Herausforderungen', + 'Shared Alarm': 'Geteilter Alarm', //alarm_id_tile.dart - 'Success!' : 'Erfolg!', - 'Alarm ID has been copied!' : 'Alarm-ID wurde kopiert!', - 'Alarm ID' : 'Alarm-ID', - 'Disabled!' : 'Deaktiviert!', - 'toCopyAlarm' : 'Um die Alarm-ID zu kopieren, müssen Sie den gemeinsam genutzten Alarm aktivieren!', - 'Choose duration' : 'Dauer wählen', - 'minutes' : 'Minuten', - 'minute' : 'Minute', - 'Before' : 'Vor', - 'After' : 'Nach', - 'Ring before / after ' : 'Klingeln vor / nach', - 'Enabled' : 'Aktiviert', - 'Off' : 'Aus', + 'Success!': 'Erfolg!', + 'Alarm ID has been copied!': 'Alarm-ID wurde kopiert!', + 'Alarm ID': 'Alarm-ID', + 'Disabled!': 'Deaktiviert!', + 'toCopyAlarm': + 'Um die Alarm-ID zu kopieren, müssen Sie den gemeinsam genutzten Alarm aktivieren!', + 'Choose duration': 'Dauer wählen', + 'minutes': 'Minuten', + 'minute': 'Minute', + 'Before': 'Vor', + 'After': 'Nach', + 'Ring before / after ': 'Klingeln vor / nach', + 'Enabled': 'Aktiviert', + 'Off': 'Aus', //choose_ringtone_tile.dart - 'Choose Ringtone' : 'Klingelton auswählen', - 'Default' : 'Standard', - 'Upload Ringtone' : 'Klingelton hochladen', - 'Done' : 'Fertig', + 'Choose Ringtone': 'Klingelton auswählen', + 'Default': 'Standard', + 'Upload Ringtone': 'Klingelton hochladen', + 'Done': 'Fertig', //label_tile.dart - 'Label' : 'Etikett', - 'Enter a name' : 'Geben Sie einen Namen ein', - 'Note' : 'Hinweis', - 'noWhitespace' : 'Bitte geben Sie kein Leerzeichen als ersten Zeichen ein!', + 'Label': 'Etikett', + 'Enter a name': 'Geben Sie einen Namen ein', + 'Note': 'Hinweis', + 'noWhitespace': + 'Bitte geben Sie kein Leerzeichen als ersten Zeichen ein!', //maths_challenge_tile.dart - 'Maths' : 'Mathematik', - 'Math problems' : 'Mathematische Probleme', - 'mathDescription' : 'Sie müssen einfache mathematische Probleme der gewählten Schwierigkeitsstufe lösen, um den Alarm abzuschalten.', - 'Solve Maths questions' : 'Lösen Sie mathematische Fragen', - 'questions' : 'Fragen', - 'question' : 'Frage', + 'Maths': 'Mathematik', + 'Math problems': 'Mathematische Probleme', + 'mathDescription': + 'Sie müssen einfache mathematische Probleme der gewählten Schwierigkeitsstufe lösen, um den Alarm abzuschalten.', + 'Solve Maths questions': 'Lösen Sie mathematische Fragen', + 'questions': 'Fragen', + 'question': 'Frage', //note.dart - 'Enter a note' : 'Geben Sie eine Notiz ein', + 'Enter a note': 'Geben Sie eine Notiz ein', // qr_bar_code_tile.dart - 'QR/Bar Code' : 'QR-/Strichcode', - 'qrDescription' : 'Scannen Sie den QR-/Strichcode auf einem Objekt wie einem Buch und verschieben Sie es in einen anderen Raum. Zum Deaktivieren des Alarms scannen Sie einfach denselben QR-/Strichcode erneut.', + 'QR/Bar Code': 'QR-/Strichcode', + 'qrDescription': + 'Scannen Sie den QR-/Strichcode auf einem Objekt wie einem Buch und verschieben Sie es in einen anderen Raum. Zum Deaktivieren des Alarms scannen Sie einfach denselben QR-/Strichcode erneut.', //repeat_once_tile.dart - 'Repeat only once' : 'Nur einmal wiederholen', + 'Repeat only once': 'Nur einmal wiederholen', //repeat_tile.dart - 'Repeat' : 'Wiederholen', - 'Days of the week' : 'Tage der Woche', - 'Monday' : 'Montag', 'Tuesday' : 'Dienstag', 'Wednesday' : 'Mittwoch', - 'Thursday' : 'Donnerstag', 'Friday' : 'Freitag', 'Saturday' : 'Samstag', - 'Sunday' : 'Sonntag', + 'Repeat': 'Wiederholen', + 'Days of the week': 'Tage der Woche', + 'Monday': 'Montag', 'Tuesday': 'Dienstag', 'Wednesday': 'Mittwoch', + 'Thursday': 'Donnerstag', 'Friday': 'Freitag', 'Saturday': 'Samstag', + 'Sunday': 'Sonntag', //screen_activity_tile.dart - 'Timeout Duration' : 'Zeitlimit', - 'Screen Activity' : 'Bildschirmaktivität', - 'Screen activity based cancellation' : 'Stornierung aufgrund von Bildschirmaktivität', - 'screenDescription' : 'Diese Funktion storniert den Alarm automatisch, wenn Sie Ihr Gerät für eine festgelegte Anzahl von Minuten verwenden.', + 'Timeout Duration': 'Zeitlimit', + 'Screen Activity': 'Bildschirmaktivität', + 'Screen activity based cancellation': + 'Stornierung aufgrund von Bildschirmaktivität', + 'screenDescription': + 'Diese Funktion storniert den Alarm automatisch, wenn Sie Ihr Gerät für eine festgelegte Anzahl von Minuten verwenden.', //shake_to_dismiss_tile.dart - 'Shake to dismiss' : 'Schütteln zum Abbrechen', - 'shakeDescription' : 'Sie müssen Ihr Telefon eine festgelegte Anzahl von Malen schütteln, um den Alarm abzubrechen - kein gemütliches Schlummern mehr :)', - 'Number of shakes' : 'Anzahl der Schütteln', - 'times' : 'Mal', - 'time' : 'Mal', + 'Shake to dismiss': 'Schütteln zum Abbrechen', + 'shakeDescription': + 'Sie müssen Ihr Telefon eine festgelegte Anzahl von Malen schütteln, um den Alarm abzubrechen - kein gemütliches Schlummern mehr :)', + 'Number of shakes': 'Anzahl der Schütteln', + 'times': 'Mal', + 'time': 'Mal', //'shared_alarm_tile.dart - 'Shared Alarm' : 'Geteilter Alarm', - 'sharedDescription' : 'Teilen Sie Alarme mit anderen mithilfe der Alarm-ID. Jeder geteilte Benutzer kann wählen, ob sein Alarm vor oder nach der eingestellten Zeit klingelt.', - 'Understood' : 'Verstanden', - 'To use this feature, you have to link your Google account!' : 'Um diese Funktion zu verwenden, müssen Sie Ihr Google-Konto verknüpfen!', - 'Go to settings' : 'Zu den Einstellungen gehen', - 'Enable Shared Alarm' : 'Geteilten Alarm aktivieren', + 'Shared Alarm': 'Geteilter Alarm', + 'Shared alarms': 'Geteilte Alarme', + 'sharedDescription': + 'Teilen Sie Alarme mit anderen mithilfe der Alarm-ID. Jeder geteilte Benutzer kann wählen, ob sein Alarm vor oder nach der eingestellten Zeit klingelt.', + 'Understood': 'Verstanden', + 'To use this feature, you have to link your Google account!': + 'Um diese Funktion zu verwenden, müssen Sie Ihr Google-Konto verknüpfen!', + 'Go to settings': 'Zu den Einstellungen gehen', + 'Enable Shared Alarm': 'Geteilten Alarm aktivieren', //shared_users_tile.dart - 'Alarm Owner' : 'Alarm-Besitzer', - 'Shared Users' : 'Geteilte Benutzer', - 'No shared users!' : 'Keine geteilten Benutzer!', - 'Remove' : 'Entfernen', - 'Select duration' : 'Dauer wählen', + 'Alarm Owner': 'Alarm-Besitzer', + 'Shared Users': 'Geteilte Benutzer', + 'No shared users!': 'Keine geteilten Benutzer!', + 'Remove': 'Entfernen', + 'Select duration': 'Dauer wählen', //snooze_duration_tile.dart - 'Snooze Duration' : 'Schlummerdauer', + 'Snooze Duration': 'Schlummerdauer', //weather_tile.dart - 'Select weather types' : 'Wettertypen auswählen', - 'Sunny' : 'Sonnig', - 'Cloudy' : 'Bewölkt', - 'Rainy' : 'Regnerisch', - 'Windy' : 'Windig', - 'Stormy' : 'Stürmisch', - 'Weather Condition' : 'Wetterbedingung', - 'Weather based cancellation' : 'Stornierung aufgrund von Wetterbedingungen', - 'weatherDescription' : 'Diese Funktion storniert den Alarm automatisch, wenn das aktuelle Wetter Ihren ausgewählten Wetterbedingungen entspricht und ermöglicht so einen besseren Schlaf!', - 'To use this feature, you have to add an OpenWeatherMap API key!' : 'Um diese Funktion zu verwenden, müssen Sie einen API-Schlüssel von OpenWeatherMap hinzufügen!', + 'Select weather types': 'Wettertypen auswählen', + 'Sunny': 'Sonnig', + 'Cloudy': 'Bewölkt', + 'Rainy': 'Regnerisch', + 'Windy': 'Windig', + 'Stormy': 'Stürmisch', + 'Weather Condition': 'Wetterbedingung', + 'Weather based cancellation': + 'Stornierung aufgrund von Wetterbedingungen', + 'weatherDescription': + 'Diese Funktion storniert den Alarm automatisch, wenn das aktuelle Wetter Ihren ausgewählten Wetterbedingungen entspricht und ermöglicht so einen besseren Schlaf!', + 'To use this feature, you have to add an OpenWeatherMap API key!': + 'Um diese Funktion zu verwenden, müssen Sie einen API-Schlüssel von OpenWeatherMap hinzufügen!', //alarm_challenge_view.dart - 'Shake Challenge' : 'Schüttel-Herausforderung', - 'Maths Challenge' : 'Mathe-Herausforderung', - 'QR/Bar Code Challenge' : 'QR-/Strichcode-Herausforderung', + 'Shake Challenge': 'Schüttel-Herausforderung', + 'Maths Challenge': 'Mathe-Herausforderung', + 'QR/Bar Code Challenge': 'QR-/Strichcode-Herausforderung', //maths_challenge_view.dart - 'Question @noMathQ' : 'Frage @noMathQ', + 'Question @noMathQ': 'Frage @noMathQ', //qr_challenge_view.dart - 'Scan your QR/Bar Code!' : 'Scannen Sie Ihren QR-/Strichcode!', - 'Wrong Code Scanned!' : 'Falscher Code gescannt!', - 'Retake' : 'Wiederholen', + 'Scan your QR/Bar Code!': 'Scannen Sie Ihren QR-/Strichcode!', + 'Wrong Code Scanned!': 'Falscher Code gescannt!', + 'Retake': 'Wiederholen', //shake_challenge_view.dart - 'Shake your phone!' : 'Schütteln Sie Ihr Telefon!', + 'Shake your phone!': 'Schütteln Sie Ihr Telefon!', //alarm_ring_view.dart - "You can't go back while the alarm is ringing" : "Sie können nicht zurückgehen, während der Alarm klingelt", - 'Start Challenge' : 'Herausforderung starten', - 'Dismiss' : 'Abbrechen', - 'Exit Preview' : 'Vorschau beenden', - 'Snooze' : 'Schlummern', - //utils.dart - 'Location Based': 'Ortsbasiert', - 'Everyday': 'Täglich', - 'Weekdays': 'Wochentage', - 'Weekends': 'Wochenenden', - 'Mon': 'Mo', 'Tue': 'Di', 'Wed': 'Mi', 'Thur': 'Do', - 'Fri': 'Fr', 'Sat': 'Sa', 'Sun': 'So', - //OpenWeatherMap - 'onenweathermap_title1.1': 'Schritte zum Erhalten ', - 'onenweathermap_title1.2': 'OpenWeatherMap API', - 'step1.1':'Gehe zu ', - 'step1.2':'openweathermap.org', - 'step1.3':', Klicken Sie auf die Schaltfläche ', - 'step1.4':'SignIn', - 'step1.5':' (oben rechts) und Sie werden nach Ihren Anmeldeinformationen gefragt.', - 'step2.1':'Wenn Sie bereits ein Konto haben, geben Sie Ihre Zugangsdaten ein. Andernfalls klicken Sie auf die Option ', - 'step2.2':'Create an Account', - 'step2.3':'. Sie werden aufgefordert, Ihren Benutzernamen, Ihre E-Mail-Adresse und Ihr Passwort einzugeben. Stellen Sie sicher, dass die Angaben korrekt sind.', - 'step3':'Sobald Ihr Konto bereit ist, werden Sie automatisch zur OpenWeather-Seite weitergeleitet. Dabei werden Sie nach Ihrem Unternehmen und dem Zweck der Nutzung der Plattform gefragt, Füllen Sie diese Angaben entsprechend aus.', - 'step4.1':'Klicken Sie auf Ihr ', - 'step4.2':'Username', - 'step4.3':'(oben rechts). Es erscheint ein Dropdown-Menü. Klicken Sie auf die Option ', - 'step4.4':'My API', - 'step4.5':'.', - 'step5':'Jetzt haben Sie den Wetter-API-Schlüssel. Wählen Sie den Schlüssel aus und kopieren Sie ihn.', - }, - }; + "You can't go back while the alarm is ringing": + "Sie können nicht zurückgehen, während der Alarm klingelt", + 'Start Challenge': 'Herausforderung starten', + 'Dismiss': 'Abbrechen', + 'Exit Preview': 'Vorschau beenden', + 'Snooze': 'Schlummern', + //utils.dart + 'Location Based': 'Ortsbasiert', + 'Everyday': 'Täglich', + 'Weekdays': 'Wochentage', + 'Weekends': 'Wochenenden', + 'Mon': 'Mo', 'Tue': 'Di', 'Wed': 'Mi', 'Thur': 'Do', + 'Fri': 'Fr', 'Sat': 'Sa', 'Sun': 'So', + //OpenWeatherMap + 'onenweathermap_title1.1': 'Schritte zum Erhalten ', + 'onenweathermap_title1.2': 'OpenWeatherMap API', + 'step1.1': 'Gehe zu ', + 'step1.2': 'openweathermap.org', + 'step1.3': ', Klicken Sie auf die Schaltfläche ', + 'step1.4': 'SignIn', + 'step1.5': + ' (oben rechts) und Sie werden nach Ihren Anmeldeinformationen gefragt.', + 'step2.1': + 'Wenn Sie bereits ein Konto haben, geben Sie Ihre Zugangsdaten ein. Andernfalls klicken Sie auf die Option ', + 'step2.2': 'Create an Account', + 'step2.3': + '. Sie werden aufgefordert, Ihren Benutzernamen, Ihre E-Mail-Adresse und Ihr Passwort einzugeben. Stellen Sie sicher, dass die Angaben korrekt sind.', + 'step3': + 'Sobald Ihr Konto bereit ist, werden Sie automatisch zur OpenWeather-Seite weitergeleitet. Dabei werden Sie nach Ihrem Unternehmen und dem Zweck der Nutzung der Plattform gefragt, Füllen Sie diese Angaben entsprechend aus.', + 'step4.1': 'Klicken Sie auf Ihr ', + 'step4.2': 'Username', + 'step4.3': + '(oben rechts). Es erscheint ein Dropdown-Menü. Klicken Sie auf die Option ', + 'step4.4': 'My API', + 'step4.5': '.', + 'step5': + 'Jetzt haben Sie den Wetter-API-Schlüssel. Wählen Sie den Schlüssel aus und kopieren Sie ihn.', + //ascending_volume.dart + 'Volume will reach maximum in': 'Die Lautstärke erreicht ihr Maximum', + 'seconds': 'sekunden', + 'Adjust the volume range:': 'Passen Sie den Lautstärkebereich ans:', + 'Apply Gradient': 'Farbverlauf anwenden', + 'Ascending Volume': 'Aufsteigende Lautstärke', + }, + }; } diff --git a/lib/app/utils/languages/russian_translations.dart b/lib/app/utils/languages/russian_translations.dart index 458b076a..0a3e7887 100644 --- a/lib/app/utils/languages/russian_translations.dart +++ b/lib/app/utils/languages/russian_translations.dart @@ -2,199 +2,234 @@ import 'package:get/get.dart'; class RussianTranslations extends Translations { @override - Map>get keys => { - 'ru_RU' : { - 'Alarm' : 'Будильник', - 'Timer' : 'Таймер', + Map> get keys => { + 'ru_RU': { + 'Alarm': 'Будильник', + 'Timer': 'Таймер', - 'Enable 24 Hour Format' : 'Включить 24-часовой формат', - 'Enable Haptic Feedback' : 'Включить тактильную отдачу', - 'Enable Sorted Alarm List' : 'Включить отсортированный список будильников', - // google_sign_in.dart - 'Your account is now linked!' : 'Ваш аккаунт теперь связан!', - 'Are you sure?' : 'Вы уверены?', - 'unlinkAccount' : 'Вы действительно хотите отвязать свой аккаунт Google?', - 'Unlink' : 'Отвязать', - 'Sign-In with Google' : 'Вход с помощью Google', - 'Unlink @usermail' : 'Отвязать @usermail', - 'Why do I have to sign in with Google?' : 'Почему мне нужно войти с помощью Google?', - 'Sign-inDescription' : 'Вход необязателен. Он требуется только для функций, использующих облачные службы, таких как:', - 'CollabDescription' : 'Сотрудничество с друзьями, членами семьи или коллегами, чтобы удостовериться, что они просыпаются вовремя с использованием общих будильников.', - 'Syncing Across Devices' : 'Синхронизация между устройствами', - 'AccessMultiple' : 'Доступ к вашим будильникам с нескольких устройств, где будильники обновляются в реальном времени.', - 'Your privacy' : 'Ваша конфиденциальность', - 'NoAccessInfo' : 'Мы не имеем доступа, не используем и не продаем никакую информацию, что вы можете проверить, изучив исходный код.', - 'LimitedAccess' : 'Весь доступ ограничен исключительно предоставлением описанных выше функций.', - 'Enable Light Mode' : 'Включить светлый режим', + 'Enable 24 Hour Format': 'Включить 24-часовой формат', + 'Enable Haptic Feedback': 'Включить тактильную отдачу', + 'Enable Sorted Alarm List': + 'Включить отсортированный список будильников', + // google_sign_in.dart + 'Your account is now linked!': 'Ваш аккаунт теперь связан!', + 'Are you sure?': 'Вы уверены?', + 'unlinkAccount': + 'Вы действительно хотите отвязать свой аккаунт Google?', + 'Unlink': 'Отвязать', + 'Sign-In with Google': 'Вход с помощью Google', + 'Unlink @usermail': 'Отвязать @usermail', + 'Why do I have to sign in with Google?': + 'Почему мне нужно войти с помощью Google?', + 'Sign-inDescription': + 'Вход необязателен. Он требуется только для функций, использующих облачные службы, таких как:', + 'CollabDescription': + 'Сотрудничество с друзьями, членами семьи или коллегами, чтобы удостовериться, что они просыпаются вовремя с использованием общих будильников.', + 'Syncing Across Devices': 'Синхронизация между устройствами', + 'AccessMultiple': + 'Доступ к вашим будильникам с нескольких устройств, где будильники обновляются в реальном времени.', + 'Your privacy': 'Ваша конфиденциальность', + 'NoAccessInfo': + 'Мы не имеем доступа, не используем и не продаем никакую информацию, что вы можете проверить, изучив исходный код.', + 'LimitedAccess': + 'Весь доступ ограничен исключительно предоставлением описанных выше функций.', + 'Enable Light Mode': 'Включить светлый режим', - 'No upcoming alarms!' : 'Никаких предстоящих сигналов тревоги!', - 'Next alarm' : 'Следующий сигнал тревоги', - 'Show Motivational Quote' : 'Показать мотивационную цитату', - //home_view.dart - 'About' : 'О', - 'Settings' : 'Настройки', - 'v0.5.0' : 'v0.5.0', - 'Ultimate Alarm Clock' : 'Лучший будильник', - 'Create alarm' : 'Создать будильник', - 'Join alarm' : 'Присоединиться к будильнику', - 'Okay' : 'Хорошо', - 'You cannot join your own alarm!' : 'Вы не можете присоединиться к собственной тревоге!', - 'An alarm with this ID doesn\'t exist!' : 'Тревоги с таким идентификатором не существует!', - 'Error!' : 'Ошибка!', - 'Join' : 'Присоединиться', - 'Enter Alarm ID' : 'Введите идентификатор тревоги', - 'Join an alarm' : 'присоединиться к тревоге', - 'Select alarms to delete' : 'Выберите будильники для удаления', - 'No alarm selected' : 'Тревога не выбрана', - '1 alarm selected' : 'Выбран 1 будильник', - ' alarms selected' : 'выбраны сигналы тревоги', - 'Add an alarm to get started!' : 'Добавьте будильник, чтобы начать!', - 'Never' : 'Никогда', - 'One Time' : 'Один раз', - 'Preview Alarm' : 'Предварительный просмотр тревоги', - 'Delete Alarm' : 'Удалить сигнал тревоги', - //about_view.dart texts - 'This project was originally developed as part of Google Summer of code under the CCExtractor organization. It\'s free, the source code is available, and we encourage programmers to contribute' : 'Этот проект изначально был разработан в рамках Google Summer of Code под руководством организации CCExtractor. Он бесплатен, исходный код доступен, и мы приглашаем программистов внести свой вклад.', - 'Could not launch' : 'Не удалось запустить', + 'No upcoming alarms!': 'Никаких предстоящих сигналов тревоги!', + 'Next alarm': 'Следующий сигнал тревоги', + 'Show Motivational Quote': 'Показать мотивационную цитату', + //home_view.dart + 'About': 'О', + 'Settings': 'Настройки', + 'v0.5.0': 'v0.5.0', + 'Ultimate Alarm Clock': 'Лучший будильник', + 'Create alarm': 'Создать будильник', + 'Join alarm': 'Присоединиться к будильнику', + 'Okay': 'Хорошо', + 'You cannot join your own alarm!': + 'Вы не можете присоединиться к собственной тревоге!', + 'An alarm with this ID doesn\'t exist!': + 'Тревоги с таким идентификатором не существует!', + 'Error!': 'Ошибка!', + 'Join': 'Присоединиться', + 'Enter Alarm ID': 'Введите идентификатор тревоги', + 'Join an alarm': 'присоединиться к тревоге', + 'Select alarms to delete': 'Выберите будильники для удаления', + 'No alarm selected': 'Тревога не выбрана', + '1 alarm selected': 'Выбран 1 будильник', + ' alarms selected': 'выбраны сигналы тревоги', + 'Add an alarm to get started!': 'Добавьте будильник, чтобы начать!', + 'Never': 'Никогда', + 'One Time': 'Один раз', + 'Preview Alarm': 'Предварительный просмотр тревоги', + 'Delete Alarm': 'Удалить сигнал тревоги', + //about_view.dart texts + 'This project was originally developed as part of Google Summer of code under the CCExtractor organization. It\'s free, the source code is available, and we encourage programmers to contribute': + 'Этот проект изначально был разработан в рамках Google Summer of Code под руководством организации CCExtractor. Он бесплатен, исходный код доступен, и мы приглашаем программистов внести свой вклад.', + 'Could not launch': 'Не удалось запустить', //add_or_update_alarm_view.dart - 'Discard Changes?' : 'Отменить изменения?', - 'unsavedChanges' : 'У вас есть несохраненные изменения. Вы уверены, что хотите покинуть эту страницу?', - 'Cancel' : 'Отмена', - 'Leave' : 'Выйти', - 'Save' : 'Сохранить', - 'Update' : 'Обновить', - 'Rings in @timeToAlarm' : 'Звонит через @timeToAlarm', - 'Uh-oh!' : 'Ой-ой!', - 'alarmEditing' : 'Этот будильник в настоящее время редактируется!', - 'Go back' : 'Назад', - 'Automatic Cancellation' : 'Автоматическая отмена', - 'Challenges' : 'Задания', - 'Shared Alarm' : 'Общий будильник', + 'Discard Changes?': 'Отменить изменения?', + 'unsavedChanges': + 'У вас есть несохраненные изменения. Вы уверены, что хотите покинуть эту страницу?', + 'Cancel': 'Отмена', + 'Leave': 'Выйти', + 'Save': 'Сохранить', + 'Update': 'Обновить', + 'Rings in @timeToAlarm': 'Звонит через @timeToAlarm', + 'Uh-oh!': 'Ой-ой!', + 'alarmEditing': 'Этот будильник в настоящее время редактируется!', + 'Go back': 'Назад', + 'Automatic Cancellation': 'Автоматическая отмена', + 'Challenges': 'Задания', + 'Shared Alarm': 'Общий будильник', //alarm_id_tile.dart - 'Success!' : 'Успех!', - 'Alarm ID has been copied!' : 'ID будильника скопирован!', - 'Alarm ID' : 'ID будильника', - 'Disabled!' : 'Отключено!', - 'toCopyAlarm' : 'Чтобы скопировать ID будильника, вам нужно включить общий будильник!', - 'Choose duration' : 'Выберите продолжительность', - 'minutes' : 'минут', - 'minute' : 'минута', - 'Before' : 'До', - 'After' : 'После', - 'Ring before / after ' : 'Звонить до / после', - 'Enabled' : 'Включено', - 'Off' : 'Выключено', + 'Success!': 'Успех!', + 'Alarm ID has been copied!': 'ID будильника скопирован!', + 'Alarm ID': 'ID будильника', + 'Disabled!': 'Отключено!', + 'toCopyAlarm': + 'Чтобы скопировать ID будильника, вам нужно включить общий будильник!', + 'Choose duration': 'Выберите продолжительность', + 'minutes': 'минут', + 'minute': 'минута', + 'Before': 'До', + 'After': 'После', + 'Ring before / after ': 'Звонить до / после', + 'Enabled': 'Включено', + 'Off': 'Выключено', //choose_ringtone_tile.dart - 'Choose Ringtone' : 'Выбрать мелодию', - 'Default' : 'По умолчанию', - 'Upload Ringtone' : 'Загрузить мелодию', - 'Done' : 'Готово', + 'Choose Ringtone': 'Выбрать мелодию', + 'Default': 'По умолчанию', + 'Upload Ringtone': 'Загрузить мелодию', + 'Done': 'Готово', //label_tile.dart - 'Label' : 'Метка', - 'Enter a name' : 'Введите имя', - 'Note' : 'Примечание', - 'noWhitespace' : 'Пожалуйста, не вводите пробел в качестве первого символа!', + 'Label': 'Метка', + 'Enter a name': 'Введите имя', + 'Note': 'Примечание', + 'noWhitespace': + 'Пожалуйста, не вводите пробел в качестве первого символа!', //maths_challenge_tile.dart - 'Maths' : 'Математика', - 'Math problems' : 'Математические задачи', - 'mathDescription' : 'Вам нужно решать простые математические задачи выбранного уровня сложности, чтобы отключить будильник.', - 'Solve Maths questions' : 'Решить математические вопросы', - 'questions' : 'вопросы', - 'question' : 'вопрос', + 'Maths': 'Математика', + 'Math problems': 'Математические задачи', + 'mathDescription': + 'Вам нужно решать простые математические задачи выбранного уровня сложности, чтобы отключить будильник.', + 'Solve Maths questions': 'Решить математические вопросы', + 'questions': 'вопросы', + 'question': 'вопрос', //note.dart - 'Enter a note' : 'Введите заметку', + 'Enter a note': 'Введите заметку', // qr_bar_code_tile.dart - 'QR/Bar Code' : 'QR-код / Штрих-код', - 'qrDescription' : 'Отсканируйте QR-код / Штрих-код на любом объекте, например, на книге, и переместите его в другую комнату. Чтобы отключить будильник, просто повторно отсканируйте тот же QR-код / Штрих-код.', + 'QR/Bar Code': 'QR-код / Штрих-код', + 'qrDescription': + 'Отсканируйте QR-код / Штрих-код на любом объекте, например, на книге, и переместите его в другую комнату. Чтобы отключить будильник, просто повторно отсканируйте тот же QR-код / Штрих-код.', //repeat_once_tile.dart - 'Repeat only once' : 'Повторять только один раз', + 'Repeat only once': 'Повторять только один раз', //repeat_tile.dart - 'Repeat' : 'Повторить', - 'Days of the week' : 'Дни недели', - 'Monday' : 'Понедельник', 'Tuesday' : 'Вторник', 'Wednesday' : 'Среда', - 'Thursday' : 'Четверг', 'Friday' : 'Пятница', 'Saturday' : 'Суббота', - 'Sunday' : 'Воскресенье', + 'Repeat': 'Повторить', + 'Days of the week': 'Дни недели', + 'Monday': 'Понедельник', 'Tuesday': 'Вторник', 'Wednesday': 'Среда', + 'Thursday': 'Четверг', 'Friday': 'Пятница', 'Saturday': 'Суббота', + 'Sunday': 'Воскресенье', //screen_activity_tile.dart - 'Timeout Duration' : 'Длительность тайм-аута', - 'Screen Activity' : 'Активность экрана', - 'Screen activity based cancellation' : 'Отмена на основе активности экрана', - 'screenDescription' : 'Эта функция автоматически отменяет будильник, если вы используете свое устройство в течение установленного количества минут.', + 'Timeout Duration': 'Длительность тайм-аута', + 'Screen Activity': 'Активность экрана', + 'Screen activity based cancellation': + 'Отмена на основе активности экрана', + 'screenDescription': + 'Эта функция автоматически отменяет будильник, если вы используете свое устройство в течение установленного количества минут.', //shake_to_dismiss_tile.dart - 'Shake to dismiss' : 'Встряхнуть для отклонения', - 'shakeDescription' : 'Вам нужно встряхнуть телефон установленное количество раз, чтобы отклонить будильник - больше ленивого откладывания :)', - 'Number of shakes' : 'Количество встряхиваний', - 'times' : 'раз', - 'time' : 'раз', + 'Shake to dismiss': 'Встряхнуть для отклонения', + 'shakeDescription': + 'Вам нужно встряхнуть телефон установленное количество раз, чтобы отклонить будильник - больше ленивого откладывания :)', + 'Number of shakes': 'Количество встряхиваний', + 'times': 'раз', + 'time': 'раз', //'shared_alarm_tile.dart - 'Shared Alarm' : 'Общий будильник', - 'Shared alarms' : 'Общие будильники', - 'sharedDescription' : 'Делитесь будильниками с другими, используя ID будильника. Каждый общий пользователь может выбрать, звонить ли его будильнику до или после установленного времени.', - 'Understood' : 'Понял', - 'To use this feature, you have to link your Google account!' : 'Чтобы использовать эту функцию, вы должны связать свою учетную запись Google!', - 'Go to settings' : 'Перейти к настройкам', - 'Enable Shared Alarm' : 'Включить общий будильник', + 'Shared Alarm': 'Общий будильник', + 'Shared alarms': 'Общие будильники', + 'sharedDescription': + 'Делитесь будильниками с другими, используя ID будильника. Каждый общий пользователь может выбрать, звонить ли его будильнику до или после установленного времени.', + 'Understood': 'Понял', + 'To use this feature, you have to link your Google account!': + 'Чтобы использовать эту функцию, вы должны связать свою учетную запись Google!', + 'Go to settings': 'Перейти к настройкам', + 'Enable Shared Alarm': 'Включить общий будильник', //shared_users_tile.dart - 'Alarm Owner' : 'Владелец будильника', - 'Shared Users' : 'Общие пользователи', - 'No shared users!' : 'Нет общих пользователей!', - 'Remove' : 'Удалить', - 'Select duration' : 'Выберите продолжительность', + 'Alarm Owner': 'Владелец будильника', + 'Shared Users': 'Общие пользователи', + 'No shared users!': 'Нет общих пользователей!', + 'Remove': 'Удалить', + 'Select duration': 'Выберите продолжительность', //snooze_duration_tile.dart - 'Snooze Duration' : 'Длительность отложенного сна', + 'Snooze Duration': 'Длительность отложенного сна', //weather_tile.dart - 'Select weather types' : 'Выберите типы погоды', - 'Sunny' : 'Солнечно', - 'Cloudy' : 'Облачно', - 'Rainy' : 'Дождливо', - 'Windy' : 'Ветрено', - 'Stormy' : 'Грозово', - 'Weather Condition' : 'Погодные условия', - 'Weather based cancellation' : 'Отмена на основе погоды', - 'weatherDescription' : 'Эта функция автоматически отменяет будильник, если текущая погода соответствует вашим выбранным погодным условиям, что позволяет вам спать лучше!', - 'To use this feature, you have to add an OpenWeatherMap API key!' : 'Чтобы использовать эту функцию, вы должны добавить ключ API от OpenWeatherMap!', + 'Select weather types': 'Выберите типы погоды', + 'Sunny': 'Солнечно', + 'Cloudy': 'Облачно', + 'Rainy': 'Дождливо', + 'Windy': 'Ветрено', + 'Stormy': 'Грозово', + 'Weather Condition': 'Погодные условия', + 'Weather based cancellation': 'Отмена на основе погоды', + 'weatherDescription': + 'Эта функция автоматически отменяет будильник, если текущая погода соответствует вашим выбранным погодным условиям, что позволяет вам спать лучше!', + 'To use this feature, you have to add an OpenWeatherMap API key!': + 'Чтобы использовать эту функцию, вы должны добавить ключ API от OpenWeatherMap!', //alarm_challenge_view.dart - 'Shake Challenge' : 'Задание на встряхивание', - 'Maths Challenge' : 'Математическое задание', - 'QR/Bar Code Challenge' : 'Задание на QR-код / Штрих-код', + 'Shake Challenge': 'Задание на встряхивание', + 'Maths Challenge': 'Математическое задание', + 'QR/Bar Code Challenge': 'Задание на QR-код / Штрих-код', //maths_challenge_view.dart - 'Question @noMathQ' : 'Вопрос @noMathQ', + 'Question @noMathQ': 'Вопрос @noMathQ', //qr_challenge_view.dart - 'Scan your QR/Bar Code!' : 'Отсканируйте свой QR-код / Штрих-код!', - 'Wrong Code Scanned!' : 'Неправильный код отсканирован!', - 'Retake' : 'Повторить', + 'Scan your QR/Bar Code!': 'Отсканируйте свой QR-код / Штрих-код!', + 'Wrong Code Scanned!': 'Неправильный код отсканирован!', + 'Retake': 'Повторить', //shake_challenge_view.dart - 'Shake your phone!' : 'Встряхните свой телефон!', + 'Shake your phone!': 'Встряхните свой телефон!', //alarm_ring_view.dart - "You can't go back while the alarm is ringing" : "Вы не можете вернуться, пока звонит будильник", - 'Start Challenge' : 'Начать задание', - 'Dismiss' : 'Отклонить', - 'Exit Preview' : 'Выйти из предпросмотра', - 'Snooze' : 'Отложить', - //utils.dart - 'Location Based': 'На основе местоположения', - 'Everyday': 'Каждый день', - 'Weekdays': 'Будние дни', - 'Weekends': 'Выходные', - 'Mon': 'Пн', 'Tue': 'Вт', 'Wed': 'Ср', 'Thur': 'Чт', - 'Fri': 'Пт', 'Sat': 'Сб', 'Sun': 'Вс', - //OpenWeatherMap - 'onenweathermap_title1.1': 'Шаги, чтобы получить ', - 'onenweathermap_title1.2': 'OpenWeatherMap API', - 'step1.1':'Идти к ', - 'step1.2':'openweathermap.org', - 'step1.3':', нажмите на кнопку ', - 'step1.4':'SignIn', - 'step1.5':' (в правом верхнем углу) затем он запрашивает учетные данные для входа.', - 'step2.1':'Если у вас уже есть учетная запись, введите свои учетные данные. В противном случае нажмите на опцию ', - 'step2.2':'Create an Account', - 'step2.3':' . Он просит вас ввести имя пользователя, адрес электронной почты и пароль. Убедитесь, что введенные данные верны.', - 'step3':'Как только ваша учетная запись будет создана, вы автоматически будете перенаправлены на страницу OpenWeather. Он спрашивает вас о вашей компании и цели использования платформы., заполните эти данные соответствующим образом.', - 'step4.1':'Нажмите на ', - 'step4.2':'Username', - 'step4.3':'(в правом верхнем углу). Появится раскрывающееся меню. Нажмите на опцию ', - 'step4.4':'My API', - 'step4.5':'.', - 'step5':'Теперь у вас есть API. Выберите ключ и скопируйте его.', - }, - }; + "You can't go back while the alarm is ringing": + "Вы не можете вернуться, пока звонит будильник", + 'Start Challenge': 'Начать задание', + 'Dismiss': 'Отклонить', + 'Exit Preview': 'Выйти из предпросмотра', + 'Snooze': 'Отложить', + //utils.dart + 'Location Based': 'На основе местоположения', + 'Everyday': 'Каждый день', + 'Weekdays': 'Будние дни', + 'Weekends': 'Выходные', + 'Mon': 'Пн', 'Tue': 'Вт', 'Wed': 'Ср', 'Thur': 'Чт', + 'Fri': 'Пт', 'Sat': 'Сб', 'Sun': 'Вс', + //OpenWeatherMap + 'onenweathermap_title1.1': 'Шаги, чтобы получить ', + 'onenweathermap_title1.2': 'OpenWeatherMap API', + 'step1.1': 'Идти к ', + 'step1.2': 'openweathermap.org', + 'step1.3': ', нажмите на кнопку ', + 'step1.4': 'SignIn', + 'step1.5': + ' (в правом верхнем углу) затем он запрашивает учетные данные для входа.', + 'step2.1': + 'Если у вас уже есть учетная запись, введите свои учетные данные. В противном случае нажмите на опцию ', + 'step2.2': 'Create an Account', + 'step2.3': + ' . Он просит вас ввести имя пользователя, адрес электронной почты и пароль. Убедитесь, что введенные данные верны.', + 'step3': + 'Как только ваша учетная запись будет создана, вы автоматически будете перенаправлены на страницу OpenWeather. Он спрашивает вас о вашей компании и цели использования платформы., заполните эти данные соответствующим образом.', + 'step4.1': 'Нажмите на ', + 'step4.2': 'Username', + 'step4.3': + '(в правом верхнем углу). Появится раскрывающееся меню. Нажмите на опцию ', + 'step4.4': 'My API', + 'step4.5': '.', + 'step5': 'Теперь у вас есть API. Выберите ключ и скопируйте его.', + //ascending_volume.dart + 'Volume will reach maximum in': 'Объем достигнет максимума через', + 'seconds': 'секунды', + 'Adjust the volume range:': 'Отрегулируйте диапазон громкости:', + 'Apply Gradient': 'Применить градиент', + 'Ascending Volume': 'Восходящий объем', + }, + }; } diff --git a/lib/app/utils/languages/spanish_translations.dart b/lib/app/utils/languages/spanish_translations.dart index 9c3ecae1..12c4b0b1 100644 --- a/lib/app/utils/languages/spanish_translations.dart +++ b/lib/app/utils/languages/spanish_translations.dart @@ -2,199 +2,227 @@ import 'package:get/get.dart'; class SpanishTranslations extends Translations { @override - Map>get keys => { - 'es_ES' : { - 'Alarm' : 'Alarma', - 'Timer' : 'Temporizador', + Map> get keys => { + 'es_ES': { + 'Alarm': 'Alarma', + 'Timer': 'Temporizador', - 'Enable 24 Hour Format' : 'Habilitar formato de 24 horas', - 'Enable Haptic Feedback' : 'Habilitar retroalimentación háptica', - 'Enable Sorted Alarm List' : 'Habilitar lista de alarmas ordenada', - // google_sign_in.dart - 'Your account is now linked!' : '¡Su cuenta ahora está vinculada!', - 'Are you sure?' : '¿Estás seguro?', - 'unlinkAccount' : '¿Seguro que quieres desvincular tu cuenta de Google?', - 'Unlink' : 'Desvincular', - 'Sign-In with Google' : 'Iniciar sesión con Google', - 'Unlink @usermail' : 'Desvincular @usermail', - 'Why do I have to sign in with Google?' : '¿Por qué tengo que iniciar sesión con Google?', - 'Sign-inDescription' : 'Iniciar sesión es opcional. Solo es necesario para las funciones que utilizan servicios en la nube, como:', - 'CollabDescription' : 'Colabore con amigos, familiares o colegas para asegurarse de que se despierten a tiempo utilizando alarmas compartidas.', - 'Syncing Across Devices' : 'Sincronización entre dispositivos', - 'AccessMultiple' : 'Acceda a sus alarmas desde varios dispositivos donde las alarmas se actualizan en tiempo real.', - 'Your privacy' : 'Tu privacidad', - 'NoAccessInfo' : 'No accedemos, no usamos ni vendemos ninguna información, lo cual puedes verificar inspeccionando el código fuente.', - 'LimitedAccess' : 'Todo el acceso está limitado exclusivamente para proporcionar las funcionalidades descritas anteriormente.', - 'Enable Light Mode' : 'Habilitar modo claro', + 'Enable 24 Hour Format': 'Habilitar formato de 24 horas', + 'Enable Haptic Feedback': 'Habilitar retroalimentación háptica', + 'Enable Sorted Alarm List': 'Habilitar lista de alarmas ordenada', + // google_sign_in.dart + 'Your account is now linked!': '¡Su cuenta ahora está vinculada!', + 'Are you sure?': '¿Estás seguro?', + 'unlinkAccount': + '¿Seguro que quieres desvincular tu cuenta de Google?', + 'Unlink': 'Desvincular', + 'Sign-In with Google': 'Iniciar sesión con Google', + 'Unlink @usermail': 'Desvincular @usermail', + 'Why do I have to sign in with Google?': + '¿Por qué tengo que iniciar sesión con Google?', + 'Sign-inDescription': + 'Iniciar sesión es opcional. Solo es necesario para las funciones que utilizan servicios en la nube, como:', + 'CollabDescription': + 'Colabore con amigos, familiares o colegas para asegurarse de que se despierten a tiempo utilizando alarmas compartidas.', + 'Syncing Across Devices': 'Sincronización entre dispositivos', + 'AccessMultiple': + 'Acceda a sus alarmas desde varios dispositivos donde las alarmas se actualizan en tiempo real.', + 'Your privacy': 'Tu privacidad', + 'NoAccessInfo': + 'No accedemos, no usamos ni vendemos ninguna información, lo cual puedes verificar inspeccionando el código fuente.', + 'LimitedAccess': + 'Todo el acceso está limitado exclusivamente para proporcionar las funcionalidades descritas anteriormente.', + 'Enable Light Mode': 'Habilitar modo claro', - 'No upcoming alarms!' : '¡No hay alarmas próximas!', - 'Next alarm' : 'Próxima alarma', - 'Show Motivational Quote' : 'Mostrar cita motivadora', - //home_view.dart - 'About' : 'Acerca de', - 'Settings' : 'Configuración', - 'v0.5.0' : 'v0.5.0', - 'Ultimate Alarm Clock' : 'Reloj Despertador Definitivo', - 'Create alarm' : 'Crear alarma', - 'Join alarm' : 'Unirse a alarma', - 'Okay' : 'Aceptar', - 'You cannot join your own alarm!' : '¡No puedes unirte a tu propia alarma!', - 'An alarm with this ID doesn\'t exist!' : '¡Una alarma con este ID no existe!', - 'Error!' : '¡Error!', - 'Join' : 'Unirse', - 'Enter Alarm ID' : 'Ingresar ID de alarma', - 'Join an alarm' : 'Unirse a una alarma', - 'Select alarms to delete' : 'Seleccionar alarmas para eliminar', - 'No alarm selected' : 'Ninguna alarma seleccionada', - '1 alarm selected' : '1 alarma seleccionada', - ' alarms selected' : ' alarmas seleccionadas', - 'Add an alarm to get started!' : '¡Añade una alarma para empezar!', - 'Never' : 'Nunca', - 'One Time' : 'Una vez', - 'Preview Alarm' : 'Vista previa de alarma', - 'Delete Alarm' : 'Eliminar alarma', - //about_view.dart texts - 'This project was originally developed as part of Google Summer of code under the CCExtractor organization. It\'s free, the source code is available, and we encourage programmers to contribute' : 'Este proyecto fue desarrollado originalmente como parte del Google Summer of Code bajo la organización CCExtractor. Es gratuito, el código fuente está disponible y animamos a los programadores a contribuir.', - 'Could not launch' : 'No se pudo iniciar', + 'No upcoming alarms!': '¡No hay alarmas próximas!', + 'Next alarm': 'Próxima alarma', + 'Show Motivational Quote': 'Mostrar cita motivadora', + //home_view.dart + 'About': 'Acerca de', + 'Settings': 'Configuración', + 'v0.5.0': 'v0.5.0', + 'Ultimate Alarm Clock': 'Reloj Despertador Definitivo', + 'Create alarm': 'Crear alarma', + 'Join alarm': 'Unirse a alarma', + 'Okay': 'Aceptar', + 'You cannot join your own alarm!': + '¡No puedes unirte a tu propia alarma!', + 'An alarm with this ID doesn\'t exist!': + '¡Una alarma con este ID no existe!', + 'Error!': '¡Error!', + 'Join': 'Unirse', + 'Enter Alarm ID': 'Ingresar ID de alarma', + 'Join an alarm': 'Unirse a una alarma', + 'Select alarms to delete': 'Seleccionar alarmas para eliminar', + 'No alarm selected': 'Ninguna alarma seleccionada', + '1 alarm selected': '1 alarma seleccionada', + ' alarms selected': ' alarmas seleccionadas', + 'Add an alarm to get started!': '¡Añade una alarma para empezar!', + 'Never': 'Nunca', + 'One Time': 'Una vez', + 'Preview Alarm': 'Vista previa de alarma', + 'Delete Alarm': 'Eliminar alarma', + //about_view.dart texts + 'This project was originally developed as part of Google Summer of code under the CCExtractor organization. It\'s free, the source code is available, and we encourage programmers to contribute': + 'Este proyecto fue desarrollado originalmente como parte del Google Summer of Code bajo la organización CCExtractor. Es gratuito, el código fuente está disponible y animamos a los programadores a contribuir.', + 'Could not launch': 'No se pudo iniciar', //add_or_update_alarm_view.dart - 'Discard Changes?' : '¿Descartar cambios?', - 'unsavedChanges' : 'Tiene cambios no guardados. ¿Está seguro de que desea salir de esta página?', - 'Cancel' : 'Cancelar', - 'Leave' : 'Salir', - 'Save' : 'Guardar', - 'Update' : 'Actualizar', - 'Rings in @timeToAlarm' : 'Suena en @timeToAlarm', - 'Uh-oh!' : '¡Ay!', - 'alarmEditing' : '¡Esta alarma se está editando actualmente!', - 'Go back' : 'Volver', - 'Automatic Cancellation' : 'Cancelación automática', - 'Challenges' : 'Desafíos', - 'Shared Alarm' : 'Alarma compartida', + 'Discard Changes?': '¿Descartar cambios?', + 'unsavedChanges': + 'Tiene cambios no guardados. ¿Está seguro de que desea salir de esta página?', + 'Cancel': 'Cancelar', + 'Leave': 'Salir', + 'Save': 'Guardar', + 'Update': 'Actualizar', + 'Rings in @timeToAlarm': 'Suena en @timeToAlarm', + 'Uh-oh!': '¡Ay!', + 'alarmEditing': '¡Esta alarma se está editando actualmente!', + 'Go back': 'Volver', + 'Automatic Cancellation': 'Cancelación automática', + 'Challenges': 'Desafíos', + 'Shared Alarm': 'Alarma compartida', //alarm_id_tile.dart - 'Success!' : '¡Éxito!', - 'Alarm ID has been copied!' : '¡Se ha copiado el ID de la alarma!', - 'Alarm ID' : 'ID de la alarma', - 'Disabled!' : '¡Desactivado!', - 'toCopyAlarm' : 'Para copiar el ID de la alarma, debes habilitar la alarma compartida!', - 'Choose duration' : 'Elegir duración', - 'minutes' : 'minutos', - 'minute' : 'minuto', - 'Before' : 'Antes', - 'After' : 'Después', - 'Ring before / after ' : 'Sonar antes / después ', - 'Enabled' : 'Habilitado', - 'Off' : 'Apagado', + 'Success!': '¡Éxito!', + 'Alarm ID has been copied!': '¡Se ha copiado el ID de la alarma!', + 'Alarm ID': 'ID de la alarma', + 'Disabled!': '¡Desactivado!', + 'toCopyAlarm': + 'Para copiar el ID de la alarma, debes habilitar la alarma compartida!', + 'Choose duration': 'Elegir duración', + 'minutes': 'minutos', + 'minute': 'minuto', + 'Before': 'Antes', + 'After': 'Después', + 'Ring before / after ': 'Sonar antes / después ', + 'Enabled': 'Habilitado', + 'Off': 'Apagado', //choose_ringtone_tile.dart - 'Choose Ringtone' : 'Elegir tono de llamada', - 'Default' : 'Predeterminado', - 'Upload Ringtone' : 'Subir tono de llamada', - 'Done' : 'Hecho', + 'Choose Ringtone': 'Elegir tono de llamada', + 'Default': 'Predeterminado', + 'Upload Ringtone': 'Subir tono de llamada', + 'Done': 'Hecho', //label_tile.dart - 'Label' : 'Etiqueta', - 'Enter a name' : 'Ingrese un nombre', - 'Note' : 'Nota', - 'noWhitespace' : 'Por favor, no ingrese espacios en blanco como primer carácter!', + 'Label': 'Etiqueta', + 'Enter a name': 'Ingrese un nombre', + 'Note': 'Nota', + 'noWhitespace': + 'Por favor, no ingrese espacios en blanco como primer carácter!', //maths_challenge_tile.dart - 'Maths' : 'Matemáticas', - 'Math problems' : 'Problemas matemáticos', - 'mathDescription' : 'Deberá resolver problemas matemáticos simples del nivel de dificultad elegido para desactivar la alarma.', - 'Solve Maths questions' : 'Resolver preguntas de matemáticas', - 'questions' : 'preguntas', - 'question' : 'pregunta', + 'Maths': 'Matemáticas', + 'Math problems': 'Problemas matemáticos', + 'mathDescription': + 'Deberá resolver problemas matemáticos simples del nivel de dificultad elegido para desactivar la alarma.', + 'Solve Maths questions': 'Resolver preguntas de matemáticas', + 'questions': 'preguntas', + 'question': 'pregunta', //note.dart - 'Enter a note' : 'Ingrese una nota', + 'Enter a note': 'Ingrese una nota', // qr_bar_code_tile.dart - 'QR/Bar Code' : 'Código QR/Código de barras', - 'qrDescription' : 'Escanee el código QR/código de barras en cualquier objeto, como un libro, y muévalo a una habitación diferente. Para desactivar la alarma, simplemente vuelva a escanear el mismo código QR/código de barras.', + 'QR/Bar Code': 'Código QR/Código de barras', + 'qrDescription': + 'Escanee el código QR/código de barras en cualquier objeto, como un libro, y muévalo a una habitación diferente. Para desactivar la alarma, simplemente vuelva a escanear el mismo código QR/código de barras.', //repeat_once_tile.dart - 'Repeat only once' : 'Repetir solo una vez', + 'Repeat only once': 'Repetir solo una vez', //repeat_tile.dart - 'Repeat' : 'Repetir', - 'Days of the week' : 'Días de la semana', - 'Monday' : 'Lunes', 'Tuesday' : 'Martes', 'Wednesday' : 'Miércoles', - 'Thursday' : 'Jueves', 'Friday' : 'Viernes', 'Saturday' : 'Sábado', - 'Sunday' : 'Domingo', + 'Repeat': 'Repetir', + 'Days of the week': 'Días de la semana', + 'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles', + 'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', + 'Sunday': 'Domingo', //screen_activity_tile.dart - 'Timeout Duration' : 'Duración de tiempo de espera', - 'Screen Activity' : 'Actividad de la pantalla', - 'Screen activity based cancellation' : 'Cancelación basada en la actividad de la pantalla', - 'screenDescription' : 'Esta función cancelará automáticamente la alarma si ha estado utilizando su dispositivo durante un número determinado de minutos.', + 'Timeout Duration': 'Duración de tiempo de espera', + 'Screen Activity': 'Actividad de la pantalla', + 'Screen activity based cancellation': + 'Cancelación basada en la actividad de la pantalla', + 'screenDescription': + 'Esta función cancelará automáticamente la alarma si ha estado utilizando su dispositivo durante un número determinado de minutos.', //shake_to_dismiss_tile.dart - 'Shake to dismiss' : 'Agitar para descartar', - 'shakeDescription' : 'Tendrá que agitar su teléfono un número determinado de veces para descartar la alarma, ¡nada de posponer perezosamente :)', - 'Number of shakes' : 'Número de sacudidas', - 'times' : 'veces', - 'time' : 'vez', + 'Shake to dismiss': 'Agitar para descartar', + 'shakeDescription': + 'Tendrá que agitar su teléfono un número determinado de veces para descartar la alarma, ¡nada de posponer perezosamente :)', + 'Number of shakes': 'Número de sacudidas', + 'times': 'veces', + 'time': 'vez', //'shared_alarm_tile.dart - 'Shared Alarm' : 'Alarma compartida', - 'Shared alarms' : 'Alarmas compartidas', - 'sharedDescription' : 'Comparta alarmas con otros utilizando el ID de la alarma. Cada usuario compartido puede elegir hacer sonar su alarma antes o después del tiempo establecido.', - 'Understood' : 'Entendido', - 'To use this feature, you have to link your Google account!' : 'Para usar esta función, debe vincular su cuenta de Google!', - 'Go to settings' : 'Ir a configuración', - 'Enable Shared Alarm' : 'Habilitar alarma compartida', + 'Shared Alarm': 'Alarma compartida', + 'Shared alarms': 'Alarmas compartidas', + 'sharedDescription': + 'Comparta alarmas con otros utilizando el ID de la alarma. Cada usuario compartido puede elegir hacer sonar su alarma antes o después del tiempo establecido.', + 'Understood': 'Entendido', + 'To use this feature, you have to link your Google account!': + 'Para usar esta función, debe vincular su cuenta de Google!', + 'Go to settings': 'Ir a configuración', + 'Enable Shared Alarm': 'Habilitar alarma compartida', //shared_users_tile.dart - 'Alarm Owner' : 'Propietario de la alarma', - 'Shared Users' : 'Usuarios compartidos', - 'No shared users!' : '¡No hay usuarios compartidos!', - 'Remove' : 'Eliminar', - 'Select duration' : 'Seleccionar duración', + 'Alarm Owner': 'Propietario de la alarma', + 'Shared Users': 'Usuarios compartidos', + 'No shared users!': '¡No hay usuarios compartidos!', + 'Remove': 'Eliminar', + 'Select duration': 'Seleccionar duración', //snooze_duration_tile.dart - 'Snooze Duration' : 'Duración de la siesta', + 'Snooze Duration': 'Duración de la siesta', //weather_tile.dart - 'Select weather types' : 'Seleccionar tipos de clima', - 'Sunny' : 'Soleado', - 'Cloudy' : 'Nublado', - 'Rainy' : 'Lluvioso', - 'Windy' : 'Ventoso', - 'Stormy' : 'Tormentoso', - 'Weather Condition' : 'Condición meteorológica', - 'Weather based cancellation' : 'Cancelación basada en el clima', - 'weatherDescription' : 'Esta función cancelará automáticamente la alarma si el clima actual coincide con las condiciones climáticas elegidas, ¡permitiéndote dormir mejor!', - 'To use this feature, you have to add an OpenWeatherMap API key!' : 'Para usar esta función, debe agregar una clave API de OpenWeatherMap!', + 'Select weather types': 'Seleccionar tipos de clima', + 'Sunny': 'Soleado', + 'Cloudy': 'Nublado', + 'Rainy': 'Lluvioso', + 'Windy': 'Ventoso', + 'Stormy': 'Tormentoso', + 'Weather Condition': 'Condición meteorológica', + 'Weather based cancellation': 'Cancelación basada en el clima', + 'weatherDescription': + 'Esta función cancelará automáticamente la alarma si el clima actual coincide con las condiciones climáticas elegidas, ¡permitiéndote dormir mejor!', + 'To use this feature, you have to add an OpenWeatherMap API key!': + 'Para usar esta función, debe agregar una clave API de OpenWeatherMap!', //alarm_challenge_view.dart - 'Shake Challenge' : 'Desafío de agitación', - 'Maths Challenge' : 'Desafío de matemáticas', - 'QR/Bar Code Challenge' : 'Desafío de código QR/código de barras', + 'Shake Challenge': 'Desafío de agitación', + 'Maths Challenge': 'Desafío de matemáticas', + 'QR/Bar Code Challenge': 'Desafío de código QR/código de barras', //maths_challenge_view.dart - 'Question @noMathQ' : 'Pregunta @noMathQ', + 'Question @noMathQ': 'Pregunta @noMathQ', //qr_challenge_view.dart - 'Scan your QR/Bar Code!' : '¡Escanee su código QR/código de barras!', - 'Wrong Code Scanned!' : '¡Código incorrecto escaneado!', - 'Retake' : 'Repetir', + 'Scan your QR/Bar Code!': '¡Escanee su código QR/código de barras!', + 'Wrong Code Scanned!': '¡Código incorrecto escaneado!', + 'Retake': 'Repetir', //shake_challenge_view.dart - 'Shake your phone!' : '¡Agita tu teléfono!', + 'Shake your phone!': '¡Agita tu teléfono!', //alarm_ring_view.dart - "You can't go back while the alarm is ringing" : "No puedes retroceder mientras suena la alarma", - 'Start Challenge' : 'Comenzar el desafío', - 'Dismiss' : 'Descartar', - 'Exit Preview' : 'Salir de la vista previa', - 'Snooze' : 'Siesta', - //utils.dart - 'Location Based': 'Basado en la ubicación', - 'Everyday': 'Todos los días', - 'Weekdays': 'Días laborables', - 'Weekends': 'Fines de semana', - 'Mon': 'Lun', 'Tue': 'Mar', 'Wed': 'Mié', 'Thur': 'Jue', - 'Fri': 'Vie', 'Sat': 'Sáb', 'Sun': 'Dom', - //OpenWeatherMap - 'onenweathermap_title1.1': 'Pasos para conseguir ', - 'onenweathermap_title1.2': 'OpenWeatherMap API', - 'step1.1':'Ir a ', - 'step1.2':'openweathermap.org', - 'step1.3':', haga clic en el botón ', - 'step1.4':'SignIn', - 'step1.5':' (esquina superior derecha) luego solicita las credenciales de inicio de sesión.', - 'step2.1':'Si ya tiene una cuenta, ingrese sus credenciales. De lo contrario, haga clic en la opción ', - 'step2.2':'Create an Account', - 'step2.3':'. Le pide que ingrese su nombre de usuario, correo electrónico y contraseña. Asegúrate de que los detalles sean correctos.', - 'step3':'Una vez que su cuenta esté lista, se le dirigirá automáticamente a la página de OpenWeather. Te pregunta sobre tu empresa y el propósito de uso de la plataforma, complete estos detalles en consecuencia.', - 'step4.1':'Haga clic en su ', - 'step4.2':'Username', - 'step4.3':'(esquina superior derecha). Aparece un menú desplegable. Haga clic en la opción ', - 'step4.4':'My API', - 'step4.5':'.', - 'step5':'Ahora tienes la API. Seleccione la API y cópiela.', - }, - }; + //utils.dart + 'Location Based': 'Basado en la ubicación', + 'Everyday': 'Todos los días', + 'Weekdays': 'Días laborables', + 'Weekends': 'Fines de semana', + 'Mon': 'Lun', 'Tue': 'Mar', 'Wed': 'Mié', 'Thur': 'Jue', + 'Fri': 'Vie', 'Sat': 'Sáb', 'Sun': 'Dom', + //OpenWeatherMap + 'onenweathermap_title1.1': 'Pasos para conseguir ', + 'onenweathermap_title1.2': 'OpenWeatherMap API', + 'step1.1': 'Ir a ', + 'step1.2': 'openweathermap.org', + 'step1.3': ', haga clic en el botón ', + 'step1.4': 'SignIn', + 'step1.5': + ' (esquina superior derecha) luego solicita las credenciales de inicio de sesión.', + 'step2.1': + 'Si ya tiene una cuenta, ingrese sus credenciales. De lo contrario, haga clic en la opción ', + 'step2.2': 'Create an Account', + 'step2.3': + '. Le pide que ingrese su nombre de usuario, correo electrónico y contraseña. Asegúrate de que los detalles sean correctos.', + 'step3': + 'Una vez que su cuenta esté lista, se le dirigirá automáticamente a la página de OpenWeather. Te pregunta sobre tu empresa y el propósito de uso de la plataforma, complete estos detalles en consecuencia.', + 'step4.1': 'Haga clic en su ', + 'step4.2': 'Username', + 'step4.3': + '(esquina superior derecha). Aparece un menú desplegable. Haga clic en la opción ', + 'step4.4': 'My API', + 'step4.5': '.', + 'step5': 'Ahora tienes la API. Seleccione la API y cópiela.', + //ascending_volume.dart + 'Volume will reach maximum in': 'El volumen alcanzará el máximo en', + 'seconds': 'segundos', + 'Adjust the volume range:': 'Ajustar el rango de volumen:', + 'Apply Gradient': 'Aplicar degradado', + 'Ascending Volume': 'Volumen ascendente', + }, + }; } diff --git a/lib/app/utils/utils.dart b/lib/app/utils/utils.dart index 6261467c..7a47df6c 100644 --- a/lib/app/utils/utils.dart +++ b/lib/app/utils/utils.dart @@ -254,7 +254,15 @@ class Utils { } static String getRepeatDays(List days) { - List dayAbbreviations = ['Mon'.tr, 'Tue'.tr, 'Wed'.tr, 'Thur'.tr, 'Fri'.tr, 'Sat'.tr, 'Sun'.tr]; + List dayAbbreviations = [ + 'Mon'.tr, + 'Tue'.tr, + 'Wed'.tr, + 'Thur'.tr, + 'Fri'.tr, + 'Sat'.tr, + 'Sun'.tr + ]; int weekdayCount = 0; int weekendCount = 0; List selectedDays = []; @@ -343,7 +351,10 @@ class Utils { // Utility function to create a dummy model to pass to functions static AlarmModel genFakeAlarmModel() { return AlarmModel( + volMax: 1.0, + volMin: 0.0, snoozeDuration: 0, + gradient: 1, label: '', isOneTime: false, deleteAfterGoesOff: false, diff --git a/pubspec.lock b/pubspec.lock index ce347e3c..30c08712 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: archive - sha256: "7b875fd4a20b165a3084bd2d210439b22ebc653f21cea4842729c0c30c82596b" + sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" url: "https://pub.dev" source: hosted - version: "3.4.9" + version: "3.4.10" args: dependency: transitive description: @@ -165,10 +165,10 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "67d591d602906ef9201caf93452495ad1812bea2074f04e25dbd7c133785821b" + sha256: "581bacf68f89ec8792f5e5a0b2c4decd1c948e97ce659dc783688c8a88fbec21" url: "https://pub.dev" source: hosted - version: "2.4.7" + version: "2.4.8" build_runner_core: dependency: transitive description: @@ -221,34 +221,34 @@ packages: dependency: "direct main" description: name: cloud_firestore - sha256: cb978c7512624144f24f3d06e4312b2f4ac00b016f2fed62dc8f6d56b8585d78 + sha256: "8bfbb5a2edbc6052452326d60de0113fea2bcbf081d34a3f8e45c8b38307b31c" url: "https://pub.dev" source: hosted - version: "4.13.6" + version: "4.14.0" cloud_firestore_platform_interface: dependency: transitive description: name: cloud_firestore_platform_interface - sha256: fa177fa85f7665c76e1ebec252a5b280b4b47612b4d70fe286944814fff1d4f2 + sha256: "73ff438fe46028f0e19f55da18b6ddc6906ab750562cd7d9ffab77ff8c0c4307" url: "https://pub.dev" source: hosted - version: "6.0.10" + version: "6.1.0" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web - sha256: d0ebbf0927e627c0d7d2f3177d3b6f0050e5d811c08c2b646b0c746a2b502cb7 + sha256: "232e45e95970d3a6baab8f50f9c3a6e2838d145d9d91ec9a7392837c44296397" url: "https://pub.dev" source: hosted - version: "3.8.10" + version: "3.9.0" code_builder: dependency: transitive description: name: code_builder - sha256: feee43a5c05e7b3199bb375a86430b8ada1b04104f2923d0e03cc01ca87b6d84 + sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 url: "https://pub.dev" source: hosted - version: "4.9.0" + version: "4.10.0" collection: dependency: transitive description: @@ -450,10 +450,10 @@ packages: dependency: "direct main" description: name: flutter_native_splash - sha256: "141b20f15a2c4fe6e33c49257ca1bc114fc5c500b04fcbc8d75016bb86af672f" + sha256: "9cdb5d9665dab5d098dc50feab74301c2c228cd02ca25c9b546ab572cebcd6af" url: "https://pub.dev" source: hosted - version: "2.3.8" + version: "2.3.9" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -531,6 +531,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + flutter_volume_controller: + dependency: "direct main" + description: + name: flutter_volume_controller + sha256: "0f10cc759499cb6c3e152a8f6ff8e5ce385b99db7e1f586d1a29d8e6c11f4082" + url: "https://pub.dev" + source: hosted + version: "1.3.1" flutter_web_plugins: dependency: transitive description: flutter @@ -596,34 +604,34 @@ packages: dependency: transitive description: name: google_sign_in_android - sha256: "6031f59074a337fdd81be821aba84cee3a41338c6e958499a5cd34d3e1db80ef" + sha256: bfd42c81c30c6faba16e0f62968d5505a87504aaa672b3155ee931461abb0a49 url: "https://pub.dev" source: hosted - version: "6.1.20" + version: "6.1.21" google_sign_in_ios: dependency: transitive description: name: google_sign_in_ios - sha256: "0822b0abc94ff6d705d7a321ef58818ffed864787f23f5ac3451e3e6afbcf90d" + sha256: f3336d9e44d4d28063ac90271f6db5caf99f0480cb07281330e7a432edb95226 url: "https://pub.dev" source: hosted - version: "5.7.1" + version: "5.7.3" google_sign_in_platform_interface: dependency: transitive description: name: google_sign_in_platform_interface - sha256: e10eaaa30a0cb03af12dd324fb2e630ac7e9d854d0530f7a87a4d825031f9a4a + sha256: "1f6e5787d7a120cc0359ddf315c92309069171306242e181c09472d1b00a2971" url: "https://pub.dev" source: hosted - version: "2.4.3" + version: "2.4.5" google_sign_in_web: dependency: transitive description: name: google_sign_in_web - sha256: "38e6ec2a7d65ec34bb7ae2db64a1d042b021330433b999e87330d45c688ff549" + sha256: a278ea2d01013faf341cbb093da880d0f2a552bbd1cb6ee90b5bebac9ba69d77 url: "https://pub.dev" source: hosted - version: "0.12.3+1" + version: "0.12.3+2" graphs: dependency: transitive description: @@ -668,10 +676,10 @@ packages: dependency: transitive description: name: image - sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" + sha256: "004a2e90ce080f8627b5a04aecb4cdfac87d2c3f3b520aa291260be5a32c033d" url: "https://pub.dev" source: hosted - version: "4.1.3" + version: "4.1.4" infinite_listview: dependency: transitive description: @@ -812,10 +820,10 @@ packages: dependency: "direct main" description: name: mobile_scanner - sha256: c3e5bba1cb626b6ab4fc46610f72a136803f6854267967e19f4a4a6a31ff9b74 + sha256: "190506c3b0cf8a5a3c11e83de8c4f5ef4b6025a06c67d425a03f08129abf20d0" url: "https://pub.dev" source: hosted - version: "3.5.5" + version: "3.5.6" numberpicker: dependency: "direct main" description: @@ -852,10 +860,10 @@ packages: dependency: "direct main" description: name: path_provider - sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa + sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" path_provider_android: dependency: transitive description: @@ -868,10 +876,10 @@ packages: dependency: transitive description: name: path_provider_foundation - sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d" + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" path_provider_linux: dependency: transitive description: @@ -884,10 +892,10 @@ packages: dependency: transitive description: name: path_provider_platform_interface - sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" path_provider_windows: dependency: transitive description: @@ -908,50 +916,50 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: "860c6b871c94c78e202dc69546d4d8fd84bd59faeb36f8fb9888668a53ff4f78" + sha256: "45ff3fbcb99040fde55c528d5e3e6ca29171298a85436274d49c6201002087d6" url: "https://pub.dev" source: hosted - version: "11.1.0" + version: "11.2.0" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: "2f1bec180ee2f5665c22faada971a8f024761f632e93ddc23310487df52dcfa6" + sha256: "758284a0976772f9c744d6384fc5dc4834aa61e3f7aa40492927f244767374eb" url: "https://pub.dev" source: hosted - version: "12.0.1" + version: "12.0.3" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: "1a816084338ada8d574b1cb48390e6e8b19305d5120fe3a37c98825bacc78306" + sha256: c6bf440f80acd2a873d3d91a699e4cc770f86e7e6b576dda98759e8b92b39830 url: "https://pub.dev" source: hosted - version: "9.2.0" + version: "9.3.0" permission_handler_html: dependency: transitive description: name: permission_handler_html - sha256: "11b762a8c123dced6461933a88ea1edbbe036078c3f9f41b08886e678e7864df" + sha256: "54bf176b90f6eddd4ece307e2c06cf977fb3973719c35a93b85cc7093eb6070d" url: "https://pub.dev" source: hosted - version: "0.1.0+2" + version: "0.1.1" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - sha256: d87349312f7eaf6ce0adaf668daf700ac5b06af84338bd8b8574dfbd93ffe1a1 + sha256: "5c43148f2bfb6d14c5a8162c0a712afe891f2d847f35fcff29c406b37da43c3c" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.1.0" permission_handler_windows: dependency: transitive description: name: permission_handler_windows - sha256: "1e8640c1e39121128da6b816d236e714d2cf17fac5a105dd6acdd3403a628004" + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.2.1" petitparser: dependency: transitive description: @@ -964,26 +972,26 @@ packages: dependency: transitive description: name: platform - sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "3.1.4" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: f4f88d4a900933e7267e2b353594774fc0d07fb072b47eedcd5b54e1ea3269f8 + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" url: "https://pub.dev" source: hosted - version: "2.1.7" + version: "2.1.8" pointycastle: dependency: transitive description: name: pointycastle - sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" + sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29" url: "https://pub.dev" source: hosted - version: "3.7.3" + version: "3.7.4" polylabel: dependency: transitive description: @@ -1177,10 +1185,10 @@ packages: dependency: transitive description: name: time - sha256: "83427e11d9072e038364a5e4da559e85869b227cf699a541be0da74f14140124" + sha256: ad8e018a6c9db36cb917a031853a1aae49467a93e0d464683e029537d848c221 url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" timing: dependency: transitive description: @@ -1225,26 +1233,26 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: e9aa5ea75c84cf46b3db4eea212523591211c3cf2e13099ee4ec147f54201c86 + sha256: d25bb0ca00432a5e1ee40e69c36c85863addf7cc45e433769d61bed3fe81fd96 url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.2.3" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" + sha256: "507dc655b1d9cb5ebc756032eb785f114e415f91557b73bf60b7e201dfedeb2f" url: "https://pub.dev" source: hosted - version: "6.2.0" + version: "6.2.2" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: bba3373219b7abb6b5e0d071b0fe66dfbe005d07517a68e38d4fc3638f35c6d3 + sha256: "75bb6fe3f60070407704282a2d295630cab232991eb52542b18347a8a941df03" url: "https://pub.dev" source: hosted - version: "6.2.1" + version: "6.2.4" url_launcher_linux: dependency: transitive description: @@ -1265,18 +1273,18 @@ packages: dependency: transitive description: name: url_launcher_platform_interface - sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" + sha256: a932c3a8082e118f80a475ce692fde89dc20fddb24c57360b96bc56f7035de1f url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.1" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "7286aec002c8feecc338cc33269e96b73955ab227456e9fb2a91f7fab8a358e9" + sha256: fff0932192afeedf63cdd50ecbb1bc825d31aed259f02bb8dba0f3b729a5e88b url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.3" url_launcher_windows: dependency: transitive description: @@ -1297,26 +1305,26 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "0f0c746dd2d6254a0057218ff980fc7f5670fd0fcf5e4db38a490d31eed4ad43" + sha256: "18f6690295af52d081f6808f2f7c69f0eed6d7e23a71539d75f4aeb8f0062172" url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.9+2" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: "0edf6d630d1bfd5589114138ed8fada3234deacc37966bec033d3047c29248b7" + sha256: "531d20465c10dfac7f5cd90b60bbe4dd9921f1ec4ca54c83ebb176dbacb7bb2d" url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.9+2" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: d24333727332d9bd20990f1483af4e09abdb9b1fc7c3db940b56ab5c42790c26 + sha256: "03012b0a33775c5530576b70240308080e1d5050f0faf000118c20e6463bc0ad" url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.9+2" vector_math: dependency: transitive description: @@ -1369,10 +1377,10 @@ packages: dependency: transitive description: name: win32 - sha256: b0f37db61ba2f2e9b7a78a1caece0052564d1bc70668156cf3a29d676fe4e574 + sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "5.2.0" win32_registry: dependency: transitive description: @@ -1393,10 +1401,10 @@ packages: dependency: transitive description: name: xdg_directories - sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2" + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" xml: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 9809ca66..a60c13b9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -44,6 +44,7 @@ dependencies: audio_session: ^0.1.18 uuid: ^4.3.3 pedometer: ^4.0.1 + flutter_volume_controller: ^1.3.1 dev_dependencies: flutter_lints: ^2.0.3